head 1.3; access; symbols pkgsrc-2026Q1:1.3.0.166 pkgsrc-2026Q1-base:1.3 pkgsrc-2025Q4:1.3.0.164 pkgsrc-2025Q4-base:1.3 pkgsrc-2025Q3:1.3.0.162 pkgsrc-2025Q3-base:1.3 pkgsrc-2025Q2:1.3.0.160 pkgsrc-2025Q2-base:1.3 pkgsrc-2025Q1:1.3.0.158 pkgsrc-2025Q1-base:1.3 pkgsrc-2024Q4:1.3.0.156 pkgsrc-2024Q4-base:1.3 pkgsrc-2024Q3:1.3.0.154 pkgsrc-2024Q3-base:1.3 pkgsrc-2024Q2:1.3.0.152 pkgsrc-2024Q2-base:1.3 pkgsrc-2024Q1:1.3.0.150 pkgsrc-2024Q1-base:1.3 pkgsrc-2023Q4:1.3.0.148 pkgsrc-2023Q4-base:1.3 pkgsrc-2023Q3:1.3.0.146 pkgsrc-2023Q3-base:1.3 pkgsrc-2023Q2:1.3.0.144 pkgsrc-2023Q2-base:1.3 pkgsrc-2023Q1:1.3.0.142 pkgsrc-2023Q1-base:1.3 pkgsrc-2022Q4:1.3.0.140 pkgsrc-2022Q4-base:1.3 pkgsrc-2022Q3:1.3.0.138 pkgsrc-2022Q3-base:1.3 pkgsrc-2022Q2:1.3.0.136 pkgsrc-2022Q2-base:1.3 pkgsrc-2022Q1:1.3.0.134 pkgsrc-2022Q1-base:1.3 pkgsrc-2021Q4:1.3.0.132 pkgsrc-2021Q4-base:1.3 pkgsrc-2021Q3:1.3.0.130 pkgsrc-2021Q3-base:1.3 pkgsrc-2021Q2:1.3.0.128 pkgsrc-2021Q2-base:1.3 pkgsrc-2021Q1:1.3.0.126 pkgsrc-2021Q1-base:1.3 pkgsrc-2020Q4:1.3.0.124 pkgsrc-2020Q4-base:1.3 pkgsrc-2020Q3:1.3.0.122 pkgsrc-2020Q3-base:1.3 pkgsrc-2020Q2:1.3.0.118 pkgsrc-2020Q2-base:1.3 pkgsrc-2020Q1:1.3.0.98 pkgsrc-2020Q1-base:1.3 pkgsrc-2019Q4:1.3.0.120 pkgsrc-2019Q4-base:1.3 pkgsrc-2019Q3:1.3.0.116 pkgsrc-2019Q3-base:1.3 pkgsrc-2019Q2:1.3.0.114 pkgsrc-2019Q2-base:1.3 pkgsrc-2019Q1:1.3.0.112 pkgsrc-2019Q1-base:1.3 pkgsrc-2018Q4:1.3.0.110 pkgsrc-2018Q4-base:1.3 pkgsrc-2018Q3:1.3.0.108 pkgsrc-2018Q3-base:1.3 pkgsrc-2018Q2:1.3.0.106 pkgsrc-2018Q2-base:1.3 pkgsrc-2018Q1:1.3.0.104 pkgsrc-2018Q1-base:1.3 pkgsrc-2017Q4:1.3.0.102 pkgsrc-2017Q4-base:1.3 pkgsrc-2017Q3:1.3.0.100 pkgsrc-2017Q3-base:1.3 pkgsrc-2017Q2:1.3.0.96 pkgsrc-2017Q2-base:1.3 pkgsrc-2017Q1:1.3.0.94 pkgsrc-2017Q1-base:1.3 pkgsrc-2016Q4:1.3.0.92 pkgsrc-2016Q4-base:1.3 pkgsrc-2016Q3:1.3.0.90 pkgsrc-2016Q3-base:1.3 pkgsrc-2016Q2:1.3.0.88 pkgsrc-2016Q2-base:1.3 pkgsrc-2016Q1:1.3.0.86 pkgsrc-2016Q1-base:1.3 pkgsrc-2015Q4:1.3.0.84 pkgsrc-2015Q4-base:1.3 pkgsrc-2015Q3:1.3.0.82 pkgsrc-2015Q3-base:1.3 pkgsrc-2015Q2:1.3.0.80 pkgsrc-2015Q2-base:1.3 pkgsrc-2015Q1:1.3.0.78 pkgsrc-2015Q1-base:1.3 pkgsrc-2014Q4:1.3.0.76 pkgsrc-2014Q4-base:1.3 pkgsrc-2014Q3:1.3.0.74 pkgsrc-2014Q3-base:1.3 pkgsrc-2014Q2:1.3.0.72 pkgsrc-2014Q2-base:1.3 pkgsrc-2014Q1:1.3.0.70 pkgsrc-2014Q1-base:1.3 pkgsrc-2013Q4:1.3.0.68 pkgsrc-2013Q4-base:1.3 pkgsrc-2013Q3:1.3.0.66 pkgsrc-2013Q3-base:1.3 pkgsrc-2013Q2:1.3.0.64 pkgsrc-2013Q2-base:1.3 pkgsrc-2013Q1:1.3.0.62 pkgsrc-2013Q1-base:1.3 pkgsrc-2012Q4:1.3.0.60 pkgsrc-2012Q4-base:1.3 pkgsrc-2012Q3:1.3.0.58 pkgsrc-2012Q3-base:1.3 pkgsrc-2012Q2:1.3.0.56 pkgsrc-2012Q2-base:1.3 pkgsrc-2012Q1:1.3.0.54 pkgsrc-2012Q1-base:1.3 pkgsrc-2011Q4:1.3.0.52 pkgsrc-2011Q4-base:1.3 pkgsrc-2011Q3:1.3.0.50 pkgsrc-2011Q3-base:1.3 pkgsrc-2011Q2:1.3.0.48 pkgsrc-2011Q2-base:1.3 pkgsrc-2011Q1:1.3.0.46 pkgsrc-2011Q1-base:1.3 pkgsrc-2010Q4:1.3.0.44 pkgsrc-2010Q4-base:1.3 pkgsrc-2010Q3:1.3.0.42 pkgsrc-2010Q3-base:1.3 pkgsrc-2010Q2:1.3.0.40 pkgsrc-2010Q2-base:1.3 pkgsrc-2010Q1:1.3.0.38 pkgsrc-2010Q1-base:1.3 pkgsrc-2009Q4:1.3.0.36 pkgsrc-2009Q4-base:1.3 pkgsrc-2009Q3:1.3.0.34 pkgsrc-2009Q3-base:1.3 pkgsrc-2009Q2:1.3.0.32 pkgsrc-2009Q2-base:1.3 pkgsrc-2009Q1:1.3.0.30 pkgsrc-2009Q1-base:1.3 pkgsrc-2008Q4:1.3.0.28 pkgsrc-2008Q4-base:1.3 pkgsrc-2008Q3:1.3.0.26 pkgsrc-2008Q3-base:1.3 cube-native-xorg:1.3.0.24 cube-native-xorg-base:1.3 pkgsrc-2008Q2:1.3.0.22 pkgsrc-2008Q2-base:1.3 cwrapper:1.3.0.20 pkgsrc-2008Q1:1.3.0.18 pkgsrc-2008Q1-base:1.3 pkgsrc-2007Q4:1.3.0.16 pkgsrc-2007Q4-base:1.3 pkgsrc-2007Q3:1.3.0.14 pkgsrc-2007Q3-base:1.3 pkgsrc-2007Q2:1.3.0.12 pkgsrc-2007Q2-base:1.3 pkgsrc-2007Q1:1.3.0.10 pkgsrc-2007Q1-base:1.3 pkgsrc-2006Q4:1.3.0.8 pkgsrc-2006Q4-base:1.3 pkgsrc-2006Q3:1.3.0.6 pkgsrc-2006Q3-base:1.3 pkgsrc-2006Q2:1.3.0.4 pkgsrc-2006Q2-base:1.3 pkgsrc-2006Q1:1.3.0.2 pkgsrc-2006Q1-base:1.3 pkgsrc-2005Q4:1.2.0.26 pkgsrc-2005Q4-base:1.2 pkgsrc-2005Q3:1.2.0.24 pkgsrc-2005Q3-base:1.2 pkgsrc-2005Q2:1.2.0.22 pkgsrc-2005Q2-base:1.2 pkgsrc-2005Q1:1.2.0.20 pkgsrc-2005Q1-base:1.2 pkgsrc-2004Q4:1.2.0.18 pkgsrc-2004Q4-base:1.2 pkgsrc-2004Q3:1.2.0.16 pkgsrc-2004Q3-base:1.2 pkgsrc-2004Q2:1.2.0.14 pkgsrc-2004Q2-base:1.2 pkgsrc-2004Q1:1.2.0.12 pkgsrc-2004Q1-base:1.2 pkgsrc-2003Q4:1.2.0.10 pkgsrc-2003Q4-base:1.2 netbsd-1-6-1:1.2.0.6 netbsd-1-6-1-base:1.2 netbsd-1-6:1.2.0.8 netbsd-1-6-RELEASE-base:1.2 pkgviews:1.2.0.4 pkgviews-base:1.2 buildlink2:1.2.0.2 buildlink2-base:1.2 netbsd-1-5-PATCH003:1.2 netbsd-1-5-PATCH001:1.2 netbsd-1-5-RELEASE:1.2 netbsd-1-4-PATCH003:1.2 netbsd-1-4-PATCH002:1.2 comdex-fall-1999:1.2 netbsd-1-4-PATCH001:1.1 netbsd-1-4-RELEASE:1.1; locks; strict; comment @# @; 1.3 date 2006.01.25.02.12.10; author joerg; state Exp; branches; next 1.2; 1.2 date 99.09.17.18.23.56; author tron; state Exp; branches; next 1.1; 1.1 date 99.02.02.23.00.41; author tron; state Exp; branches; next ; desc @@ 1.3 log @Fix errno. @ text @$NetBSD$ --- socketp.c.orig 1992-08-09 01:41:42.000000000 +0000 +++ socketp.c @@@@ -9,12 +9,19 @@@@ Please read the file COPYRIGHT for furth #include #include -#include +#include #include +#include #include #include +#include +#include +#include #include "globals.h" +extern int is_number A((char *)); + +#ifndef USE_INET6 /* * create a server socket on PORT accepting QUEUE_LENGTH connections */ @@@@ -25,9 +32,9 @@@@ int queue_length ; struct sockaddr_in sa ; int s; - if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + s = socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) return -1 ; - } bzero((char *) &sa, sizeof(sa)) ; sa.sin_family = AF_INET ; @@@@ -35,54 +42,270 @@@@ int queue_length ; sa.sin_port = htons(port) ; if (bind(s, (struct sockaddr *) &sa, sizeof(sa)) < 0) { - return -1 ; + return -1 ; } if (listen(s, 1) < 0) { - return -1 ; + return -1 ; } return s ; } +#else /* USE_INET6 */ +/* + * create a server socket(s) on PORT accepting QUEUE_LENGTH connections + * + * FWD (ifdef USE_INET6): + * there can be more than one socket; one for each supported address + * family. This is for portability as not all IPv6 stacks implement + * the wildcard bind as a bind to *ll IPv4 *and* IPv6 addresses. + * so we'll just open a socket for each address getaddrinfo() gives + * back to us. The price of portability... + */ +int *create_server_sockets(port, queue_length) +char **port ; +int queue_length ; +{ + struct addrinfo hints, *r, *res; + int *s, *slist, error, maxs; + int reuse_addr = 1; + + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_PASSIVE; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + error = getaddrinfo(NULL, *port, &hints, &res); + + if (!error) { + for (maxs = 0, r = res; r; r = r->ai_next, maxs++); + slist = malloc ((maxs+1) * sizeof(int)); + if (slist) { + slist[0] = maxs; /* max. num of sockets */ + + s = slist+1; + for (r = res; r; r = r->ai_next) { + *s = socket(r->ai_family, r->ai_socktype, r->ai_protocol); + if (*s < 0) + continue; + + setsockopt(*s,SOL_SOCKET,SO_REUSEADDR,&reuse_addr,sizeof(reuse_addr)); + + if (bind(*s, r->ai_addr, r->ai_addrlen) < 0) { + close (*s); + continue; + } + + if (listen(*s, 1) < 0) { + close (*s); + continue; + } + s++; + } + } + } + else + slist = NULL; + + if (res) + freeaddrinfo(res); + + if (slist && !slist[0]) { + free (slist); + slist = NULL; + } + + return (slist); +} +#endif /* USE_INET6 */ /* create a client socket connected to PORT on HOSTNAME */ +#ifndef USE_INET6 +/* create a client socket connected to PORT on HOSTNAME */ int create_client_socket(hostname, port) char **hostname ; int port ; { struct sockaddr_in sa ; struct hostent *hp ; - int a, s ; + int s ; long addr ; bzero(&sa, sizeof(sa)) ; if ((addr = inet_addr(*hostname)) != -1) { - /* is Internet addr in octet notation */ - bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */ - sa.sin_family = AF_INET ; + /* is Internet addr in octet notation */ + bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */ + sa.sin_family = AF_INET ; } else { - /* do we know the host's address? */ - if ((hp = gethostbyname(*hostname)) == NULL) { - return -2 ; - } - *hostname = hp->h_name ; - bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ; - sa.sin_family = hp->h_addrtype ; + /* do we know the host's address? */ + if ((hp = gethostbyname(*hostname)) == NULL) { + return -2 ; + } + *hostname = hp->h_name ; + bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ; + sa.sin_family = hp->h_addrtype ; } sa.sin_port = htons((u_short) port) ; if ((s = socket(sa.sin_family, SOCK_STREAM, 0)) < 0) { /* get socket */ - return -1 ; + return -1 ; } - if (connect(s, &sa, sizeof(sa)) < 0) { /* connect */ - close(s) ; - return -1 ; + if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) { /* connect */ + close(s) ; + return -1 ; } return s ; } +#else /* USE_INET6 */ +int create_client_socket(hostname, port) +char **hostname ; +char **port ; +{ + int s, connected, err ; + struct addrinfo hints, *r, *res; + + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_NUMERICHOST; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype= SOCK_STREAM; + err = getaddrinfo(*hostname, *port, &hints, &res); + if (res) freeaddrinfo(res); + + if (!err) { + /* numeric */ + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_CANONNAME; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + err = getaddrinfo(*hostname, *port, &hints, &res); + if (err) s = -2; + } else { + /* non-numeric */ + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + err = getaddrinfo(*hostname, *port, &hints, &res); + if (err) s = -2; + } + + + if (!err) { + err = 0; s = -1; + connected = 0; + for (r = res; r && !connected; r = r->ai_next) { + s = socket(r->ai_family, r->ai_socktype, r->ai_protocol); + if (s < 0) + continue; + + if (connect(s, r->ai_addr, r->ai_addrlen) < 0) { + err = errno; + close(s); + s = -1; + continue; + } + connected++; + break; + } + if (!connected) s = -1; + } + + if (res) + freeaddrinfo(res); + + return (s); +} +#endif /* USE_INET6 */ + +#ifdef USE_INET6 +/* Determines hostname, address and port number used for the peer of socket */ +int socket_remote_name(socket, name, ipname, port) +int socket; +char **name; +char **ipname; +char **port; +{ + struct sockaddr_storage server; + int length=sizeof(server), retval, error; + static char host[NI_MAXHOST],ip[NI_MAXHOST],portstr[NI_MAXSERV]; + + error = getpeername(socket,(struct sockaddr*)&server,&length); + if(!error) { + error = getnameinfo((struct sockaddr*)&server, length, host, + NI_MAXHOST, NULL, 0, 0); + error = getnameinfo((struct sockaddr*)&server, length, ip, + NI_MAXHOST, NULL, NI_MAXSERV, + NI_NUMERICHOST); + retval = error; + + error = getnameinfo((struct sockaddr*)&server, length, NULL, 0, + portstr, NI_MAXSERV, 0); + + if (error) + retval = getnameinfo((struct sockaddr*)&server, length, ip, + NI_MAXHOST, portstr, NI_MAXSERV, + NI_NUMERICSERV); + } + else + retval = error; + + if(name) + *name=host; + if(ipname) + *ipname=ip; + if(port) + *port=portstr; + + return(retval); +} + +/* Determines the hostname, address and port number used for our socket */ +int socket_local_name(socket, name, ipname, port) +int socket; +char **name; +char **ipname; +char **port; +{ + struct sockaddr_storage server; + int length=sizeof(server), retval, error; + static char host[NI_MAXHOST],ip[NI_MAXHOST],portstr[NI_MAXSERV]; + + error = getsockname(socket,(struct sockaddr*)&server,&length); + if(!error) { + error = getnameinfo((struct sockaddr*)&server, length, host, + NI_MAXHOST, NULL, 0, 0); + error = getnameinfo((struct sockaddr*)&server, length, ip, + NI_MAXHOST, NULL, NI_MAXSERV, + NI_NUMERICHOST); + retval = error; + + error = getnameinfo((struct sockaddr*)&server, length, NULL, 0, + portstr, NI_MAXSERV, 0); + + if (error) + retval = getnameinfo((struct sockaddr*)&server, length, ip, + NI_MAXHOST, portstr, NI_MAXSERV, + NI_NUMERICSERV); + } + else + retval = error; + + if(name) + *name=host; + if(ipname) + *ipname=ip; + if(port) + *port=portstr; + + return(retval); +} +#endif /* USE_INET6 */ + +#ifndef USE_INET6 /* return the port number for service NAME_OR_NUMBER. If NAME is non-null, * the name is the service is written there. */ @@@@ -116,5 +339,6 @@@@ char **name ; return ntohs(servent->s_port) ; } } +#endif /* !USE_INET6 */ /*EOF*/ @ 1.2 log @Add IPv6 support supplied by Feico Dillema in PR pkg/8413. @ text @d3 5 a7 3 --- socketp.c.orig Thu Sep 16 13:52:58 1999 +++ socketp.c Thu Sep 16 13:26:38 1999 @@@@ -11,10 +11,17 @@@@ d9 2 a10 1 #include d26 1 a26 1 @@@@ -25,9 +32,9 @@@@ d38 1 a38 1 @@@@ -35,54 +42,270 @@@@ d326 1 a326 1 @@@@ -116,5 +339,6 @@@@ @ 1.1 log @Split patches into seperate files and fix compiler warning. @ text @d3 3 a5 3 --- socketp.c.orig Sun Aug 9 03:41:42 1992 +++ socketp.c Tue Feb 2 23:52:03 1999 @@@@ -11,10 +11,16 @@@@ d19 1 d23 101 a123 1 @@@@ -52,7 +58,7 @@@@ d132 27 a158 1 @@@@ -76,7 +82,7 @@@@ d160 2 a161 1 return -1 ; d164 2 d167 158 a324 2 close(s) ; return -1 ; d326 4 @