diff --git a/src/lib/file.c b/src/lib/file.c index aa9fb05..9192598 100644 --- a/src/lib/file.c +++ b/src/lib/file.c @@ -12,6 +12,14 @@ #include "file.h" +int +__imlib_IsRealFile(const char *s) +{ + struct stat st; + + return (stat(s, &st) != -1) && (S_ISREG(st.st_mode)); +} + char * __imlib_FileKey(const char *file) { @@ -104,129 +112,82 @@ __imlib_FileExtension(const char *file) return *p != '\0' ? p : NULL; } +static int +__imlib_FileStat(const char *file, struct stat *st) +{ + int err = 0; + char *fl; + + if ((!file) || (!*file)) + return -1; + + if (__imlib_IsRealFile(file)) + fl = strdup(file); + else + fl = __imlib_FileRealFile(file); + if (!fl) + return -1; + + if (stat(fl, st) < 0) + err = -1; + + free(fl); + return err; +} + int __imlib_FileExists(const char *s) { struct stat st; - char *fl; - if ((!s) || (!*s)) - return 0; - if (__imlib_IsRealFile(s)) - fl = strdup(s); - else - fl = __imlib_FileRealFile(s); - if (!fl) - return 0; - if (stat(fl, &st) < 0) - { - free(fl); - return 0; - } - free(fl); - return 1; + return __imlib_FileStat(s, &st) == 0; } int __imlib_FileIsFile(const char *s) { struct stat st; - char *fl; - if ((!s) || (!*s)) + if (__imlib_FileStat(s, &st)) return 0; - if (__imlib_IsRealFile(s)) - fl = strdup(s); - else - fl = __imlib_FileRealFile(s); - if (!fl) - return 0; - if (stat(fl, &st) < 0) - { - free(fl); - return 0; - } - if (S_ISREG(st.st_mode)) - { - free(fl); - return 1; - } - free(fl); - return 0; + + return (S_ISREG(st.st_mode)) ? 1 : 0; } int __imlib_FileIsDir(const char *s) { struct stat st; - char *fl; - if ((!s) || (!*s)) + if (__imlib_FileStat(s, &st)) return 0; - if (__imlib_IsRealFile(s)) - fl = strdup(s); - else - fl = __imlib_FileRealFile(s); - if (!fl) - return 0; - if (stat(fl, &st) < 0) - { - free(fl); - return 0; - } - if (S_ISDIR(st.st_mode)) - { - free(fl); - return 1; - } - free(fl); - return 0; + + return (S_ISDIR(st.st_mode)) ? 1 : 0; } -int -__imlib_FilePermissions(const char *s) +time_t +__imlib_FileModDate(const char *s) { struct stat st; - char *fl; - if ((!s) || (!*s)) + if (__imlib_FileStat(s, &st)) return 0; - if (__imlib_IsRealFile(s)) - fl = strdup(s); - else - fl = __imlib_FileRealFile(s); - if (!fl) - return 0; - if (stat(fl, &st) < 0) - { - free(fl); - return 0; - } - free(fl); - return st.st_mode; + + return (st.st_mtime > st.st_ctime) ? st.st_mtime : st.st_ctime; } int __imlib_FileCanRead(const char *s) { - char *fl; - int val; + struct stat st; - if (__imlib_IsRealFile(s)) - fl = strdup(s); - else - fl = __imlib_FileRealFile(s); - if (!fl) + if (__imlib_FileStat(s, &st)) return 0; - if (!(__imlib_FilePermissions(fl) & (S_IRUSR | S_IRGRP | S_IROTH))) - { - free(fl); - return 0; - } - val = (1 + access(fl, R_OK)); - free(fl); - return val; + if (!(st.st_mode & (S_IRUSR | S_IRGRP | S_IROTH))) + return 0; + + return access(s, R_OK) == 0 ? 1 : 0; // ??? TBD } char ** @@ -315,42 +276,6 @@ __imlib_FileDel(const char *s) unlink(s); } -int -__imlib_IsRealFile(const char *s) -{ - struct stat st; - - return (stat(s, &st) != -1) && (S_ISREG(st.st_mode)); -} - -time_t -__imlib_FileModDate(const char *s) -{ - struct stat st; - char *fl; - - if ((!s) || (!*s)) - return 0; - if (__imlib_IsRealFile(s)) - fl = strdup(s); - else - fl = __imlib_FileRealFile(s); - if (!fl) - return 0; - if (stat(fl, &st) < 0) - { - free(fl); - return 0; - } - if (st.st_mtime > st.st_ctime) - { - free(fl); - return st.st_mtime; - } - free(fl); - return st.st_ctime; -} - char * __imlib_FileHomeDir(int uid) { diff --git a/src/lib/file.h b/src/lib/file.h index ba34b51..b5e1fc6 100644 --- a/src/lib/file.h +++ b/src/lib/file.h @@ -3,21 +3,23 @@ #include "common.h" +int __imlib_IsRealFile(const char *s); char *__imlib_FileKey(const char *file); char *__imlib_FileRealFile(const char *file); + const char *__imlib_FileExtension(const char *file); + int __imlib_FileExists(const char *s); int __imlib_FileIsFile(const char *s); int __imlib_FileIsDir(const char *s); +time_t __imlib_FileModDate(const char *s); +int __imlib_FileCanRead(const char *s); + char **__imlib_FileDir(const char *dir, int *num); void __imlib_FileFreeDirList(char **l, int num); -void __imlib_FileDel(const char *s); -time_t __imlib_FileModDate(const char *s); -char *__imlib_FileHomeDir(int uid); -int __imlib_FilePermissions(const char *s); -int __imlib_FileCanRead(const char *s); -int __imlib_IsRealFile(const char *s); +void __imlib_FileDel(const char *s); +char *__imlib_FileHomeDir(int uid); int __imlib_ItemInList(char **list, int size, char *item); const char *__imlib_PathToFilters(void);