From 227feaf313ae6e10cdfb9d4d79c7f9896c773fe5 Mon Sep 17 00:00:00 2001 From: jkar8572 Date: Thu, 28 Nov 2002 22:02:04 +0000 Subject: Optimized linking with svc_socket.o; fixed error reporting in svc_socket.c (Jan Kara) --- svc_socket.c | 52 +++++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 29 deletions(-) (limited to 'svc_socket.c') diff --git a/svc_socket.c b/svc_socket.c index 4abb37c..27cbfb7 100644 --- a/svc_socket.c +++ b/svc_socket.c @@ -20,42 +20,41 @@ #include #include #include +#include #include #include -#include +#include "common.h" #include "pot.h" static int svc_socket (u_long number, int type, int protocol, int reuse) { struct sockaddr_in addr; - socklen_t len = sizeof (struct sockaddr_in); char rpcdata [1024], servdata [1024]; - struct rpcent rpcbuf, *rpcp; - struct servent servbuf, *servp; + struct rpcent rpcbuf, *rpcp = NULL; + struct servent servbuf, *servp = NULL; int sock, ret; const char *proto = protocol == IPPROTO_TCP ? "tcp" : "udp"; if ((sock = socket (AF_INET, type, protocol)) < 0) { - perror (_("svc_socket: socket creation problem")); - return sock; + errstr(_("Cannot create socket: %s\n"), strerror(errno)); + return -1; } if (reuse) { ret = 1; - ret = setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(ret)); - if (ret < 0) { - perror (_("svc_socket: socket reuse problem")); - return ret; + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(ret)) < 0) { + errstr(_("Cannot set socket options: %s\n"), strerror(errno)); + return -1; } } - memset(&addr, sizeof (addr), 0); + memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; - ret = getrpcbynumber_r (number, &rpcbuf, rpcdata, sizeof(rpcdata), &rpcp); + ret = getrpcbynumber_r(number, &rpcbuf, rpcdata, sizeof(rpcdata), &rpcp); if (ret == 0 && rpcp != NULL) { - /* First try name. */ + /* First try name */ ret = getservbyname_r(rpcp->r_name, proto, &servbuf, servdata, sizeof servdata, &servp); if ((ret != 0 || servp == NULL) && rpcp->r_aliases) { @@ -63,7 +62,7 @@ static int svc_socket (u_long number, int type, int protocol, int reuse) /* Then we try aliases. */ for (a = (const char **) rpcp->r_aliases; *a != NULL; a++) { - ret = getservbyname_r (*a, proto, &servbuf, servdata, + ret = getservbyname_r(*a, proto, &servbuf, servdata, sizeof servdata, &servp); if (ret == 0 && servp != NULL) break; @@ -73,21 +72,16 @@ static int svc_socket (u_long number, int type, int protocol, int reuse) if (ret == 0 && servp != NULL) { addr.sin_port = servp->s_port; - if (bind (sock, (struct sockaddr *) &addr, len) < 0) { - perror (_("svc_socket: bind problem")); + if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) < 0) { + errstr(_("Cannot bind to given address: %s\n"), strerror(errno)); close (sock); - sock = -1; + return -1; } } else { - if (bindresvport (sock, &addr)) { - addr.sin_port = 0; - if (bind (sock, (struct sockaddr *) &addr, len) < 0) { - perror (_("svc_socket: bind problem")); - close (sock); - sock = -1; - } - } + /* Service not found? */ + close(sock); + return -1; } return sock; @@ -96,15 +90,15 @@ static int svc_socket (u_long number, int type, int protocol, int reuse) /* * Create and bind a TCP socket based on program number */ -int svctcp_socket (u_long number, int reuse) +int svctcp_socket(u_long number, int reuse) { - return svc_socket (number, SOCK_STREAM, IPPROTO_TCP, reuse); + return svc_socket(number, SOCK_STREAM, IPPROTO_TCP, reuse); } /* * Create and bind a UDP socket based on program number */ -int svcudp_socket (u_long number, int reuse) +int svcudp_socket(u_long number, int reuse) { - return svc_socket (number, SOCK_DGRAM, IPPROTO_UDP, reuse); + return svc_socket(number, SOCK_DGRAM, IPPROTO_UDP, reuse); } -- cgit v1.2.3