From 28f5e1bdf8dc03631b30268233af06d0b3760536 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Wed, 12 Jan 2011 21:11:34 -0500 Subject: [PATCH] fexists.so: more than one file can be specified. Specify the mode before the filename. Also fixed corruption. --- contrib/fexists.c | 109 ++++++++++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 56 deletions(-) diff --git a/contrib/fexists.c b/contrib/fexists.c index b26ea6d..9554fb0 100644 --- a/contrib/fexists.c +++ b/contrib/fexists.c @@ -53,23 +53,18 @@ extern void add_string(char ***, const char *); void ui_module_init(int *chainable) { *chainable = 0; - return; } void ui_module_exit() { int i; - static int done; - if (!done) { - for (i = 0; i < idx; i++) - free(files[i].name); + for (i = 0; i < idx; i++) + free(files[i].name); - free(files); - } - - done = 1; - return; + free(files); + files = NULL; + idx = 0; } void ui_module_help() @@ -79,7 +74,6 @@ void ui_module_help() printf("\t-w filename is writeable\n"); printf("\t-W filename is writeable by you\n"); printf("\t-d filename is a directory\n\n"); - return; } char *ui_module_options_init(char **defaults) @@ -108,23 +102,24 @@ int ui_module_options(int argc, char **argv) flags |= F_DIR; break; case 'f': + if (!flags) + return 1; + if ((files = realloc(files, (idx + 1) * sizeof(struct file_s))) == NULL) { warn("realloc()"); return 1; } files[idx].name = strdup(optarg); + files[idx++].flags = flags; + flags = 0; break; default: return 1; } } - if (!files) - return 1; - - files[idx++].flags = flags; - return 0; + return !files ? 1 : 0; } int ui_module_exec(char ***results, const struct passwd *pw, const int msep, const int verbose, @@ -134,61 +129,63 @@ int ui_module_exec(char ***results, const struct passwd *pw, const int msep, con char buf[FILENAME_MAX]; struct stat st; int ret = 0; - static int i; - - snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir, files[i].name); - - if (stat(buf, &st) != -1) { - ret = 1; + int i; - if (files[i].flags & F_READ) { - if (access(buf, R_OK) == -1) { - ret = 0; - goto done; - } + for (i = 0; i < idx; i++) { + ret = 0; + snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir, files[i].name); + if (stat(buf, &st) != -1) { ret = 1; - } - if (files[i].flags & F_WRITE) { - if (access(buf, W_OK) == -1) { - ret = 0; - goto done; + if (files[i].flags & F_READ) { + if (access(buf, R_OK) == -1) { + ret = 0; + goto done; + } + + ret = 1; } - ret = 1; - } + if (files[i].flags & F_WRITE) { + if (access(buf, W_OK) == -1) { + ret = 0; + goto done; + } - if (files[i].flags & F_WRITE) { - if (st.st_mode & S_IWOTH) ret = 1; - else { - ret = 0; - goto done; } - } - if (files[i].flags & F_DIR) { - if (S_ISDIR(st.st_mode)) - ret = 1; - else { - ret = 0; - goto done; + if (files[i].flags & F_WRITE) { + if (st.st_mode & S_IWOTH) + ret = 1; + else { + ret = 0; + goto done; + } + } + + if (files[i].flags & F_DIR) { + if (S_ISDIR(st.st_mode)) + ret = 1; + else { + ret = 0; + goto done; + } } } - } - else { - if (errno == EACCES) - ret = -1; - } + else { + if (errno == EACCES) + ret = -1; + } done: - if (ret == -1) - add_string(&strings, "!"); - else - add_string(&strings, (ret) ? "1" : "0"); + if (ret == -1) + add_string(&strings, "!"); + else + add_string(&strings, (ret) ? "1" : "0"); + } *results = strings; - i++; return 0; } -- 2.11.4.GIT