X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c80ccabb0cfbdbc60a4ff4f885cd8f7d4eaed6d0..c48b22c8583f6d6c55c6a6f6001cf4fdcc20aed1:/util.c diff --git a/util.c b/util.c index e4ebd254..bd0af33f 100644 --- a/util.c +++ b/util.c @@ -82,7 +82,16 @@ int fd_pair(int fd[2]) } -/* this is derived from CVS code */ +/* this is derived from CVS code + + note that in the child STDIN is set to blocking and STDOUT + is set to non-blocking. This is necessary as rsh relies on stdin being blocking + and ssh relies on stdout being non-blocking + + if blocking_io is set then use blocking io on both fds. That can be + used to cope with badly broken rsh implementations like the one on + solaris. + */ int piped_child(char **command,int *f_in,int *f_out) { int pid; @@ -921,14 +930,58 @@ char *timestring(time_t t) } -/**************************************************************************** - like waitpid but does the WEXITSTATUS -****************************************************************************/ -#ifndef WEXITSTATUS -#define WEXITSTATUS(stat) ((int)(((stat)>>8)&0xFF)) -#endif -void wait_process(pid_t pid, int *status) +/******************************************************************* +sleep for a specified number of milliseconds +********************************************************************/ +void msleep(int t) { - waitpid(pid, status, 0); - *status = WEXITSTATUS(*status); + int tdiff=0; + struct timeval tval,t1,t2; + + gettimeofday(&t1, NULL); + gettimeofday(&t2, NULL); + + while (tdiff < t) { + tval.tv_sec = (t-tdiff)/1000; + tval.tv_usec = 1000*((t-tdiff)%1000); + + errno = 0; + select(0,NULL,NULL, NULL, &tval); + + gettimeofday(&t2, NULL); + tdiff = (t2.tv_sec - t1.tv_sec)*1000 + + (t2.tv_usec - t1.tv_usec)/1000; + } } + + +#ifdef __INSURE__ +#include + +/******************************************************************* +This routine is a trick to immediately catch errors when debugging +with insure. A xterm with a gdb is popped up when insure catches +a error. It is Linux specific. +********************************************************************/ +int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6) +{ + static int (*fn)(); + int ret; + char cmd[1024]; + + sprintf(cmd, "/usr/X11R6/bin/xterm -display :0 -T Panic -n Panic -e /bin/sh -c 'cat /tmp/ierrs.*.%d ; gdb /proc/%d/exe %d'", + getpid(), getpid(), getpid()); + + if (!fn) { + static void *h; + h = dlopen("/usr/local/parasoft/insure++lite/lib.linux2/libinsure.so", RTLD_LAZY); + fn = dlsym(h, "_Insure_trap_error"); + } + + ret = fn(a1, a2, a3, a4, a5, a6); + + system(cmd); + + return ret; +} +#endif