summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorCsaba Henk <csaba@gluster.com>2011-05-26 03:32:27 +0000
committerAnand Avati <avati@gluster.com>2011-05-26 08:55:22 -0700
commit9072b817b0803f999081c6244b18a9ae8fb0234c (patch)
tree919d47d2ea6d42975dac3dd9293f925d6e7849e6 /cli
parent302ad26982d1eb7762e743e14dda627ffb317379 (diff)
reimplement invocation of external programs with run API
Signed-off-by: Csaba Henk <csaba@gluster.com> Signed-off-by: Anand Avati <avati@gluster.com> BUG: 2562 (invoke external commands precisely with fork + exec) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2562
Diffstat (limited to 'cli')
-rw-r--r--cli/src/cli-cmd-volume.c37
-rw-r--r--cli/src/cli-rpc-ops.c56
2 files changed, 41 insertions, 52 deletions
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
index 7ca9ed4..f2edbd0 100644
--- a/cli/src/cli-cmd-volume.c
+++ b/cli/src/cli-cmd-volume.c
@@ -32,6 +32,7 @@
#include "cli-cmd.h"
#include "cli-mem-types.h"
#include "cli1-xdr.h"
+#include "run.h"
extern struct rpc_clnt *global_rpc;
@@ -1053,30 +1054,10 @@ out:
static int
cli_check_gsync_present ()
{
- FILE *in = NULL;
char buff[PATH_MAX] = {0, };
- char cmd[PATH_MAX + 256] = {0, };
+ runner_t runner = {0,};
char *ptr = NULL;
int ret = 0;
- struct stat stat_buff;
-
- if (strlen (GSYNCD_PREFIX)+1 > PATH_MAX-strlen("/gsyncd")) {
- ret = -1;
- goto out;
- }
-
- ret = snprintf (cmd, sizeof(cmd), GSYNCD_PREFIX "/gsyncd");
- if (ret < 0) {
- ret = 0;
- goto out;
- }
- ret = lstat (cmd, &stat_buff);
-
- if (ret || !(stat_buff.st_mode & S_IXUSR)) {
- ret = -1;
- gf_log ("", GF_LOG_INFO, "geo-replication not installed");
- goto out;
- }
ret = setenv ("_GLUSTERD_CALLED_", "1", 1);
if (-1 == ret) {
@@ -1085,16 +1066,16 @@ cli_check_gsync_present ()
goto out;
}
- memset (cmd, 0, sizeof (cmd));
- ret = snprintf (cmd, sizeof(cmd), GSYNCD_PREFIX"/gsyncd --version");
-
- if (!(in = popen(cmd, "r"))) {
- ret = -1;
+ runinit (&runner);
+ runner_add_args (&runner, GSYNCD_PREFIX"/gsyncd", "--version", NULL);
+ runner_redir (&runner, STDOUT_FILENO, RUN_PIPE);
+ ret = runner_start (&runner);
+ if (ret == -1) {
gf_log ("", GF_LOG_INFO, "geo-replication not installed");
goto out;
}
- ptr = fgets(buff, sizeof(buff), in);
+ ptr = fgets(buff, sizeof(buff), runner_chio (&runner, STDOUT_FILENO));
if (ptr) {
if (!strstr (buff, "gsyncd")) {
ret = -1;
@@ -1105,7 +1086,7 @@ cli_check_gsync_present ()
goto out;
}
- ret = pclose (in);
+ ret = runner_end (&runner);
if (ret)
gf_log ("", GF_LOG_ERROR, "geo-replication not installed");
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index 24afb66..ee52ccc 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -43,6 +43,8 @@
#include "glusterfs3.h"
#include "portmap.h"
+#include "run.h"
+
extern rpc_clnt_prog_t *cli_rpc_prog;
extern int cli_op_ret;
extern int connected;
@@ -1318,7 +1320,8 @@ print_limit_list (char *volname, char *limit_list)
char ret_str [1024] = {0, };
char value [1024] = {0, };
char mountdir [] = "/tmp/mntXXXXXX";
- char cmd_str [PATH_MAX + 1024] = {0, };
+ char abspath [PATH_MAX] = {0, };
+ runner_t runner = {0,};
GF_VALIDATE_OR_GOTO ("cli", volname, out);
GF_VALIDATE_OR_GOTO ("cli", limit_list, out);
@@ -1336,10 +1339,8 @@ print_limit_list (char *volname, char *limit_list)
/* Mount a temporary client to fetch the disk usage
* of the directory on which the limit is set.
*/
- snprintf (cmd_str, sizeof (cmd_str), GFS_PREFIX "/sbin/glusterfs -s localhost "
- "--volfile-id %s %s", volname, mountdir);
-
- ret = system (cmd_str);
+ ret = runcmd (GFS_PREFIX"/sbin/glusterfs", "-s",
+ "localhost", "--volfile-id", volname, mountdir, NULL);
if (ret) {
gf_log ("cli", GF_LOG_WARNING, "failed to mount glusterfs client");
ret = -1;
@@ -1373,10 +1374,9 @@ print_limit_list (char *volname, char *limit_list)
}
value [j] = '\0';
- memset (&cmd_str, 0, sizeof (cmd_str));
- snprintf (cmd_str, sizeof (cmd_str), "%s/%s", mountdir, path);
+ snprintf (abspath, sizeof (abspath), "%s/%s", mountdir, path);
- ret = getxattr (cmd_str, "trusted.limit.list", (void *) ret_str, 4096);
+ ret = getxattr (abspath, "trusted.limit.list", (void *) ret_str, 4096);
if (ret < 0) {
cli_out ("%-20s %10s", path, value);
} else {
@@ -1389,15 +1389,18 @@ print_limit_list (char *volname, char *limit_list)
}
unmount:
- memset (&cmd_str, 0, sizeof (cmd_str));
+
+ runinit (&runner);
+ runner_add_args (&runner, "umount",
#if GF_LINUX_HOST_OS
- snprintf (cmd_str, sizeof (cmd_str), "umount -l %s", mountdir);
-#else
- snprintf (cmd_str, sizeof (cmd_str), "umount %s", mountdir);
+ "-l",
#endif
- ret = system (cmd_str);
+ mountdir, NULL);
+ ret = runner_run_reuse (&runner);
if (ret)
- gf_log ("cli", GF_LOG_WARNING, "error executing: %s", cmd_str);
+ runner_log (&runner, "cli", GF_LOG_WARNING, "error executing");
+ runner_end (&runner);
+
rm_dir:
rmdir (mountdir);
out:
@@ -2654,7 +2657,7 @@ out:
int
gf_cli3_1_gsync_config_command (dict_t *dict)
{
- char cmd[PATH_MAX] = {0,};
+ runner_t runner = {0,};
char *subop = NULL;
char *gwd = NULL;
char *slave = NULL;
@@ -2674,16 +2677,21 @@ gf_cli3_1_gsync_config_command (dict_t *dict)
return -1;
if (dict_get_str (dict, "master", &master) != 0)
- master = "";
+ master = NULL;
if (dict_get_str (dict, "op_name", &op_name) != 0)
- op_name = "";
-
- snprintf (cmd, PATH_MAX,
- GSYNCD_PREFIX"/gsyncd -c %s/"GSYNC_CONF" %s%s %s --config-%s%s%s",
- gwd, *master ? ":" : "", master, slave,
- subop, *op_name ? " " : "", op_name);
-
- return system (cmd) ? -1 : 0;
+ op_name = NULL;
+
+ runinit (&runner);
+ runner_add_args (&runner, GSYNCD_PREFIX"/gsyncd", "-c", NULL);
+ runner_argprintf (&runner, "%s/"GSYNC_CONF, gwd);
+ if (master)
+ runner_argprintf (&runner, ":%s", master);
+ runner_add_arg (&runner, slave);
+ runner_argprintf (&runner, "--config-%s", subop);
+ if (op_name)
+ runner_add_arg (&runner, op_name);
+
+ return runner_run (&runner);
}
int