#undef HAVE_GETOPT_LONG
#undef REPLACE_INET_NTOA
#undef HAVE_GETTIMEOFDAY_TZ
+#undef HAVE_SOCKETPAIR
set_socket_options(fd,"SO_KEEPALIVE");
set_socket_options(fd,lp_socket_options());
-
+ set_nonblocking(fd);
io_printf(fd,"@RSYNCD: %d\n", PROTOCOL_VERSION);
continue;
}
+ if (n == -1 &&
+ (errno == EWOULDBLOCK || errno == EAGAIN)) {
+ continue;
+ }
+
if (n == 0) {
if (eof_error) {
if (FD_ISSET(fd, &w_fds)) {
int ret, n = len-total;
- ret = write(fd,buf+total,n?n:1);
+ ret = write(fd,buf+total,n);
if (ret == -1 && errno == EINTR) {
continue;
}
+ if (ret == -1 &&
+ (errno == EWOULDBLOCK || errno == EAGAIN)) {
+ continue;
+ }
+
if (ret <= 0) {
rprintf(FERROR,"erroring writing %d bytes - exiting\n", len);
exit_cleanup(RERR_STREAMIO);
setup_protocol(f_out, f_in);
+ set_nonblocking(f_in);
+ set_nonblocking(f_out);
+
if (remote_version >= 23)
io_start_multiplex_out(f_out);
extern int list_only;
extern int remote_version;
+ set_nonblocking(f_in);
+ set_nonblocking(f_out);
+
setup_protocol(f_out,f_in);
if (remote_version >= 23)
#endif
if (am_server) {
+ set_nonblocking(STDIN_FILENO);
+ set_nonblocking(STDOUT_FILENO);
start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv);
}
#define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG))
#endif
+/* work out what fcntl flag to use for non-blocking */
+#ifdef O_NONBLOCK
+# define NONBLOCK_FLAG O_NONBLOCK
+#elif defined(SYSV)
+# define NONBLOCK_FLAG O_NDELAY
+#else
+# define NONBLOCK_FLAG FNDELAY
+#endif
+
#define IS_DEVICE(mode) (S_ISCHR(mode) || S_ISBLK(mode) || S_ISSOCK(mode) || S_ISFIFO(mode))
extern int verbose;
-/* create a file descriptor - like pipe() but use socketpair if
- possible (because of blocking issues on pipes */
+
+/****************************************************************************
+Set a fd into nonblocking mode. Uses POSIX O_NONBLOCK if available,
+else
+if SYSV use O_NDELAY
+if BSD use FNDELAY
+****************************************************************************/
+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);
+ }
+}
+
+
+/* create a file descriptor pair - like pipe() but use socketpair if
+ possible (because of blocking issues on pipes)
+
+ always set non-blocking
+ */
int fd_pair(int fd[2])
{
+ int ret;
+
#if HAVE_SOCKETPAIR
- return socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
+ ret = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
#else
- return pipe(fd);
+ ret = pipe(fd);
#endif
+
+ if (ret == 0) {
+ set_nonblocking(fd[0]);
+ set_nonblocking(fd[1]);
+ }
+
+ return ret;
}