]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add a family-independent bindresvport_sa function
authorAndreas Schneider <asn@samba.org>
Tue, 27 May 2014 17:47:22 +0000 (19:47 +0200)
committerGreg Hudson <ghudson@mit.edu>
Fri, 27 Jun 2014 23:36:40 +0000 (19:36 -0400)
This functions allows you to pass IPv4 and IPv6 addresses.  If no
address is given, t will determine the family by checking the socket
with getsockname.

[ghudson@mit.edu: clarified commit message, split out setport helper,
squashed with next commit, minimized code changes from old
bindresvport, used socket-utils.h helpers]

ticket: 7935 (new)

src/include/gssrpc/rename.h
src/include/gssrpc/rpc.h
src/lib/rpc/bindresvport.c

index ecec66ab103df97eb7c30b44d0df9fcce172e3da..444bc97a6302fd4a4b12d656e4f3d81bfe1ee726 100644 (file)
 
 #define get_myaddress          gssrpc_get_myaddress
 #define bindresvport           gssrpc_bindresvport
+#define bindresvport_sa                gssrpc_bindresvport_sa
 #define callrpc                        gssrpc_callrpc
 #define getrpcport             gssrpc_getrpcport
 
index 565f1c2f3dde8be0e7ea9d1fada405f134fa5ef5..2d94a7fe9e2e11da4575da4e989392596e1d8ca8 100644 (file)
@@ -92,6 +92,7 @@
 GSSRPC__BEGIN_DECLS
 extern int get_myaddress(struct sockaddr_in *);
 extern int bindresvport(int, struct sockaddr_in *);
+extern int bindresvport_sa(int, struct sockaddr *);
 extern int callrpc(char *, rpcprog_t, rpcvers_t, rpcproc_t, xdrproc_t,
                   char *, xdrproc_t , char *);
 extern int getrpcport(char *, rpcprog_t, rpcvers_t, rpcprot_t);
index 6755f4db2ac82c47586345961f06ac3ecc26a30c..fa28b60718be6c4a90bbeeb0c532f078aaf0641f 100644 (file)
@@ -1,6 +1,7 @@
 /* lib/rpc/bindresvport.c */
 /*
  * Copyright (c) 2010, Oracle America, Inc.
+ * Copyright (c) 2014, Andreas Schneider <asn@samba.org>
  *
  * All rights reserved.
  *
@@ -33,6 +34,8 @@
  */
 
 #include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/errno.h>
 #include <netinet/in.h>
 #include <gssrpc/rpc.h>
 #include <errno.h>
+#include "socket-utils.h"
 
 /*
  * Bind a socket to a privileged IP port
  */
 int
-bindresvport(int sd, struct sockaddr_in *sockin)
+bindresvport_sa(int sd, struct sockaddr *sa)
 {
        int res;
        static short port;
-       struct sockaddr_in myaddr;
+       struct sockaddr_storage myaddr;
+       socklen_t salen;
        int i;
 
 #define STARTPORT 600
 #define ENDPORT (IPPORT_RESERVED - 1)
 #define NPORTS (ENDPORT - STARTPORT + 1)
-
-       if (sockin == (struct sockaddr_in *)0) {
-               sockin = &myaddr;
-               memset(sockin, 0, sizeof (*sockin));
-               sockin->sin_family = AF_INET;
-       } else if (sockin->sin_family != AF_INET) {
+       if (sa == NULL) {
+               salen = sizeof(myaddr);
+               sa = ss2sa(&myaddr);
+               res = getsockname(sd, sa, &salen);
+               if (res < 0)
+                       return (-1);
+       }
+       if (!sa_is_inet(sa)) {
                errno = EPFNOSUPPORT;
                return (-1);
        }
@@ -70,12 +77,17 @@ bindresvport(int sd, struct sockaddr_in *sockin)
        res = -1;
        errno = EADDRINUSE;
        for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; i++) {
-               sockin->sin_port = htons(port++);
+               sa_setport(sa, htons(port++));
                if (port > ENDPORT) {
                        port = STARTPORT;
                }
-               res = bind(sd, (struct sockaddr *) sockin,
-                          sizeof(struct sockaddr_in));
+               res = bind(sd, sa, socklen(sa));
        }
        return (res);
 }
+
+int
+bindresvport(int sd, struct sockaddr_in *sockin)
+{
+       return (bindresvport_sa(sd, (struct sockaddr *)sockin));
+}