X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Futil.c;h=c1ba9d5abeca516167211cc072575ba591378b79;hb=fb2bd066c2f8b34addafe48d62550e3033a59431;hp=774719e5444cbfe1fdbec65b14c130aa755a8275;hpb=94a044f90357edefa6f4ae9f0b1d5885b0e34aee;p=debian%2Famanda diff --git a/common-src/util.c b/common-src/util.c index 774719e..c1ba9d5 100644 --- a/common-src/util.c +++ b/common-src/util.c @@ -40,8 +40,8 @@ #endif static int make_socket(sa_family_t family); -static int connect_port(struct sockaddr_storage *addrp, in_port_t port, char *proto, - struct sockaddr_storage *svaddr, int nonblock); +static int connect_port(sockaddr_union *addrp, in_port_t port, char *proto, + sockaddr_union *svaddr, int nonblock); /* * Keep calling read() until we've read buflen's worth of data, or EOF, @@ -161,11 +161,11 @@ make_socket( /* return -1 on failure */ int connect_portrange( - struct sockaddr_storage *addrp, + sockaddr_union *addrp, in_port_t first_port, in_port_t last_port, char * proto, - struct sockaddr_storage *svaddr, + sockaddr_union *svaddr, int nonblock) { int s; @@ -173,6 +173,7 @@ connect_portrange( static in_port_t port_in_use[1024]; static int nb_port_in_use = 0; int i; + int save_errno = EAGAIN; assert(first_port <= last_port); /* Try a port already used */ @@ -184,6 +185,8 @@ connect_portrange( if(s > 0) { return s; } + if (errno != EAGAIN && errno != EBUSY) + save_errno = errno; } } @@ -195,12 +198,14 @@ connect_portrange( port_in_use[nb_port_in_use++] = port; return s; } + if (errno != EAGAIN && errno != EBUSY) + save_errno = errno; } dbprintf(_("connect_portrange: All ports between %d and %d are busy.\n"), first_port, last_port); - errno = EAGAIN; + errno = save_errno; return -1; } @@ -211,28 +216,29 @@ connect_portrange( /* return >0: this is the connected socket */ int connect_port( - struct sockaddr_storage *addrp, + sockaddr_union *addrp, in_port_t port, char * proto, - struct sockaddr_storage *svaddr, + sockaddr_union *svaddr, int nonblock) { int save_errno; struct servent * servPort; - socklen_t len; - socklen_t socklen; + socklen_t_equiv len; + socklen_t_equiv socklen; int s; servPort = getservbyport((int)htons(port), proto); if (servPort != NULL && !strstr(servPort->s_name, "amanda")) { dbprintf(_("connect_port: Skip port %d: owned by %s.\n"), port, servPort->s_name); + errno = EBUSY; return -1; } - if ((s = make_socket(addrp->ss_family)) == -1) return -2; + if ((s = make_socket(SU_GET_FAMILY(addrp))) == -1) return -2; - SS_SET_PORT(addrp, port); + SU_SET_PORT(addrp, port); socklen = SS_LEN(addrp); if (bind(s, (struct sockaddr *)addrp, socklen) != 0) { save_errno = errno; @@ -309,16 +315,17 @@ connect_port( int bind_portrange( int s, - struct sockaddr_storage *addrp, + sockaddr_union *addrp, in_port_t first_port, in_port_t last_port, char * proto) { in_port_t port; in_port_t cnt; - socklen_t socklen; + socklen_t_equiv socklen; struct servent *servPort; const in_port_t num_ports = (in_port_t)(last_port - first_port + 1); + int save_errno = EAGAIN; assert(first_port <= last_port); @@ -336,7 +343,7 @@ bind_portrange( for (cnt = 0; cnt < num_ports; cnt++) { servPort = getservbyport((int)htons(port), proto); if ((servPort == NULL) || strstr(servPort->s_name, "amanda")) { - SS_SET_PORT(addrp, port); + SU_SET_PORT(addrp, port); socklen = SS_LEN(addrp); if (bind(s, (struct sockaddr *)addrp, socklen) >= 0) { if (servPort == NULL) { @@ -346,6 +353,8 @@ bind_portrange( } return 0; } + if (errno != EAGAIN && errno != EBUSY) + save_errno = errno; if (servPort == NULL) { dbprintf(_("bind_portrange2: Try port %d: Available - %s\n"), port, strerror(errno)); @@ -363,7 +372,7 @@ bind_portrange( dbprintf(_("bind_portrange: all ports between %d and %d busy\n"), first_port, last_port); - errno = EAGAIN; + errno = save_errno; return -1; }