71fe009076b16390cbef5af1030603b734f25196
[rrq/fuse_xattrs.git] / utils.c
1 /*
2   fuse_xattrs - Add xattrs support using sidecar files
3
4   Copyright (C) 2016  Felipe Barriga Richards <felipe {at} felipebarriga.cl>
5
6   This program can be distributed under the terms of the GNU GPL.
7   See the file COPYING.
8 */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 #include "utils.h"
15 #include "fuse_xattrs_config.h"
16 #include "xattrs_config.h"
17
18 /* TODO: re-use memory to avoid calling malloc every time */
19 char *prepend_source_directory(const char *b) {
20     const size_t b_size = strlen(b);
21     const size_t dst_len = xattrs_config.source_dir_size + b_size + 1;
22     char *dst = (char*) malloc(sizeof(char) * dst_len);
23
24     memcpy(dst, xattrs_config.source_dir, xattrs_config.source_dir_size);
25     memcpy(dst+xattrs_config.source_dir_size, b, b_size + 1); // include '\0'
26     //sprintf(dst, "%s%s", a, b);
27
28     return dst;
29 }
30
31 char *get_sidecar_path(const char *path)
32 {
33     const size_t path_len = strlen(path);
34     const size_t sidecar_ext_len = strlen(BINARY_SIDECAR_EXT); // this can be optimized
35     const size_t sidecar_path_len = path_len + sidecar_ext_len + 1;
36     char *sidecar_path = (char *) malloc(sidecar_path_len);
37     memset(sidecar_path, '\0', sidecar_path_len);
38     memcpy(sidecar_path, path, path_len);
39     memcpy(sidecar_path + path_len, BINARY_SIDECAR_EXT, sidecar_ext_len);
40
41     return sidecar_path;
42 }
43
44 // TODO: make it work for binary data
45 char *sanitize_value(const char *value, size_t value_size)
46 {
47     char *sanitized = malloc(value_size + 1);
48     memcpy(sanitized, value, value_size);
49     sanitized[value_size] = '\0';
50     return sanitized;
51 }
52
53
54 const size_t BINARY_SIDECAR_EXT_SIZE = strlen(BINARY_SIDECAR_EXT);
55
56 const int filename_is_sidecar(const char *string) {
57     if(string == NULL)
58         return 0;
59
60     size_t size = strlen(string);
61     if (size <= BINARY_SIDECAR_EXT_SIZE)
62         return 0;
63
64     if (memcmp(string+size-BINARY_SIDECAR_EXT_SIZE, BINARY_SIDECAR_EXT, BINARY_SIDECAR_EXT_SIZE) == 0) {
65         return 1;
66     }
67
68     return 0;
69 }
70
71 #define USER_NAMESPACE "user."
72 #define SYSTEM_NAMESPACE "system."
73 #define SECURITY_NAMESPACE "security."
74 #define TRUSTED_NAMESPACE "trusted."
75
76 const size_t USER_NAMESPACE_SIZE     = strlen(USER_NAMESPACE);
77 const size_t SYSTEM_NAMESPACE_SIZE   = strlen(SYSTEM_NAMESPACE);
78 const size_t SECURITY_NAMESPACE_SIZE = strlen(SECURITY_NAMESPACE);
79 const size_t THRUSTED_NAMESPACE_SIZE = strlen(TRUSTED_NAMESPACE);
80
81 enum namespace get_namespace(const char *name) {
82     size_t name_size = strlen(name);
83
84     if (name_size > USER_NAMESPACE_SIZE && memcmp(name, USER_NAMESPACE, USER_NAMESPACE_SIZE) == 0) {
85         return USER;
86     }
87
88     if (name_size > SYSTEM_NAMESPACE_SIZE && memcmp(name, SYSTEM_NAMESPACE, SYSTEM_NAMESPACE_SIZE) == 0) {
89         return SYSTEM;
90     }
91
92     if (name_size > SECURITY_NAMESPACE_SIZE && memcmp(name, SECURITY_NAMESPACE, SECURITY_NAMESPACE_SIZE) == 0) {
93         return SECURITY;
94     }
95
96     if (name_size > THRUSTED_NAMESPACE_SIZE && memcmp(name, TRUSTED_NAMESPACE, THRUSTED_NAMESPACE_SIZE) == 0) {
97         return TRUSTED;
98     }
99
100     error_print("invalid namespace for key: %s\n", name);
101     return ERROR;
102 }