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
Incremented the version to 2.6.9cvs.
[rsync/rsync.git]
/
socket.c
diff --git
a/socket.c
b/socket.c
index
8a96061
..
c2f534e
100644
(file)
--- a/
socket.c
+++ b/
socket.c
@@
-32,6
+32,8
@@
**/
#include "rsync.h"
**/
#include "rsync.h"
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
extern char *bind_address;
extern int default_af_hint;
extern char *bind_address;
extern int default_af_hint;
@@
-333,9
+335,9
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
int af_hint)
{
int one = 1;
int af_hint)
{
int one = 1;
- int s, *socks, maxs, i;
+ int s, *socks, maxs, i
, ecnt
;
struct addrinfo hints, *all_ai, *resp;
struct addrinfo hints, *all_ai, *resp;
- char portbuf[10];
+ char portbuf[10]
, **errmsgs
;
int error;
memset(&hints, 0, sizeof hints);
int error;
memset(&hints, 0, sizeof hints);
@@
-353,17
+355,25
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
/* Count max number of sockets we might open. */
for (maxs = 0, resp = all_ai; resp; resp = resp->ai_next, maxs++) {}
/* Count max number of sockets we might open. */
for (maxs = 0, resp = all_ai; resp; resp = resp->ai_next, maxs++) {}
- if (!(socks = new_array(int, maxs + 1)))
+ socks = new_array(int, maxs + 1);
+ errmsgs = new_array(char *, maxs);
+ if (!socks || !errmsgs)
out_of_memory("open_socket_in");
/* We may not be able to create the socket, if for example the
* machine knows about IPv6 in the C library, but not in the
* kernel. */
out_of_memory("open_socket_in");
/* We may not be able to create the socket, if for example the
* machine knows about IPv6 in the C library, but not in the
* kernel. */
- for (resp = all_ai, i = 0; resp; resp = resp->ai_next) {
+ for (resp = all_ai, i =
ecnt =
0; resp; resp = resp->ai_next) {
s = socket(resp->ai_family, resp->ai_socktype,
resp->ai_protocol);
if (s == -1) {
s = socket(resp->ai_family, resp->ai_socktype,
resp->ai_protocol);
if (s == -1) {
+ int r = asprintf(&errmsgs[ecnt++],
+ "socket(%d,%d,%d) failed: %s\n",
+ (int)resp->ai_family, (int)resp->ai_socktype,
+ (int)resp->ai_protocol, strerror(errno));
+ if (r < 0)
+ out_of_memory("open_socket_in");
/* See if there's another address that will work... */
continue;
}
/* See if there's another address that will work... */
continue;
}
@@
-385,6
+395,11
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
/* Now we've got a socket - we need to bind it. */
if (bind(s, resp->ai_addr, resp->ai_addrlen) < 0) {
/* Nope, try another */
/* Now we've got a socket - we need to bind it. */
if (bind(s, resp->ai_addr, resp->ai_addrlen) < 0) {
/* Nope, try another */
+ int r = asprintf(&errmsgs[ecnt++],
+ "bind() failed: %s (address-family %d)\n",
+ strerror(errno), (int)resp->ai_family);
+ if (r < 0)
+ out_of_memory("open_socket_in");
close(s);
continue;
}
close(s);
continue;
}
@@
-396,6
+411,15
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
if (all_ai)
freeaddrinfo(all_ai);
if (all_ai)
freeaddrinfo(all_ai);
+ /* 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)
+ rwrite(FLOG, errmsgs[s], strlen(errmsgs[s]));
+ free(errmsgs[s]);
+ }
+ free(errmsgs);
+
if (!i) {
rprintf(FERROR,
"unable to bind any inbound sockets on port %d\n",
if (!i) {
rprintf(FERROR,
"unable to bind any inbound sockets on port %d\n",