71 |
71 |
72 static char ** parse_xattrlist(char *buf, ssize_t length, ssize_t *nelm) { |
72 static char ** parse_xattrlist(char *buf, ssize_t length, ssize_t *nelm) { |
73 size_t arraylen = LIST_ARRAY_LEN; |
73 size_t arraylen = LIST_ARRAY_LEN; |
74 size_t arraypos = 0; |
74 size_t arraypos = 0; |
75 char **array = malloc(LIST_ARRAY_LEN * sizeof(char*)); |
75 char **array = malloc(LIST_ARRAY_LEN * sizeof(char*)); |
|
76 if(!array) { |
|
77 *nelm = -1; |
|
78 return NULL; |
|
79 } |
76 |
80 |
77 char *begin = buf; |
81 char *begin = buf; |
78 char *name = NULL; |
82 char *name = NULL; |
79 for(int i=0;i<length;i++) { |
83 for(int i=0;i<length;i++) { |
80 if(!name && buf[i] == '.') { |
84 if(!name && buf[i] == '.') { |
81 name = buf + i + 1; |
85 name = buf + i + 1; |
82 } |
86 } |
83 if(buf[i] == '\0') { |
87 if(buf[i] == '\0') { |
84 char *attrname = strdup(name); |
88 char *attrname = strdup(name); |
|
89 if(!attrname) { |
|
90 strarray_free(array, arraypos); |
|
91 *nelm = -1; |
|
92 return NULL; |
|
93 } |
85 if(strarray_add(&array, &arraypos, &arraylen, attrname)) { |
94 if(strarray_add(&array, &arraypos, &arraylen, attrname)) { |
86 strarray_free(array, arraypos); |
95 strarray_free(array, arraypos); |
87 *nelm = -1; |
96 *nelm = -1; |
88 return NULL; |
97 return NULL; |
89 } |
98 } |
144 |
153 |
145 static char* name2nsname(const char *name) { |
154 static char* name2nsname(const char *name) { |
146 // add the 'user' namespace to the name |
155 // add the 'user' namespace to the name |
147 size_t namelen = strlen(name); |
156 size_t namelen = strlen(name); |
148 char *attrname = malloc(8 + namelen); |
157 char *attrname = malloc(8 + namelen); |
|
158 if(!attrname) { |
|
159 return NULL; |
|
160 } |
149 memcpy(attrname, "user.", 5); |
161 memcpy(attrname, "user.", 5); |
150 memcpy(attrname+5, name, namelen + 1); |
162 memcpy(attrname+5, name, namelen + 1); |
151 return attrname; |
163 return attrname; |
152 } |
164 } |
153 |
165 |
154 char * xattr_get(const char *path, const char *attr, ssize_t *len) { |
166 char * xattr_get(const char *path, const char *attr, ssize_t *len) { |
155 char *attrname = name2nsname(attr); |
167 char *attrname = name2nsname(attr); |
|
168 if(!attrname) { |
|
169 *len = -1; |
|
170 return NULL; |
|
171 } |
156 |
172 |
157 char *buf = malloc(ATTR_BUF_LEN); |
173 char *buf = malloc(ATTR_BUF_LEN); |
158 if(!buf) { |
174 if(!buf) { |
159 *len = -1; |
175 *len = -1; |
|
176 free(attrname); |
160 return NULL; |
177 return NULL; |
161 } |
178 } |
162 ssize_t vlen = getxattr(path, attrname, buf, ATTR_BUF_LEN - 1); |
179 ssize_t vlen = getxattr(path, attrname, buf, ATTR_BUF_LEN - 1); |
163 if(vlen < 0) { |
180 if(vlen < 0) { |
164 switch(errno) { |
181 switch(errno) { |
193 return buf; |
210 return buf; |
194 } |
211 } |
195 |
212 |
196 int xattr_set(const char *path, const char *name, const void *value, size_t len) { |
213 int xattr_set(const char *path, const char *name, const void *value, size_t len) { |
197 char *attrname = name2nsname(name); |
214 char *attrname = name2nsname(name); |
|
215 if(!attrname) { |
|
216 return 1; |
|
217 } |
198 int ret = setxattr(path, attrname, value, len, 0); |
218 int ret = setxattr(path, attrname, value, len, 0); |
199 free(attrname); |
219 free(attrname); |
200 return ret; |
220 return ret; |
201 } |
221 } |
202 |
222 |
203 int xattr_remove(const char *path, const char *name) { |
223 int xattr_remove(const char *path, const char *name) { |
204 char *attrname = name2nsname(name); |
224 char *attrname = name2nsname(name); |
|
225 if(!attrname) { |
|
226 return 1; |
|
227 } |
205 int ret = removexattr(path, attrname); |
228 int ret = removexattr(path, attrname); |
206 free(attrname); |
229 free(attrname); |
207 return ret; |
230 return ret; |
208 } |
231 } |
209 |
232 |