X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=utils.c;h=71fe009076b16390cbef5af1030603b734f25196;hb=34c0a707db7b6d8099df2a08f580792f7ebaf07e;hp=dbcaa29ea5634958058c590858141ea0412cf9e7;hpb=b0063ac38ae833b543d7301f34ed19e559f7fe49;p=rrq%2Ffuse_xattrs.git diff --git a/utils.c b/utils.c index dbcaa29..71fe009 100644 --- a/utils.c +++ b/utils.c @@ -13,11 +13,17 @@ #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; } @@ -44,20 +50,50 @@ char *sanitize_value(const char *value, size_t value_size) 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; }