#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/stat.h>
#include "utils.h"
#include "fuse_xattrs_config.h"
+#include "xattrs_config.h"
-char *prepend_source_directory(const char *a, const char *b) {
- size_t len = strlen(a) + strlen(b) + 1;
- char *dst = (char*) malloc(sizeof(char) * len);
- sprintf(dst, "%s%s", a, b);
+/* TODO: re-use memory to avoid calling malloc every time */
+char *prepend_source_directory(const char *b) {
+ const size_t b_size = strlen(b);
+ const size_t dst_len = xattrs_config.source_dir_size + b_size + 1;
+ char *dst = (char*) malloc(sizeof(char) * dst_len);
+
+ memcpy(dst, xattrs_config.source_dir, xattrs_config.source_dir_size);
+ memcpy(dst+xattrs_config.source_dir_size, b, b_size + 1); // include '\0'
+ //sprintf(dst, "%s%s", a, b);
return dst;
}
+int is_directory(const char *path) {
+ struct stat statbuf;
+ if (stat(path, &statbuf) != 0) {
+ fprintf(stderr, "cannot get source directory status: %s\n", path);
+ return -1;
+ }
+
+ if (!S_ISDIR(statbuf.st_mode)) {
+ fprintf(stderr, "source directory must be a directory: %s\n", path);
+ return -1;
+ }
+
+ return 1;
+}
+
+int is_regular_file(const char *path) {
+ struct stat statbuf;
+ if (stat(path, &statbuf) != 0) {
+ return -1;
+ }
+
+ if (!S_ISREG(statbuf.st_mode)) {
+ return -1;
+ }
+
+ return 1;
+}
+
char *get_sidecar_path(const char *path)
{
const size_t path_len = strlen(path);
return sanitized;
}
+
+const size_t BINARY_SIDECAR_EXT_SIZE = strlen(BINARY_SIDECAR_EXT);
+
+const int filename_is_sidecar(const char *string) {
+ if(string == NULL)
+ return 0;
+
+ size_t size = strlen(string);
+ if (size <= BINARY_SIDECAR_EXT_SIZE)
+ return 0;
+
+ if (memcmp(string+size-BINARY_SIDECAR_EXT_SIZE, BINARY_SIDECAR_EXT, BINARY_SIDECAR_EXT_SIZE) == 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+#define USER_NAMESPACE "user."
+#define SYSTEM_NAMESPACE "system."
+#define SECURITY_NAMESPACE "security."
+#define TRUSTED_NAMESPACE "trusted."
+
+const size_t USER_NAMESPACE_SIZE = strlen(USER_NAMESPACE);
+const size_t SYSTEM_NAMESPACE_SIZE = strlen(SYSTEM_NAMESPACE);
+const size_t SECURITY_NAMESPACE_SIZE = strlen(SECURITY_NAMESPACE);
+const size_t THRUSTED_NAMESPACE_SIZE = strlen(TRUSTED_NAMESPACE);
+
enum namespace get_namespace(const char *name) {
- if (strncmp(name, "user.", strlen("user.")) == 0) {
+ size_t name_size = strlen(name);
+
+ if (name_size > USER_NAMESPACE_SIZE && memcmp(name, USER_NAMESPACE, USER_NAMESPACE_SIZE) == 0) {
return USER;
}
- if (strncmp(name, "system.", strlen("system.")) == 0) {
+ if (name_size > SYSTEM_NAMESPACE_SIZE && memcmp(name, SYSTEM_NAMESPACE, SYSTEM_NAMESPACE_SIZE) == 0) {
return SYSTEM;
}
- if (strncmp(name, "security.", strlen("security.")) == 0) {
+ if (name_size > SECURITY_NAMESPACE_SIZE && memcmp(name, SECURITY_NAMESPACE, SECURITY_NAMESPACE_SIZE) == 0) {
return SECURITY;
}
- if (strncmp(name, "trusted.", strlen("trusted.")) == 0) {
+ if (name_size > THRUSTED_NAMESPACE_SIZE && memcmp(name, TRUSTED_NAMESPACE, THRUSTED_NAMESPACE_SIZE) == 0) {
return TRUSTED;
}