diff options
Diffstat (limited to 'libglusterfs/src/common-utils.c')
-rw-r--r-- | libglusterfs/src/common-utils.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 3b904f522..eef865ec5 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -36,6 +36,7 @@ #include <time.h> #include <locale.h> #include <sys/socket.h> +#include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> @@ -1466,3 +1467,58 @@ get_checksum_for_file (int fd, uint32_t *checksum) return ret; } + + +/* One should pass the command here with command with full path, + otherwise, execv will fail */ +int +gf_system (const char *command) +{ + int ret = -1; + pid_t pid = 0; + int status = 0; + int idx = 0; + char *dupcmd = NULL; + char *arg = NULL; + char *tmp = NULL; + char *argv[100] = { NULL, }; + + dupcmd = gf_strdup (command); + if (!dupcmd) + goto out; + + pid = fork (); + if (pid < 0) { + /* failure */ + goto out; + } + if (pid == 0) { + /* Child process */ + /* Step 0: Prepare the argv */ + arg = strtok_r (dupcmd, " ", &tmp); + while (arg) { + argv[idx] = arg; + arg = strtok_r (NULL, " ", &tmp); + idx++; + } + /* Step 1: Close all 'fd' */ + for (idx = 3; idx < 65536; idx++) { + close (idx); + } + /* Step 2: execv (); */ + ret = execvp (argv[0], argv); + + /* Code will not come here at all */ + gf_log ("", GF_LOG_ERROR, "execv of (%s) failed", command); + } + if (pid > 0) { + /* Current, ie, parent process */ + pid = waitpid (pid, &status, 0); + ret = status; + } +out: + if (dupcmd) + GF_FREE (dupcmd); + + return ret; +} |