Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Support for ": dirconf/per-dir-rules", in progress.
[rsync/rsync.git]
/
socket.c
diff --git
a/socket.c
b/socket.c
index
87b1ec3
..
0ad766d
100644
(file)
--- a/
socket.c
+++ b/
socket.c
@@
-823,6
+823,7
@@
static int socketpair_tcp(int fd[2])
**/
int sock_exec(const char *prog)
{
**/
int sock_exec(const char *prog)
{
+ pid_t pid;
int fd[2];
if (socketpair_tcp(fd) != 0) {
int fd[2];
if (socketpair_tcp(fd) != 0) {
@@
-831,14
+832,23
@@
int sock_exec(const char *prog)
}
if (DEBUG_GTE(CMD, 1))
rprintf(FINFO, "Running socket program: \"%s\"\n", prog);
}
if (DEBUG_GTE(CMD, 1))
rprintf(FINFO, "Running socket program: \"%s\"\n", prog);
- if (fork() == 0) {
+
+ pid = fork();
+ if (pid < 0) {
+ rsyserr(FERROR, errno, "fork");
+ exit_cleanup(RERR_IPC);
+ }
+
+ if (pid == 0) {
close(fd[0]);
close(fd[0]);
- close(0);
- close(1);
- dup(fd[1]);
- dup(fd[1]);
+ if (dup2(fd[1], STDIN_FILENO) < 0
+ || dup2(fd[1], STDOUT_FILENO) < 0) {
+ fprintf(stderr, "Failed to run \"%s\"\n", prog);
+ exit(1);
+ }
exit(system(prog));
}
exit(system(prog));
}
+
close(fd[1]);
return fd[0];
}
close(fd[1]);
return fd[0];
}