diff options
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 74 |
1 files changed, 56 insertions, 18 deletions
@@ -37,6 +37,7 @@ #include "config.h" #include "file.h" #include "mime.h" +#include "str.h" #include "url.h" #include "util.h" @@ -50,10 +51,6 @@ file_free(struct file * file) free(file->path); file->path = NULL; } - if (file->name != NULL) { - free(file->name); - file->name = NULL; - } if (file->action_url != NULL) { free(file->action_url); file->action_url = NULL; @@ -61,7 +58,7 @@ file_free(struct file * file) free(file); } -static bool +static bool fill_metadata(struct file * f) { char *ext, *data_dir; @@ -77,7 +74,7 @@ fill_metadata(struct file * f) f->mime = MIME_BIN; /* check if it is a directory */ - path_len = url_build(path, PATH_MAX, data_dir, f->path, f->name, NULL); + path_len = url_build(path, PATH_MAX, data_dir, f->path, NULL); if (path_len == 0 || path_len >= PATH_MAX) return false; @@ -88,8 +85,8 @@ fill_metadata(struct file * f) f->is_dir = S_ISDIR(sb.st_mode); /* find mime from file extension */ - ext = strrchr(f->name, '.'); - if (!ext || ext == f->name) { + ext = strrchr(f->path, '.'); + if (!ext || ext == f->path) { return true; } ext++; @@ -99,27 +96,68 @@ fill_metadata(struct file * f) } struct file * -file_new(char *dir, size_t dir_len, char *name, size_t name_len) +file_new(const char *path) { struct file *file; + if (path == NULL) + return NULL; + file = (struct file *) calloc(1, sizeof(struct file)); if (file == NULL) return NULL; - file->path = strndup(dir, dir_len); - if (file->path == NULL) { - file_free(file); - return NULL; - } - file->name = strndup(name, name_len); - if (file->name == NULL) { - file_free(file); - return NULL; + /* empty path is considered as root */ + if (strlen(path) == 0) { + file->path = malloc(sizeof(char) * 2); + if (file->path == NULL) { + file_free(file); + return NULL; + } + strlcpy(file->path, "/", 2); + } else { + file->path = strdup(path); + if (file->path == NULL) { + file_free(file); + return NULL; + } } + if (!fill_metadata(file)) { file_free(file); return NULL; } return file; } + +char * +file_get_basename(const struct file * f) +{ + if (f == NULL || f->path == NULL) + return NULL; + + /* is the path a basename itself? */ + if (strrchr(f->path, '/') == NULL) + return f->path; + + /* split for the basename */ + return str_split(f->path, '/'); +} + +size_t +file_get_data_path(const struct file * f, char *data_path, size_t data_path_len) +{ + char *data_dir; + size_t path_len; + + data_dir = config_data_dir(); + if (data_dir == NULL) + return 0; + + /* check if it is a directory */ + path_len = url_build(data_path, data_path_len, data_dir, f->path, NULL); + if (path_len == 0 || path_len >= PATH_MAX) + return 0; + + return path_len; +} |