diff options
| author | Martin Schwenke <martin@meltin.net> | 2018-07-12 13:26:27 +1000 |
|---|---|---|
| committer | Amitay Isaacs <amitay@samba.org> | 2018-07-28 17:14:11 +0200 |
| commit | 82e62488027302e541739628210292c2d95717e1 (patch) | |
| tree | 89730537bfd151c8ae53fd928f927aa87b6c1515 /ctdb/common/run_event.c | |
| parent | a7a4ee439dc1cf262b4da9fbcb38a2f69c62744c (diff) | |
| download | samba-82e62488027302e541739628210292c2d95717e1.tar.gz samba-82e62488027302e541739628210292c2d95717e1.tar.bz2 samba-82e62488027302e541739628210292c2d95717e1.zip | |
ctdb-common: Use script abstraction in run_event
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13551
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Diffstat (limited to 'ctdb/common/run_event.c')
| -rw-r--r-- | ctdb/common/run_event.c | 217 |
1 files changed, 59 insertions, 158 deletions
diff --git a/ctdb/common/run_event.c b/ctdb/common/run_event.c index a2155500f28..91b3dd3241a 100644 --- a/ctdb/common/run_event.c +++ b/ctdb/common/run_event.c @@ -31,177 +31,70 @@ #include "common/logging.h" #include "common/run_proc.h" +#include "common/event_script.h" + #include "common/run_event.h" /* * Utility functions */ -static int script_filter(const struct dirent *de) -{ - int ret; - - /* Match a script pattern */ - ret = fnmatch("[0-9][0-9].*.script", de->d_name, 0); - if (ret == 0) { - return 1; - } - - return 0; -} - static int get_script_list(TALLOC_CTX *mem_ctx, const char *script_dir, struct run_event_script_list **out) { - struct dirent **namelist = NULL; + struct event_script_list *s_list; struct run_event_script_list *script_list; - size_t ls; - int count, ret; - int i; + unsigned int i; + int ret; - count = scandir(script_dir, &namelist, script_filter, alphasort); - if (count == -1) { - ret = errno; + ret = event_script_get_list(mem_ctx, script_dir, &s_list); + if (ret != 0) { if (ret == ENOENT) { D_WARNING("event script dir %s removed\n", script_dir); } else { - D_WARNING("scandir() failed on %s, ret=%d\n", + D_WARNING("failed to get script list for %s, ret=%d\n", script_dir, ret); } - *out = NULL; - goto done; + return ret; } - if (count == 0) { + if (s_list->num_scripts == 0) { *out = NULL; - ret = 0; - goto done; + talloc_free(s_list); + return 0; } script_list = talloc_zero(mem_ctx, struct run_event_script_list); if (script_list == NULL) { + talloc_free(s_list); return ENOMEM; } - script_list->num_scripts = count; + script_list->num_scripts = s_list->num_scripts; script_list->script = talloc_zero_array(script_list, struct run_event_script, - count); + script_list->num_scripts); if (script_list->script == NULL) { - ret = ENOMEM; + talloc_free(s_list); talloc_free(script_list); - goto done; - } - - ls = strlen(".script"); - for (i=0; i<count; i++) { - struct run_event_script *s = &script_list->script[i]; - - s->name = talloc_strndup(script_list, - namelist[i]->d_name, - strlen(namelist[i]->d_name) - ls); - if (s->name == NULL) { - ret = ENOMEM; - talloc_free(script_list); - goto done; - } - } - - *out = script_list; - ret = 0; - -done: - if (namelist != NULL && count != -1) { - for (i=0; i<count; i++) { - free(namelist[i]); - } - free(namelist); - } - return ret; -} - -static int script_chmod(TALLOC_CTX *mem_ctx, const char *script_dir, - const char *script_name, bool enable) -{ - DIR *dirp; - struct dirent *de; - char script_file[PATH_MAX]; - int ret, new_mode; - char *filename; - struct stat st; - bool found; - int fd = -1; - - ret = snprintf(script_file, - sizeof(script_file), - "%s.script", - script_name); - if (ret >= sizeof(script_file)) { - return ENAMETOOLONG; - } - - dirp = opendir(script_dir); - if (dirp == NULL) { - return errno; - } - - found = false; - while ((de = readdir(dirp)) != NULL) { - if (strcmp(de->d_name, script_file) == 0) { - - /* check for valid script names */ - ret = script_filter(de); - if (ret == 0) { - closedir(dirp); - return EINVAL; - } - - found = true; - break; - } - } - closedir(dirp); - - if (! found) { - return ENOENT; - } - - filename = talloc_asprintf(mem_ctx, "%s/%s", script_dir, script_file); - if (filename == NULL) { return ENOMEM; } - fd = open(filename, O_RDWR); - if (fd == -1) { - ret = errno; - goto done; - } - - ret = fstat(fd, &st); - if (ret != 0) { - ret = errno; - goto done; - } + for (i = 0; i < s_list->num_scripts; i++) { + struct event_script *s = s_list->script[i]; + struct run_event_script *script = &script_list->script[i]; - if (enable) { - new_mode = st.st_mode | (S_IXUSR | S_IXGRP | S_IXOTH); - } else { - new_mode = st.st_mode & ~(S_IXUSR | S_IXGRP | S_IXOTH); - } + script->name = talloc_steal(script_list->script, s->name); - ret = fchmod(fd, new_mode); - if (ret != 0) { - ret = errno; - goto done; + if (! s->enabled) { + script->summary = -ENOEXEC; + } } -done: - if (fd != -1) { - close(fd); - } - talloc_free(filename); - return ret; + talloc_free(s_list); + *out = script_list; + return 0; } static int script_args(TALLOC_CTX *mem_ctx, const char *event_str, @@ -392,45 +285,51 @@ int run_event_list(struct run_event_context *run_ctx, TALLOC_CTX *mem_ctx, struct run_event_script_list **output) { + struct event_script_list *s_list; struct run_event_script_list *script_list; int ret, i; - ret = get_script_list(mem_ctx, run_event_script_dir(run_ctx), - &script_list); + ret = event_script_get_list(mem_ctx, + run_event_script_dir(run_ctx), + &s_list); if (ret != 0) { return ret; } - if (script_list == NULL) { + if (s_list->num_scripts == 0) { *output = NULL; + talloc_free(s_list); return 0; } - for (i=0; i<script_list->num_scripts; i++) { + script_list = talloc_zero(mem_ctx, struct run_event_script_list); + if (script_list == NULL) { + return ENOMEM; + } + + script_list->num_scripts = s_list->num_scripts; + script_list->script = talloc_zero_array(script_list, + struct run_event_script, + script_list->num_scripts); + if (script_list->script == NULL) { + talloc_free(s_list); + talloc_free(script_list); + return ENOMEM; + } + + for (i=0; i < s_list->num_scripts; i++) { + struct event_script *s = s_list->script[i]; struct run_event_script *script = &script_list->script[i]; - struct stat st; - char *path = NULL; - - path = talloc_asprintf(mem_ctx, "%s/%s.script", - run_event_script_dir(run_ctx), - script->name); - if (path == NULL) { - continue; - } - ret = stat(path, &st); - if (ret != 0) { - TALLOC_FREE(path); - continue; - } + script->name = talloc_steal(script_list->script, s->name); - if (! (st.st_mode & S_IXUSR)) { + if (! s->enabled) { script->summary = -ENOEXEC; } - - TALLOC_FREE(path); } + + talloc_free(s_list); *output = script_list; return 0; } @@ -438,15 +337,17 @@ int run_event_list(struct run_event_context *run_ctx, int run_event_script_enable(struct run_event_context *run_ctx, const char *script_name) { - return script_chmod(run_ctx, run_event_script_dir(run_ctx), - script_name, true); + return event_script_chmod(run_event_script_dir(run_ctx), + script_name, + true); } int run_event_script_disable(struct run_event_context *run_ctx, const char *script_name) { - return script_chmod(run_ctx, run_event_script_dir(run_ctx), - script_name, false); + return event_script_chmod(run_event_script_dir(run_ctx), + script_name, + false); } /* |
