summaryrefslogtreecommitdiff
path: root/svc_socket.c
diff options
context:
space:
mode:
authorjkar8572 <jkar8572>2002-11-28 22:02:04 +0000
committerjkar8572 <jkar8572>2002-11-28 22:02:04 +0000
commit227feaf313ae6e10cdfb9d4d79c7f9896c773fe5 (patch)
treefe122c51be60c57291a998dafbb6dbe8076e341f /svc_socket.c
parentc243c5801fe4f8be02c8f716ca2897b083e27c74 (diff)
Optimized linking with svc_socket.o; fixed error reporting in svc_socket.c (Jan Kara)
Diffstat (limited to 'svc_socket.c')
-rw-r--r--svc_socket.c52
1 files changed, 23 insertions, 29 deletions
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 <string.h>
#include <unistd.h>
#include <netdb.h>
+#include <errno.h>
#include <rpc/rpc.h>
#include <sys/socket.h>
-#include <errno.h>
+#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);
}