]> granicus.if.org Git - libtirpc/commitdiff
Introduce __rpc_set_netbuf helper
authorOlaf Kirch <okir@suse.de>
Tue, 30 Sep 2008 19:06:54 +0000 (15:06 -0400)
committerSteve Dickson <steved@redhat.com>
Tue, 30 Sep 2008 19:06:54 +0000 (15:06 -0400)
The RPC code contains a number of places where a netbuf
is initialized with some data. All the mem_alloc/memcpy
stuff is open-coded. Introduce a helper function and
convert the code.

Signed-off-by: Olaf Kirch <okir@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
src/rpc_com.h
src/rpc_generic.c
src/svc_dg.c
src/svc_vc.c

index a93508000e668de5338d3c1973f54b4cbc54de27..0981471445afedd865389d81c21ab5d5c5a0b132 100644 (file)
@@ -61,6 +61,7 @@ extern u_int __rpc_get_a_size(int);
 extern int __rpc_dtbsize(void);
 extern struct netconfig * __rpcgettp(int);
 extern  int  __rpc_get_default_domain(char **);
+struct netbuf *__rpc_set_netbuf(struct netbuf *, const void *, size_t);
 
 char *__rpc_taddr2uaddr_af(int, const struct netbuf *);
 struct netbuf *__rpc_uaddr2taddr_af(int, const char *);
index b436e3aa8919f81f84c9160beb5e99a7bf77deac..9ada6684c5b3dc843ebb70ea562023a28f759004 100644 (file)
@@ -833,3 +833,22 @@ __rpc_sockisbound(int fd)
 
        return 0;
 }
+
+/*
+ * Helper function to set up a netbuf
+ */
+struct netbuf *
+__rpc_set_netbuf(struct netbuf *nb, const void *ptr, size_t len)
+{
+       if (nb->len != len) {
+               if (nb->len)
+                       mem_free(nb->buf, nb->len);
+               nb->buf = mem_alloc(len);
+               if (nb->buf == NULL)
+                       return NULL;
+
+               nb->maxlen = nb->len = len;
+       }
+       memcpy(nb->buf, ptr, len);
+       return nb;
+}
index 76a480ebd007595e6e25e24091755b2bef2d1422..7df470e6903fdef7be8abdc56fba1b3eb6f5ca4c 100644 (file)
@@ -140,10 +140,7 @@ svc_dg_create(fd, sendsize, recvsize)
        slen = sizeof ss;
        if (getsockname(fd, (struct sockaddr *)(void *)&ss, &slen) < 0)
                goto freedata;
-       xprt->xp_ltaddr.buf = mem_alloc(sizeof (struct sockaddr_storage));
-       xprt->xp_ltaddr.maxlen = sizeof (struct sockaddr_storage);
-       xprt->xp_ltaddr.len = slen;
-       memcpy(xprt->xp_ltaddr.buf, &ss, slen);
+       __rpc_set_netbuf(&xprt->xp_ltaddr, &ss, slen);
 
        xprt_register(xprt);
        return (xprt);
@@ -186,13 +183,8 @@ again:
                goto again;
        if (rlen == -1 || (rlen < (ssize_t)(4 * sizeof (u_int32_t))))
                return (FALSE);
-       if (xprt->xp_rtaddr.len < alen) {
-               if (xprt->xp_rtaddr.len != 0)
-                       mem_free(xprt->xp_rtaddr.buf, xprt->xp_rtaddr.len);
-               xprt->xp_rtaddr.buf = mem_alloc(alen);
-               xprt->xp_rtaddr.len = alen;
-       }
-       memcpy(xprt->xp_rtaddr.buf, &ss, alen);
+       __rpc_set_netbuf(&xprt->xp_rtaddr, &ss, alen);
+
        __xprt_set_raddr(xprt, &ss);
        xdrs->x_op = XDR_DECODE;
        XDR_SETPOS(xdrs, 0);
index 0d532a08a3154fbcafbc236f0602914b86d528c1..44d3497bb75b8d3a99f772e0f6a88e188c00ac8a 100644 (file)
@@ -184,14 +184,10 @@ svc_vc_create(fd, sendsize, recvsize)
                goto cleanup_svc_vc_create;
        }
 
-       xprt->xp_ltaddr.maxlen = xprt->xp_ltaddr.len = sizeof(sslocal);
-       xprt->xp_ltaddr.buf = mem_alloc((size_t)sizeof(sslocal));
-       if (xprt->xp_ltaddr.buf == NULL) {
+       if (!__rpc_set_netbuf(&xprt->xp_ltaddr, &sslocal, sizeof(sslocal))) {
                warnx("svc_vc_create: no mem for local addr");
                goto cleanup_svc_vc_create;
        }
-       memcpy(xprt->xp_ltaddr.buf, &sslocal, (size_t)sizeof(sslocal));
-       xprt->xp_rtaddr.maxlen = sizeof (struct sockaddr_storage);
        xprt_register(xprt);
        return (xprt);
 cleanup_svc_vc_create:
@@ -225,25 +221,20 @@ svc_fd_create(fd, sendsize, recvsize)
                warnx("svc_fd_create: could not retrieve local addr");
                goto freedata;
        }
-       ret->xp_ltaddr.maxlen = ret->xp_ltaddr.len = sizeof(ss);
-       ret->xp_ltaddr.buf = mem_alloc((size_t)sizeof(ss));
-       if (ret->xp_ltaddr.buf == NULL) {
+       if (!__rpc_set_netbuf(&ret->xp_ltaddr, &ss, sizeof(ss))) {
                warnx("svc_fd_create: no mem for local addr");
                goto freedata;
        }
-       memcpy(ret->xp_ltaddr.buf, &ss, (size_t)sizeof(ss));
+
        slen = sizeof (struct sockaddr_storage);
        if (getpeername(fd, (struct sockaddr *)(void *)&ss, &slen) < 0) {
                warnx("svc_fd_create: could not retrieve remote addr");
                goto freedata;
        }
-       ret->xp_rtaddr.maxlen = ret->xp_rtaddr.len = sizeof(ss);
-       ret->xp_rtaddr.buf = mem_alloc((size_t)sizeof(ss));
-       if (ret->xp_rtaddr.buf == NULL) {
+       if (!__rpc_set_netbuf(&ret->xp_rtaddr, &ss, sizeof(ss))) {
                warnx("svc_fd_create: no mem for local addr");
                goto freedata;
        }
-       memcpy(ret->xp_rtaddr.buf, &ss, (size_t)sizeof(ss));
 
        /* Set xp_raddr for compatibility */
        __xprt_set_raddr(ret, &ss);
@@ -340,12 +331,9 @@ again:
         */
 
        newxprt = makefd_xprt(sock, r->sendsize, r->recvsize);
-       newxprt->xp_rtaddr.buf = mem_alloc(len);
-       if (newxprt->xp_rtaddr.buf == NULL)
-               return (FALSE);
 
-       memcpy(newxprt->xp_rtaddr.buf, &addr, len);
-       newxprt->xp_rtaddr.maxlen = newxprt->xp_rtaddr.len = len;
+       if (!__rpc_set_netbuf(&newxprt->xp_rtaddr, &addr, len))
+               return (FALSE);
 
        __xprt_set_raddr(newxprt, &addr);