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>