The following reply was made to PR bin/160295; it has been noted by GNATS.

From: Dylan Alex Simon <dy...@dylex.net>
To: bug-follo...@freebsd.org
Cc:  
Subject: Re: bin/160295: ypserv -P [bin/109494] breaks tcp
Date: Tue, 30 Aug 2011 12:15:19 -0400

 --6TrnltStXW4iwmi0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 Attached is a patch that seems to work.  However, there seems to be another
 bug using ypserv -d where it exits ypproc_all_2_svc at the end even though it
 hasn't forked (PR #10970 collateral?), so I can't test completely.  (I'm
 trying to get automount maps in linux to pull from FreeBSD NIS, which still
 isn't working.)
 
 --6TrnltStXW4iwmi0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="yp_main.c.diff"
 
 --- yp_main.c.orig     2011-08-30 11:15:33.595224119 -0400
 +++ yp_main.c  2011-08-30 11:15:21.375092957 -0400
 @@ -84,16 +84,6 @@
  int do_dns = 0;
  int resfd;
  
 -struct socktype {
 -      const char *st_name;
 -      int        st_type;
 -};
 -static struct socktype stlist[] = {
 -      { "tcp", SOCK_STREAM },
 -      { "udp", SOCK_DGRAM },
 -      { NULL, 0 }
 -};
 -
  static
  void _msgout(char* msg)
  {
 @@ -235,14 +225,13 @@
  main(int argc, char *argv[])
  {
        register SVCXPRT *transp = NULL;
 -      int sock;
 +      int sock_udp = -1, sock_tcp = -1;
        int proto = 0;
        struct sockaddr_in saddr;
        socklen_t asize = sizeof (saddr);
        int ch;
        in_port_t yp_port = 0;
        char *errstr;
 -      struct socktype *st;
  
        while ((ch = getopt(argc, argv, "hdnp:P:")) != -1) {
                switch (ch) {
 @@ -282,7 +271,10 @@
                if (getsockopt(0, SOL_SOCKET, SO_TYPE,
                                (char *)&_rpcfdtype, &ssize) == -1)
                        exit(1);
 -              sock = 0;
 +              if (_rpcfdtype == SOCK_DGRAM)
 +                      sock_udp = 0;
 +              else if (_rpcfdtype == SOCK_STREAM)
 +                      sock_tcp = 0;
                _rpcpmstart = 1;
                proto = 0;
                openlog("ypserv", LOG_PID, LOG_DAEMON);
 @@ -293,46 +285,49 @@
                        }
                        openlog("ypserv", LOG_PID, LOG_DAEMON);
                }
 -              sock = RPC_ANYSOCK;
 +              sock_udp = sock_tcp = RPC_ANYSOCK;
                (void) pmap_unset(YPPROG, YPVERS);
                (void) pmap_unset(YPPROG, 1);
        }
  
        /*
         * Initialize TCP/UDP sockets.
 +       * Really should only do this if !_rpcpmstart.
         */
 -      memset((char *)&saddr, 0, sizeof(saddr));
 -      saddr.sin_family = AF_INET;
 -      saddr.sin_addr.s_addr = htonl(INADDR_ANY);
 -      saddr.sin_port = htons(yp_port);
 -      for (st = stlist; st->st_name != NULL; st++) {
 -              /* Do not bind the socket if the user didn't specify a port */
 -              if (yp_port == 0)
 -                      break;
 +      if (yp_port)
 +      {
 +              memset((char *)&saddr, 0, sizeof(saddr));
 +              saddr.sin_family = AF_INET;
 +              saddr.sin_addr.s_addr = htonl(INADDR_ANY);
 +              saddr.sin_port = htons(yp_port);
 +
 +              sock_udp = socket(AF_INET, SOCK_DGRAM, 0);
 +              if (sock_udp == -1) {
 +                      _msgout("cannot create a udp socket");
 +                      exit(1);
 +              }
  
 -              sock = socket(AF_INET, st->st_type, 0);
 -              if (sock == -1) {
 -                      if ((asprintf(&errstr, "cannot create a %s socket",
 -                          st->st_name)) == -1)
 -                              err(1, "unexpected failure in asprintf()");
 -                      _msgout(errstr);
 -                      free((void *)errstr);
 +              if (bind(sock_udp, (struct sockaddr *) &saddr, sizeof(saddr))
 +                  == -1) {
 +                      _msgout("cannot bind udp socket");
                        exit(1);
                }
 -              if (bind(sock, (struct sockaddr *) &saddr, sizeof(saddr))
 +
 +              sock_tcp = socket(AF_INET, SOCK_STREAM, 0);
 +              if (sock_tcp == -1) {
 +                      _msgout("cannot create a tcp socket");
 +                      exit(1);
 +              }
 +
 +              if (bind(sock_tcp, (struct sockaddr *) &saddr, sizeof(saddr))
                    == -1) {
 -                      if ((asprintf(&errstr, "cannot bind %s socket",
 -                          st->st_name)) == -1)
 -                              err(1, "unexpected failure in asprintf()");
 -                      _msgout(errstr);
 -                      free((void *)errstr);
 +                      _msgout("cannot bind tcp socket");
                        exit(1);
                }
 -              errstr = NULL;
        }
  
        if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_DGRAM)) {
 -              transp = svcudp_create(sock);
 +              transp = svcudp_create(sock_udp);
                if (transp == NULL) {
                        _msgout("cannot create udp service");
                        exit(1);
 @@ -350,7 +345,7 @@
        }
  
        if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_STREAM)) {
 -              transp = svctcp_create(sock, 0, 0);
 +              transp = svctcp_create(sock_tcp, 0, 0);
                if (transp == NULL) {
                        _msgout("cannot create tcp service");
                        exit(1);
 
 --6TrnltStXW4iwmi0--
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to