Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 May 2012 16:56:38 +0000
From:      exxo@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r236601 - in soc2012/exxo: . head/contrib/cvs/src patches regress
Message-ID:  <20120528165638.09495106566B@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: exxo
Date: Mon May 28 16:56:37 2012
New Revision: 236601
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236601

Log:
  Modify tree and provide software notes

Added:
  soc2012/exxo/patches/
  soc2012/exxo/patches/cvs-inet6.patch
  soc2012/exxo/regress/
  soc2012/exxo/softnotes.txt
Modified:
  soc2012/exxo/   (props changed)
  soc2012/exxo/head/contrib/cvs/src/client.c

Modified: soc2012/exxo/head/contrib/cvs/src/client.c
==============================================================================
--- soc2012/exxo/head/contrib/cvs/src/client.c	Mon May 28 15:34:55 2012	(r236600)
+++ soc2012/exxo/head/contrib/cvs/src/client.c	Mon May 28 16:56:37 2012	(r236601)
@@ -85,7 +85,7 @@
 /* This is needed for GSSAPI encryption.  */
 static gss_ctx_id_t gcontext;
 
-static int connect_to_gserver PROTO((cvsroot_t *, int, struct hostent *));
+static int connect_to_gserver PROTO((cvsroot_t *, int, const char *));
 
 # endif /* HAVE_GSSAPI */
 
@@ -149,7 +149,7 @@
 static size_t try_read_from_server PROTO ((char *, size_t));
 
 static void auth_server PROTO ((cvsroot_t *, struct buffer *, struct buffer *,
-				int, int, struct hostent *));
+				int, int, const char *));
 
 /* We need to keep track of the list of directories we've sent to the
    server.  This list, along with the current CVSROOT, will help us
@@ -3605,6 +3605,28 @@
     return hostinfo;
 }
 
+static void
+_inet_ntop(int af, struct sockaddr *sa, char *addr, socklen_t len)
+{
+    struct sockaddr_in *sin;
+    struct sockaddr_in6 *sin6;
+
+    addr[0] = '\0';
+    assert(af == sa->sa_family);
+    switch (af)
+    {
+    case AF_INET6:
+	    sin6 = (struct sockaddr_in6 *)sa;
+	    inet_ntop(af, &sin6->sin6_addr, addr, len);
+	    break;
+    case AF_INET:
+	    sin = (struct sockaddr_in *)sa;
+	    inet_ntop(af, &sin->sin_addr, addr, len);
+	    break;
+    default:
+	    break;
+    }
+}
 
 
 /* Generic function to do port number lookup tasks.
@@ -3779,33 +3801,75 @@
 {
     int sock;
     int port_number;
-    struct sockaddr_in client_sai;
-    struct hostent *hostinfo;
     struct buffer *to_server, *from_server;
+    struct addrinfo hints, *res, *res0, *ress;
+    int err, cause;
+    char ports[7], addr[INET6_ADDRSTRLEN];
 
-    sock = socket (AF_INET, SOCK_STREAM, 0);
-    if (sock == -1)
-    {
-	error (1, 0, "cannot create socket: %s", SOCK_STRERROR (SOCK_ERRNO));
-    }
     port_number = get_cvs_port_number (root);
-    hostinfo = init_sockaddr (&client_sai, root->hostname, port_number);
-    if (trace)
+    snprintf(ports, sizeof(ports), "%d", port_number);
+
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_flags = AI_CANONNAME;
+    hints.ai_family = PF_UNSPEC;
+    hints.ai_socktype = SOCK_STREAM;
+    err = getaddrinfo(root->hostname, ports, &hints, &res0);
+    if (err)
     {
-	fprintf (stderr, " -> Connecting to %s(%s):%d\n",
-		 root->hostname,
-		 inet_ntoa (client_sai.sin_addr), port_number);
+	error(1, 0, "%s", gai_strerror(err));
+    }
+    sock = -1;
+    cause = 0;
+    for (res = res0; res; res = res->ai_next) {
+	sock = socket(res->ai_family, res->ai_socktype,
+	    res->ai_protocol);
+	if (sock < 0) {
+	    cause = 1;
+	    err = SOCK_ERRNO;
+	    ress = res;
+	    continue;
+	}
+
+	if (trace)
+	{
+	    _inet_ntop(res->ai_family, res->ai_addr, addr, sizeof(addr));
+	    fprintf (stderr, " -> Connecting to %s(%s):%d\n",
+		root->hostname, addr, port_number);
+	}
+
+	if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) {
+	    cause = 2;
+	    err = SOCK_ERRNO;
+	    ress = res;
+	    close(sock);
+	    sock = -1;
+	    continue;
+	}
+
+	break;  /* okay we got one */
+    }
+    if (sock < 0) {
+	switch (cause)
+	{
+	case 1:
+            freeaddrinfo(res0);
+	    error (1, 0, "cannot create socket: %s", SOCK_STRERROR (SOCK_ERRNO));
+	case 2:
+	    _inet_ntop(ress->ai_family, ress->ai_addr, addr, sizeof(addr));
+            freeaddrinfo(res0);
+	    error (1, 0, "connect to %s(%s):%d failed: %s",
+	       root->hostname, addr, port_number,
+	       SOCK_STRERROR (err));
+	default:
+            freeaddrinfo(res0);
+	    error (1, 0, "%s: unknown error", __func__);
+	}
     }
-    if (connect (sock, (struct sockaddr *) &client_sai, sizeof (client_sai))
-	< 0)
-	error (1, 0, "connect to %s(%s):%d failed: %s",
-	       root->hostname,
-	       inet_ntoa (client_sai.sin_addr),
-	       port_number, SOCK_STRERROR (SOCK_ERRNO));
 
     make_bufs_from_fds (sock, sock, 0, &to_server, &from_server, 1);
 
-    auth_server (root, to_server, from_server, verify_only, do_gssapi, hostinfo);
+    auth_server (root, to_server, from_server, verify_only, do_gssapi, res->ai_canonname);
+    freeaddrinfo(res0);
 
     if (verify_only)
     {
@@ -3839,13 +3903,13 @@
 
 
 static void
-auth_server (root, lto_server, lfrom_server, verify_only, do_gssapi, hostinfo)
+auth_server (root, lto_server, lfrom_server, verify_only, do_gssapi, hostname)
     cvsroot_t *root;
     struct buffer *lto_server;
     struct buffer *lfrom_server;
     int verify_only;
     int do_gssapi;
-    struct hostent *hostinfo;
+    const char *hostname;
 {
     char *username = "";		/* the username we use to connect */
     char no_passwd = 0;			/* gets set if no password found */
@@ -3875,7 +3939,7 @@
 	    error (1, 0, "gserver currently only enabled for socket connections");
 	}
 
-	if (! connect_to_gserver (root, fd, hostinfo))
+	if (! connect_to_gserver (root, fd, hostname))
 	{
 	    error (1, 0,
 		    "authorization failed: server %s rejected access to %s",
@@ -4076,6 +4140,7 @@
     struct sockaddr_in sin;
     char *hname;
 
+    /* XXX Not IPv6 ready, but MIT Kerberos 4 code thou shall not touch. */
     s = socket (AF_INET, SOCK_STREAM, 0);
     if (s < 0)
 	error (1, 0, "cannot create socket: %s", SOCK_STRERROR (SOCK_ERRNO));
@@ -4176,10 +4241,10 @@
  */
 #define BUFSIZE 1024
 static int
-connect_to_gserver (root, sock, hostinfo)
+connect_to_gserver (root, sock, hostname)
     cvsroot_t *root;
     int sock;
-    struct hostent *hostinfo;
+    const char *hostname;
 {
     char *str;
     char buf[BUFSIZE];
@@ -4192,9 +4257,9 @@
     if (send (sock, str, strlen (str), 0) < 0)
 	error (1, 0, "cannot send: %s", SOCK_STRERROR (SOCK_ERRNO));
 
-    if (strlen (hostinfo->h_name) > BUFSIZE - 5)
+    if (strlen (hostname) > BUFSIZE - 5)
 	error (1, 0, "Internal error: hostname exceeds length of buffer");
-    sprintf (buf, "cvs@%s", hostinfo->h_name);
+    sprintf (buf, "cvs@%s", hostname);
     tok_in.length = strlen (buf);
     tok_in.value = buf;
     gss_import_name (&stat_min, &tok_in, GSS_C_NT_HOSTBASED_SERVICE,

Added: soc2012/exxo/patches/cvs-inet6.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2012/exxo/patches/cvs-inet6.patch	Mon May 28 16:56:37 2012	(r236601)
@@ -0,0 +1,207 @@
+Index: src/client.c
+===================================================================
+RCS file: /home/ncvs/src/contrib/cvs/src/client.c,v
+retrieving revision 1.14
+diff -p -u -r1.14 client.c
+--- src/client.c	19 Mar 2008 14:49:14 -0000	1.14
++++ src/client.c	15 May 2012 01:47:06 -0000
+@@ -85,7 +85,7 @@ static Key_schedule sched;
+ /* This is needed for GSSAPI encryption.  */
+ static gss_ctx_id_t gcontext;
+ 
+-static int connect_to_gserver PROTO((cvsroot_t *, int, struct hostent *));
++static int connect_to_gserver PROTO((cvsroot_t *, int, const char *));
+ 
+ # endif /* HAVE_GSSAPI */
+ 
+@@ -149,7 +149,7 @@ static void handle_notified PROTO((char 
+ static size_t try_read_from_server PROTO ((char *, size_t));
+ 
+ static void auth_server PROTO ((cvsroot_t *, struct buffer *, struct buffer *,
+-				int, int, struct hostent *));
++				int, int, const char *));
+ 
+ /* We need to keep track of the list of directories we've sent to the
+    server.  This list, along with the current CVSROOT, will help us
+@@ -3605,6 +3605,28 @@ init_sockaddr (name, hostname, port)
+     return hostinfo;
+ }
+ 
++static void
++_inet_ntop(int af, struct sockaddr *sa, char *addr, socklen_t len)
++{
++    struct sockaddr_in *sin;
++    struct sockaddr_in6 *sin6;
++
++    addr[0] = '\0';
++    assert(af == sa->sa_family);
++    switch (af)
++    {
++    case AF_INET6:
++	    sin6 = (struct sockaddr_in6 *)sa;
++	    inet_ntop(af, &sin6->sin6_addr, addr, len);
++	    break;
++    case AF_INET:
++	    sin = (struct sockaddr_in *)sa;
++	    inet_ntop(af, &sin->sin_addr, addr, len);
++	    break;
++    default:
++	    break;
++    }
++}
+ 
+ 
+ /* Generic function to do port number lookup tasks.
+@@ -3779,33 +3801,75 @@ connect_to_pserver (root, to_server_p, f
+ {
+     int sock;
+     int port_number;
+-    struct sockaddr_in client_sai;
+-    struct hostent *hostinfo;
+     struct buffer *to_server, *from_server;
++    struct addrinfo hints, *res, *res0, *ress;
++    int err, cause;
++    char ports[7], addr[INET6_ADDRSTRLEN];
+ 
+-    sock = socket (AF_INET, SOCK_STREAM, 0);
+-    if (sock == -1)
+-    {
+-	error (1, 0, "cannot create socket: %s", SOCK_STRERROR (SOCK_ERRNO));
+-    }
+     port_number = get_cvs_port_number (root);
+-    hostinfo = init_sockaddr (&client_sai, root->hostname, port_number);
+-    if (trace)
++    snprintf(ports, sizeof(ports), "%d", port_number);
++
++    memset(&hints, 0, sizeof(hints));
++    hints.ai_flags = AI_CANONNAME;
++    hints.ai_family = PF_UNSPEC;
++    hints.ai_socktype = SOCK_STREAM;
++    err = getaddrinfo(root->hostname, ports, &hints, &res0);
++    if (err)
+     {
+-	fprintf (stderr, " -> Connecting to %s(%s):%d\n",
+-		 root->hostname,
+-		 inet_ntoa (client_sai.sin_addr), port_number);
++	error(1, 0, "%s", gai_strerror(err));
++    }
++    sock = -1;
++    cause = 0;
++    for (res = res0; res; res = res->ai_next) {
++	sock = socket(res->ai_family, res->ai_socktype,
++	    res->ai_protocol);
++	if (sock < 0) {
++	    cause = 1;
++	    err = SOCK_ERRNO;
++	    ress = res;
++	    continue;
++	}
++
++	if (trace)
++	{
++	    _inet_ntop(res->ai_family, res->ai_addr, addr, sizeof(addr));
++	    fprintf (stderr, " -> Connecting to %s(%s):%d\n",
++		root->hostname, addr, port_number);
++	}
++
++	if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) {
++	    cause = 2;
++	    err = SOCK_ERRNO;
++	    ress = res;
++	    close(sock);
++	    sock = -1;
++	    continue;
++	}
++
++	break;  /* okay we got one */
++    }
++    if (sock < 0) {
++	switch (cause)
++	{
++	case 1:
++            freeaddrinfo(res0);
++	    error (1, 0, "cannot create socket: %s", SOCK_STRERROR (SOCK_ERRNO));
++	case 2:
++	    _inet_ntop(ress->ai_family, ress->ai_addr, addr, sizeof(addr));
++            freeaddrinfo(res0);
++	    error (1, 0, "connect to %s(%s):%d failed: %s",
++	       root->hostname, addr, port_number,
++	       SOCK_STRERROR (err));
++	default:
++            freeaddrinfo(res0);
++	    error (1, 0, "%s: unknown error", __func__);
++	}
+     }
+-    if (connect (sock, (struct sockaddr *) &client_sai, sizeof (client_sai))
+-	< 0)
+-	error (1, 0, "connect to %s(%s):%d failed: %s",
+-	       root->hostname,
+-	       inet_ntoa (client_sai.sin_addr),
+-	       port_number, SOCK_STRERROR (SOCK_ERRNO));
+ 
+     make_bufs_from_fds (sock, sock, 0, &to_server, &from_server, 1);
+ 
+-    auth_server (root, to_server, from_server, verify_only, do_gssapi, hostinfo);
++    auth_server (root, to_server, from_server, verify_only, do_gssapi, res->ai_canonname);
++    freeaddrinfo(res0);
+ 
+     if (verify_only)
+     {
+@@ -3839,13 +3903,13 @@ connect_to_pserver (root, to_server_p, f
+ 
+ 
+ static void
+-auth_server (root, lto_server, lfrom_server, verify_only, do_gssapi, hostinfo)
++auth_server (root, lto_server, lfrom_server, verify_only, do_gssapi, hostname)
+     cvsroot_t *root;
+     struct buffer *lto_server;
+     struct buffer *lfrom_server;
+     int verify_only;
+     int do_gssapi;
+-    struct hostent *hostinfo;
++    const char *hostname;
+ {
+     char *username = "";		/* the username we use to connect */
+     char no_passwd = 0;			/* gets set if no password found */
+@@ -3875,7 +3939,7 @@ auth_server (root, lto_server, lfrom_ser
+ 	    error (1, 0, "gserver currently only enabled for socket connections");
+ 	}
+ 
+-	if (! connect_to_gserver (root, fd, hostinfo))
++	if (! connect_to_gserver (root, fd, hostname))
+ 	{
+ 	    error (1, 0,
+ 		    "authorization failed: server %s rejected access to %s",
+@@ -4076,6 +4140,7 @@ start_tcp_server (root, to_server, from_
+     struct sockaddr_in sin;
+     char *hname;
+ 
++    /* XXX Not IPv6 ready, but MIT Kerberos 4 code thou shall not touch. */
+     s = socket (AF_INET, SOCK_STREAM, 0);
+     if (s < 0)
+ 	error (1, 0, "cannot create socket: %s", SOCK_STRERROR (SOCK_ERRNO));
+@@ -4176,10 +4241,10 @@ recv_bytes (sock, buf, need)
+  */
+ #define BUFSIZE 1024
+ static int
+-connect_to_gserver (root, sock, hostinfo)
++connect_to_gserver (root, sock, hostname)
+     cvsroot_t *root;
+     int sock;
+-    struct hostent *hostinfo;
++    const char *hostname;
+ {
+     char *str;
+     char buf[BUFSIZE];
+@@ -4192,9 +4257,9 @@ connect_to_gserver (root, sock, hostinfo
+     if (send (sock, str, strlen (str), 0) < 0)
+ 	error (1, 0, "cannot send: %s", SOCK_STRERROR (SOCK_ERRNO));
+ 
+-    if (strlen (hostinfo->h_name) > BUFSIZE - 5)
++    if (strlen (hostname) > BUFSIZE - 5)
+ 	error (1, 0, "Internal error: hostname exceeds length of buffer");
+-    sprintf (buf, "cvs@%s", hostinfo->h_name);
++    sprintf (buf, "cvs@%s", hostname);
+     tok_in.length = strlen (buf);
+     tok_in.value = buf;
+     gss_import_name (&stat_min, &tok_in, GSS_C_NT_HOSTBASED_SERVICE,

Added: soc2012/exxo/softnotes.txt
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2012/exxo/softnotes.txt	Mon May 28 16:56:37 2012	(r236601)
@@ -0,0 +1,3 @@
+contrib/cvs	FIXED	(patch updated)
+usr.bin/who	OK	(software dependant, utmpx fixed it)
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120528165638.09495106566B>