From c04d167c767bf608162d7a10c892284806451ebf Mon Sep 17 00:00:00 2001 From: Junichi Uekawa Date: Thu, 23 Oct 2008 14:07:57 +0000 Subject: [PATCH] refactor code to use execv instead of execl. --- lsyncd.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/lsyncd.c b/lsyncd.c index 2eee39b..23d83ca 100644 --- a/lsyncd.c +++ b/lsyncd.c @@ -354,11 +354,30 @@ bool rsync(char const * src, const char * dest, bool recursive) pid_t pid; int status; char const * opts = recursive ? "-ltr" : "-ltd"; + const int MAX_ARGS = 100; + char * argv[MAX_ARGS]; + int argc=0; + int i; + argv[argc++] = s_strdup(rsync_binary); + argv[argc++] = s_strdup("--delete"); + argv[argc++] = s_strdup(opts); if (exclude_file) { - printlogf(LOG_DEBUG, "exec %s(%s,%s,%s,%s,%s,%s)", rsync_binary, "--delete", opts, "--exclude-from", exclude_file, src, dest); - } else { - printlogf(LOG_DEBUG, "exec %s(%s,%s,%s,%s)", rsync_binary, "--delete", opts, src, dest); + argv[argc++] = s_strdup("--exclude-from"); + argv[argc++] = s_strdup(exclude_file); + } + argv[argc++] = s_strdup(src); + argv[argc++] = s_strdup(dest); + argv[argc++] = NULL; + + if (argc > MAX_ARGS) { /* check for error condition */ + printlogf(LOG_ERROR, "Internal error: too many (%i) options passed", argc); + return false; + } + + /* debug dump of command-line options */ + for (i=0; i