-/* this is taken from CVS */
-int piped_child(char **command,int *f_in,int *f_out)
-{
- int pid;
- int to_child_pipe[2];
- int from_child_pipe[2];
-
- if (pipe(to_child_pipe) < 0 ||
- pipe(from_child_pipe) < 0) {
- rprintf(FERROR,"pipe: %s\n",strerror(errno));
- exit_cleanup(RERR_IPC);
- }
-
-
- pid = do_fork();
- if (pid < 0) {
- rprintf(FERROR,"fork: %s\n",strerror(errno));
- exit_cleanup(RERR_IPC);
- }
-
- if (pid == 0)
- {
- extern int orig_umask;
- if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 ||
- close(to_child_pipe[1]) < 0 ||
- close(from_child_pipe[0]) < 0 ||
- dup2(from_child_pipe[1], STDOUT_FILENO) < 0) {
- rprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
- exit_cleanup(RERR_IPC);
- }
- if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]);
- if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]);
- umask(orig_umask);
- execvp(command[0], command);
- rprintf(FERROR,"Failed to exec %s : %s\n",
- command[0],strerror(errno));
- exit_cleanup(RERR_IPC);
- }
-
- if (close(from_child_pipe[1]) < 0 ||
- close(to_child_pipe[0]) < 0) {
- rprintf(FERROR,"Failed to close : %s\n",strerror(errno));
- exit_cleanup(RERR_IPC);
- }
-
- *f_in = from_child_pipe[0];
- *f_out = to_child_pipe[1];
-
- return pid;
-}
-
-int local_child(int argc, char **argv,int *f_in,int *f_out)
-{
- int pid;
- int to_child_pipe[2];
- int from_child_pipe[2];
-
- if (pipe(to_child_pipe) < 0 ||
- pipe(from_child_pipe) < 0) {
- rprintf(FERROR,"pipe: %s\n",strerror(errno));
- exit_cleanup(RERR_IPC);
- }
-
-
- pid = do_fork();
- if (pid < 0) {
- rprintf(FERROR,"fork: %s\n",strerror(errno));
- exit_cleanup(RERR_IPC);
- }
-
- if (pid == 0) {
- extern int am_sender;
- extern int am_server;
-
- am_sender = !am_sender;
- am_server = 1;
-
- if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 ||
- close(to_child_pipe[1]) < 0 ||
- close(from_child_pipe[0]) < 0 ||
- dup2(from_child_pipe[1], STDOUT_FILENO) < 0) {
- rprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
- exit_cleanup(RERR_IPC);
- }
- if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]);
- if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]);
- start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv);
+int sanitize_paths = 0;
+
+
+
+/**
+ * Set a fd into nonblocking mode
+ **/
+void set_nonblocking(int fd)
+{
+ int val;
+
+ if ((val = fcntl(fd, F_GETFL, 0)) == -1)
+ return;
+ if (!(val & NONBLOCK_FLAG)) {
+ val |= NONBLOCK_FLAG;
+ fcntl(fd, F_SETFL, val);
+ }
+}
+
+/**
+ * Set a fd into blocking mode
+ **/
+void set_blocking(int fd)
+{
+ int val;
+
+ if ((val = fcntl(fd, F_GETFL, 0)) == -1)
+ return;
+ if (val & NONBLOCK_FLAG) {
+ val &= ~NONBLOCK_FLAG;
+ fcntl(fd, F_SETFL, val);