]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/rpcmisc.c
2002-09-15 Chip Salzenberg <chip@pobox.com>
[nfs-utils.git] / support / nfs / rpcmisc.c
index 6eb24a2b3a5237a3be088589e8fadb2305d68914..7a100c2eff618f089c1c9c0b7712bc1fde250992 100644 (file)
@@ -50,11 +50,10 @@ rpc_init(char *name, int prog, int vers, void (*dispatch)(), int defport)
 
        asize = sizeof(saddr);
        sock = 0;
-       if (getsockname(0, (struct sockaddr *) &saddr, &asize) == 0) {
+       if (getsockname(0, (struct sockaddr *) &saddr, &asize) == 0
+           && saddr.sin_family == AF_INET) {
                int ssize = sizeof (int);
                _rpcfdtype = 0;
-               if (saddr.sin_family != AF_INET)
-                       xlog(L_FATAL, "init: stdin is bound to non-inet addr");
                if (getsockopt(0, SOL_SOCKET, SO_TYPE,
                                (char *)&_rpcfdtype, &ssize) == -1)
                        xlog(L_FATAL, "getsockopt failed: %s", strerror(errno));
@@ -73,11 +72,15 @@ rpc_init(char *name, int prog, int vers, void (*dispatch)(), int defport)
                                transp = last_transp;
                                goto udp_transport;
                        }
-                       if ((sock = makesock(defport, IPPROTO_UDP)) < 0) {
+                       if (defport == 0)
+                               sock = RPC_ANYSOCK;
+                       else if ((sock = makesock(defport, IPPROTO_UDP)) < 0) {
                                xlog(L_FATAL, "%s: cannot make a UDP socket\n",
                                                name);
                        }
                }
+               if (sock == RPC_ANYSOCK)
+                       sock = svcudp_socket (prog, 1);
                transp = svcudp_create(sock);
                if (transp == NULL) {
                        xlog(L_FATAL, "cannot create udp service.");
@@ -99,11 +102,15 @@ rpc_init(char *name, int prog, int vers, void (*dispatch)(), int defport)
                                transp = last_transp;
                                goto tcp_transport;
                        }
-                       if ((sock = makesock(defport, IPPROTO_TCP)) < 0) {
+                       if (defport == 0)
+                               sock = RPC_ANYSOCK;
+                       else if ((sock = makesock(defport, IPPROTO_TCP)) < 0) {
                                xlog(L_FATAL, "%s: cannot make a TCP socket\n",
                                                name);
                        }
                }
+               if (sock == RPC_ANYSOCK)
+                       sock = svctcp_socket (prog, 1);
                transp = svctcp_create(sock, 0, 0);
                if (transp == NULL) {
                        xlog(L_FATAL, "cannot create tcp service.");