00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifdef USE_PCNFS
00014 #undef USE_PCNFS
00015 #endif
00016
00017 #include "rcs_defs.hh"
00018
00019 #include "writen.h"
00020 #if !defined(DOS_WINDOWS) || defined(gnuwin32)
00021 #include <sys/types.h>
00022 #ifdef VXWORKS
00023 #include <sys/times.h>
00024 #else
00025 #include <sys/time.h>
00026 #endif
00027 #include <unistd.h>
00028 #else
00029 #if defined(MSDOS) && !defined(WINDOWS)
00030 #include <sys/nfs_time.h>
00031 #else
00032 #include <io.h>
00033 #ifdef USE_OLD_WINSOCK
00034 #include <winsock.h>
00035 #else
00036 #include <winsock2.h>
00037 #endif
00038 #endif
00039 #endif
00040 #include <stddef.h>
00041 #include <errno.h>
00042 #include <string.h>
00043 #include <math.h>
00044 #include "rcs_prnt.hh"
00045 #include "sokintrf.h"
00046
00047
00048 int
00049 writen (int fd, const void *vptr, int n, double _timeout)
00050 {
00051 int nleft;
00052 long nwritten;
00053 char *ptr;
00054 double int_part;
00055 struct timeval timeout_tv;
00056 fd_set write_fd_set;
00057
00058 timeout_tv.tv_sec = (long) _timeout;
00059 timeout_tv.tv_usec = (long) (_timeout * 1000000.0);
00060 if (timeout_tv.tv_usec >= 1000000)
00061 {
00062 timeout_tv.tv_usec = timeout_tv.tv_usec % 1000000;
00063 }
00064 FD_ZERO (&write_fd_set);
00065 RCS_FD_SET (fd, &write_fd_set);
00066
00067 ptr = (char *) vptr;
00068 nleft = n;
00069 while (nleft > 0)
00070 {
00071 if (_timeout > 0.0)
00072 {
00073 switch (dl_select
00074 (fd + 1, (fd_set *) NULL, &write_fd_set, (fd_set *) NULL,
00075 &timeout_tv))
00076 {
00077 case -1:
00078 rcs_print_error ("Error in select: %d -> %s\n", errno,
00079 strerror (errno));
00080 return -1;
00081
00082 case 0:
00083 rcs_print_error ("Write timed out.\n");
00084 return -1;
00085
00086 default:
00087 break;
00088 }
00089 }
00090 if ((nwritten = write (fd, ptr, nleft)) == -1)
00091 {
00092 rcs_print_error ("Write error: %d = %s", errno, strerror (errno));
00093 return (-1);
00094 }
00095
00096 nleft -= nwritten;
00097 ptr += nwritten;
00098 }
00099 return (n);
00100 }