- /* XXX spawning off an rsync for every data sync and
- * waiting synchronously is bad for performance.
- * librsync could possibly used here. But it does not
- * seem to be of production grade. Multi-threaded
- * replication is also to be considered.
- */
- int status;
-
- if (snprintf(info->cmd, sizeof(info->cmd), "%s --inplace %s %s",
- rsync, info->src, info->dest) >= sizeof(info->cmd)) {
- rc = -E2BIG;
- goto err;
- }
- lr_debug(DTRACE, "\t%s %s\n", info->cmd, info->tfid);
- status = system(info->cmd);
- if (status == -1) {
+ /* XXX spawning off an rsync for every data sync and
+ * waiting synchronously is bad for performance.
+ * librsync could possibly used here. But it does not
+ * seem to be of production grade. Multi-threaded
+ * replication is also to be considered.
+ */
+ char *args[] = {
+ rsync,
+ "--inplace",
+ "--",
+ info->src,
+ info->dest,
+ NULL,
+ };
+ extern char **environ;
+ int status;
+
+ lr_debug(DTRACE, "\t%s %s %s %s %s %s\n", args[0], args[1],
+ args[2], args[3], args[4], info->tfid);
+
+ status = callvpe(rsync, args, environ);
+ if (status < 0) {