socsvn commit: r236601 - in soc2012/exxo: . head/contrib/cvs/src
patches regress
exxo at FreeBSD.org
exxo at FreeBSD.org
Mon May 28 16:56:40 UTC 2012
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)
+
More information about the svn-soc-all
mailing list