#include <string.h>
#include <errno.h>
#include <assert.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include "binary_storage.h"
#include "utils.h"
#include "fuse_xattrs_config.h"
+#include "stringmem.h"
+#include "xattrs_config.h"
-#include <attr/xattr.h>
+#include <sys/xattr.h>
+
+#ifndef ENOATTR
+ #define ENOATTR ENODATA
+#endif
struct on_memory_attr {
u_int16_t name_size;
debug_print("value size: %zu\n", attr->value_size);
debug_print("sanitized_value: '%s'\n", sanitized_value);
debug_print("--------------\n");
- free(sanitized_value);
+ strfree(sanitized_value);
#endif
}
void __free_on_memory_attr(struct on_memory_attr *attr)
{
if(attr->name != NULL)
- free(attr->name);
+ strfree(attr->name);
if(attr->value != NULL)
- free(attr->value);
+ strfree(attr->value);
free(attr);
}
debug_print("path=%s sidecar_path=%s\n", path, sidecar_path);
char *buffer = __read_file(sidecar_path, buffer_size);
- free (sidecar_path);
+ strfree (sidecar_path);
return buffer;
}
#ifdef DEBUG
char *sanitized_value = sanitize_value(value, value_size);
- debug_print("name='%s' name_size=%zu sanitized_value='%s' value_size=%zu\n", name, name_size, sanitized_value, value_size);
- free(sanitized_value);
+ debug_print("name='%s' name_size=%hu sanitized_value='%s' value_size=%zu\n", name, name_size, sanitized_value, value_size);
+ strfree(sanitized_value);
#endif
// write name
return 0;
}
+// Ensure existence of tail path from either source_dir or sidecar_dir
+static int ensure_dirs(char *path) {
+ int n = strlen( path );
+ char *p = stralloc( n+1 );
+ memcpy( p, path, n+1 );
+ char *e = p + 1;
+ if ( strncmp( path, xattrs_config.source_dir,
+ xattrs_config.source_dir_size ) == 0 ) {
+ e += xattrs_config.source_dir_size;
+ } else if ( strncmp( path, xattrs_config.sidecar_dir,
+ xattrs_config.sidecar_dir_size ) == 0 ) {
+ e += xattrs_config.sidecar_dir_size;
+ }
+ if ( e - p >= n ) {
+ return 0;
+ }
+ for ( ;; ) {
+ while ( *e && *e != '/' ) e++;
+ if ( *e ) {
+ *e = 0;
+ if ( access( p, F_OK ) && mkdir( p, 0777 ) ) {
+ return 1;
+ }
+ *(e++) = '/';
+ } else {
+ return 0;
+ }
+ }
+}
+
/**
*
* @param path - path to file.
* @param value - attribute value. size < XATTR_SIZE_MAX
* @param size
* @param flags - XATTR_CREATE and/or XATTR_REPLACE
- * @return On success, zero is returned. On failure, -errno is returnted.
+ * @return On success, zero is returned. On failure, -errno is returned.
*/
int binary_storage_write_key(const char *path, const char *name, const char *value, size_t size, int flags)
{
#ifdef DEBUG
char *sanitized_value = sanitize_value(value, size);
debug_print("path=%s name=%s sanitized_value=%s size=%zu flags=%d\n", path, name, sanitized_value, size, flags);
- free(sanitized_value);
+ strfree(sanitized_value);
#endif
int buffer_size;
if (buffer == NULL && buffer_size == -ENOENT && flags & XATTR_REPLACE) {
error_print("No xattr. (flag XATTR_REPLACE)");
- return -ENODATA;
+ return -ENOATTR;
}
if (buffer == NULL && buffer_size != -ENOENT) {
int status;
char *sidecar_path = get_sidecar_path(path);
+
+ if ( ensure_dirs( sidecar_path ) ) {
+ return -ENOATTR;
+ }
+
FILE *file = fopen(sidecar_path, "w");
- free(sidecar_path);
+ strfree(sidecar_path);
if (buffer == NULL) {
debug_print("new file, writing directly...\n");
status = __write_to_file(file, name, value, size);
assert(status == 0);
fclose(file);
- free(buffer);
+ strfree(buffer);
return 0;
}
assert(buffer_size >= 0);
}
fclose(file);
- free(buffer);
+ strfree(buffer);
return res;
}
{
struct on_memory_attr *attr = __read_on_memory_attr(&offset, buffer, _buffer_size);
if (attr == NULL) {
- free(buffer);
+ strfree(buffer);
return -EILSEQ;
}
error_print("error, attr->value_size=%zu > size=%zu\n", attr->value_size, size);
res = -ERANGE;
}
- free(buffer);
+ strfree(buffer);
__free_on_memory_attr(attr);
return res;
}
__free_on_memory_attr(attr);
}
- free(buffer);
+ strfree(buffer);
return -ENOATTR;
}
{
struct on_memory_attr *attr = __read_on_memory_attr(&offset, buffer, _buffer_size);
if (attr == NULL) {
- free(buffer);
+ strfree(buffer);
return -EILSEQ;
}
error_print("Not enough memory allocated. allocated=%zu required=%ld\n",
size, attr->name_size + res);
__free_on_memory_attr(attr);
- free(buffer);
+ strfree(buffer);
return -ERANGE;
} else {
memcpy(list + res, attr->name, attr->name_size);
}
__free_on_memory_attr(attr);
}
- free(buffer);
+ strfree(buffer);
if (size == 0 && res > XATTR_LIST_MAX) {
// FIXME: we should return the size or an error ?
- return -E2BIG;
+ return -ENOSPC;
}
return (int)res;
char *sidecar_path = get_sidecar_path(path);
FILE *file = fopen(sidecar_path, "w");
- free(sidecar_path);
+ strfree(sidecar_path);
size_t offset = 0;
size_t name_len = strlen(name) + 1; // null byte \0
}
fclose(file);
- free(buffer);
+ strfree(buffer);
return res;
-}
\ No newline at end of file
+}