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
Avoid a double-increment of a file's st_dev value
[rsync/rsync.git]
/
socket.c
diff --git
a/socket.c
b/socket.c
index
65ee61a
..
5df3a50
100644
(file)
--- a/
socket.c
+++ b/
socket.c
@@
-3,7
+3,7
@@
*
* Copyright (C) 1992-2001 Andrew Tridgell <tridge@samba.org>
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
*
* Copyright (C) 1992-2001 Andrew Tridgell <tridge@samba.org>
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
- * Copyright (C) 2003-200
8
Wayne Davison
+ * Copyright (C) 2003-200
9
Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@
-25,12
+25,13
@@
* emulate it using the KAME implementation. */
#include "rsync.h"
* emulate it using the KAME implementation. */
#include "rsync.h"
-#include "i
func
s.h"
+#include "i
type
s.h"
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
extern char *bind_address;
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
extern char *bind_address;
+extern char *sockopts;
extern int default_af_hint;
extern int connect_timeout;
extern int default_af_hint;
extern int connect_timeout;
@@
-231,7
+232,7
@@
int open_socket_out(char *host, int port, const char *bind_addr,
}
*cp++ = '\0';
strlcpy(portbuf, cp, sizeof portbuf);
}
*cp++ = '\0';
strlcpy(portbuf, cp, sizeof portbuf);
- if (
verbose >= 2
) {
+ if (
DEBUG_GTE(CONNECT, 1)
) {
rprintf(FINFO, "connection via http proxy %s port %s\n",
h, portbuf);
}
rprintf(FINFO, "connection via http proxy %s port %s\n",
h, portbuf);
}
@@
-272,6
+273,7
@@
int open_socket_out(char *host, int port, const char *bind_addr,
alarm(connect_timeout);
}
alarm(connect_timeout);
}
+ set_socket_options(s, sockopts);
while (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
if (connect_timeout < 0)
exit_cleanup(RERR_CONTIMEOUT);
while (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
if (connect_timeout < 0)
exit_cleanup(RERR_CONTIMEOUT);
@@
-359,7
+361,7
@@
int open_socket_out_wrapped(char *host, int port, const char *bind_addr,
*t = '\0';
}
*t = '\0';
}
- if (
verbose >= 2
) {
+ if (
DEBUG_GTE(CONNECT, 1)
) {
rprintf(FINFO, "%sopening tcp connection to %s port %d\n",
prog ? "Using RSYNC_CONNECT_PROG instead of " : "",
host, port);
rprintf(FINFO, "%sopening tcp connection to %s port %d\n",
prog ? "Using RSYNC_CONNECT_PROG instead of " : "",
host, port);
@@
-433,6
+435,10
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
(char *)&one, sizeof one);
setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
(char *)&one, sizeof one);
+ if (sockopts)
+ set_socket_options(s, sockopts);
+ else
+ set_socket_options(s, lp_socket_options());
#ifdef IPV6_V6ONLY
if (resp->ai_family == AF_INET6) {
#ifdef IPV6_V6ONLY
if (resp->ai_family == AF_INET6) {
@@
-467,7
+473,7
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
/* Only output the socket()/bind() messages if we were totally
* unsuccessful, or if the daemon is being run with -vv. */
for (s = 0; s < ecnt; s++) {
/* Only output the socket()/bind() messages if we were totally
* unsuccessful, or if the daemon is being run with -vv. */
for (s = 0; s < ecnt; s++) {
- if (!i ||
verbose > 1
)
+ if (!i ||
DEBUG_GTE(BIND, 1)
)
rwrite(FLOG, errmsgs[s], strlen(errmsgs[s]), 0);
free(errmsgs[s]);
}
rwrite(FLOG, errmsgs[s], strlen(errmsgs[s]), 0);
free(errmsgs[s]);
}
@@
-572,7
+578,7
@@
void start_accept_loop(int port, int (*fn)(int, int))
fds = deffds;
#endif
fds = deffds;
#endif
- if (select(maxfd + 1, &fds, NULL, NULL, NULL)
!=
1)
+ if (select(maxfd + 1, &fds, NULL, NULL, NULL)
<
1)
continue;
for (i = 0, fd = -1; sp[i] >= 0; i++) {
continue;
for (i = 0, fd = -1; sp[i] >= 0; i++) {
@@
-817,22
+823,32
@@
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) {
rsyserr(FERROR, errno, "socketpair_tcp failed");
return -1;
}
int fd[2];
if (socketpair_tcp(fd) != 0) {
rsyserr(FERROR, errno, "socketpair_tcp failed");
return -1;
}
- if (
verbose >= 2
)
+ if (
DEBUG_GTE(CMD, 1)
)
rprintf(FINFO, "Running socket program: \"%s\"\n", prog);
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];
}