fdwalk should return 0 on an empty directory
[kopensolaris-gnu/glibc.git] / sunrpc / svc_tcp.c
index 94bfb33..539a2b8 100644 (file)
@@ -52,8 +52,8 @@ static char sccsid[] = "@(#)svc_tcp.c 1.21 87/08/11 Copyr 1984 Sun Micro";
 #include <stdlib.h>
 
 #ifdef USE_IN_LIBIO
+# include <wchar.h>
 # include <libio/iolibio.h>
-# define fputs(s, f) _IO_fputs (s, f)
 #endif
 
 /*
@@ -81,14 +81,23 @@ static const struct xp_ops svctcp_op =
  */
 static bool_t rendezvous_request (SVCXPRT *, struct rpc_msg *);
 static enum xprt_stat rendezvous_stat (SVCXPRT *);
+static void svctcp_rendezvous_abort (void) __attribute__ ((__noreturn__));
+
+/* This function makes sure abort() relocation goes through PLT
+   and thus can be lazy bound.  */
+static void
+svctcp_rendezvous_abort (void)
+{
+  abort ();
+};
 
 static const struct xp_ops svctcp_rendezvous_op =
 {
   rendezvous_request,
   rendezvous_stat,
-  (bool_t (*) (SVCXPRT *, xdrproc_t, caddr_t)) abort,
-  (bool_t (*) (SVCXPRT *, struct rpc_msg *)) abort,
-  (bool_t (*) (SVCXPRT *, xdrproc_t, caddr_t)) abort,
+  (bool_t (*) (SVCXPRT *, xdrproc_t, caddr_t)) svctcp_rendezvous_abort,
+  (bool_t (*) (SVCXPRT *, struct rpc_msg *)) svctcp_rendezvous_abort,
+  (bool_t (*) (SVCXPRT *, xdrproc_t, caddr_t)) svctcp_rendezvous_abort,
   svctcp_destroy
 };
 
@@ -153,10 +162,10 @@ svctcp_create (int sock, u_int sendsize, u_int recvsize)
   if (bindresvport (sock, &addr))
     {
       addr.sin_port = 0;
-      (void) bind (sock, (struct sockaddr *) &addr, len);
+      (void) __bind (sock, (struct sockaddr *) &addr, len);
     }
-  if ((getsockname (sock, (struct sockaddr *) &addr, &len) != 0) ||
-      (listen (sock, 2) != 0))
+  if ((__getsockname (sock, (struct sockaddr *) &addr, &len) != 0) ||
+      (__listen (sock, SOMAXCONN) != 0))
     {
       perror (_("svc_tcp.c - cannot getsockname or listen"));
       if (madesock)
@@ -164,19 +173,16 @@ svctcp_create (int sock, u_int sendsize, u_int recvsize)
       return (SVCXPRT *) NULL;
     }
   r = (struct tcp_rendezvous *) mem_alloc (sizeof (*r));
-  if (r == NULL)
+  xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT));
+  if (r == NULL || xprt == NULL)
     {
-      (void) fputs (_("svctcp_create: out of memory\n"), stderr);
+      (void) __fxprintf (NULL, "%s", _("svctcp_create: out of memory\n"));
+      mem_free (r, sizeof (*r));
+      mem_free (xprt, sizeof (SVCXPRT));
       return NULL;
     }
   r->sendsize = sendsize;
   r->recvsize = recvsize;
-  xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT));
-  if (xprt == NULL)
-    {
-      (void) fputs (_("svctcp_create: out of memory\n"), stderr);
-      return NULL;
-    }
   xprt->xp_p2 = NULL;
   xprt->xp_p1 = (caddr_t) r;
   xprt->xp_verf = _null_auth;
@@ -205,22 +211,18 @@ makefd_xprt (int fd, u_int sendsize, u_int recvsize)
   struct tcp_conn *cd;
 
   xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT));
-  if (xprt == (SVCXPRT *) NULL)
-    {
-      (void) fputs (_("svc_tcp: makefd_xprt: out of memory\n"), stderr);
-      goto done;
-    }
   cd = (struct tcp_conn *) mem_alloc (sizeof (struct tcp_conn));
-  if (cd == (struct tcp_conn *) NULL)
+  if (xprt == (SVCXPRT *) NULL || cd == NULL)
     {
-      (void) fputs (_("svc_tcp: makefd_xprt: out of memory\n"), stderr);
-      mem_free ((char *) xprt, sizeof (SVCXPRT));
-      xprt = (SVCXPRT *) NULL;
-      goto done;
+      (void) __fxprintf (NULL, "%s",
+                        _("svc_tcp: makefd_xprt: out of memory\n"));
+      mem_free (xprt, sizeof (SVCXPRT));
+      mem_free (cd, sizeof (struct tcp_conn));
+      return NULL;
     }
   cd->strm_stat = XPRT_IDLE;
-  xdrrec_create (&(cd->xdrs), sendsize, recvsize,
-                (caddr_t) xprt, readtcp, writetcp);
+  INTUSE(xdrrec_create) (&(cd->xdrs), sendsize, recvsize,
+                        (caddr_t) xprt, readtcp, writetcp);
   xprt->xp_p2 = NULL;
   xprt->xp_p1 = (caddr_t) cd;
   xprt->xp_verf.oa_base = cd->verf_body;
@@ -229,7 +231,6 @@ makefd_xprt (int fd, u_int sendsize, u_int recvsize)
   xprt->xp_port = 0;           /* this is a connection, not a rendezvouser */
   xprt->xp_sock = fd;
   xprt_register (xprt);
-done:
   return xprt;
 }
 
@@ -358,7 +359,7 @@ svctcp_stat (SVCXPRT *xprt)
 
   if (cd->strm_stat == XPRT_DIED)
     return XPRT_DIED;
-  if (!xdrrec_eof (&(cd->xdrs)))
+  if (!INTUSE(xdrrec_eof) (&(cd->xdrs)))
     return XPRT_MOREREQS;
   return XPRT_IDLE;
 }
@@ -370,8 +371,8 @@ svctcp_recv (SVCXPRT *xprt, struct rpc_msg *msg)
   XDR *xdrs = &(cd->xdrs);
 
   xdrs->x_op = XDR_DECODE;
-  (void) xdrrec_skiprecord (xdrs);
-  if (xdr_callmsg (xdrs, msg))
+  (void) INTUSE(xdrrec_skiprecord) (xdrs);
+  if (INTUSE(xdr_callmsg) (xdrs, msg))
     {
       cd->x_id = msg->rm_xid;
       return TRUE;
@@ -405,7 +406,7 @@ svctcp_reply (SVCXPRT *xprt, struct rpc_msg *msg)
 
   xdrs->x_op = XDR_ENCODE;
   msg->rm_xid = cd->x_id;
-  stat = xdr_replymsg (xdrs, msg);
-  (void) xdrrec_endofrecord (xdrs, TRUE);
+  stat = INTUSE(xdr_replymsg) (xdrs, msg);
+  (void) INTUSE(xdrrec_endofrecord) (xdrs, TRUE);
   return stat;
 }