summaryrefslogtreecommitdiff
path: root/sysutils/socket/files/patch-af
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/socket/files/patch-af')
-rw-r--r--sysutils/socket/files/patch-af358
1 files changed, 358 insertions, 0 deletions
diff --git a/sysutils/socket/files/patch-af b/sysutils/socket/files/patch-af
new file mode 100644
index 000000000000..b5822e2f5fd8
--- /dev/null
+++ b/sysutils/socket/files/patch-af
@@ -0,0 +1,358 @@
+*** socketp.c.orig Fri Mar 22 11:42:23 2002
+--- socketp.c Fri Mar 22 12:07:59 2002
+***************
+*** 21,26 ****
+--- 21,27 ----
+
+ extern int is_number A((char *));
+
++ #ifndef USE_INET6
+ /*
+ * create a server socket on PORT accepting QUEUE_LENGTH connections
+ */
+***************
+*** 31,39 ****
+ struct sockaddr_in sa ;
+ int s;
+
+! if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+ return -1 ;
+- }
+
+ bzero((char *) &sa, sizeof(sa)) ;
+ sa.sin_family = AF_INET ;
+--- 32,40 ----
+ struct sockaddr_in sa ;
+ int s;
+
+! s = socket(AF_INET, SOCK_STREAM, 0);
+! if (s < 0)
+ return -1 ;
+
+ bzero((char *) &sa, sizeof(sa)) ;
+ sa.sin_family = AF_INET ;
+***************
+*** 41,56 ****
+ sa.sin_port = htons(port) ;
+
+ if (bind(s, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
+! return -1 ;
+ }
+ if (listen(s, 1) < 0) {
+! return -1 ;
+ }
+
+ return s ;
+ }
+
+
+ /* create a client socket connected to PORT on HOSTNAME */
+ int create_client_socket(hostname, port)
+ char **hostname ;
+--- 42,126 ----
+ sa.sin_port = htons(port) ;
+
+ if (bind(s, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
+! return -1 ;
+ }
+ if (listen(s, 1) < 0) {
+! 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 ;
+***************
+*** 64,94 ****
+
+ 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 ;
+ } 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 ;
+ }
+
+ sa.sin_port = htons((u_short) port) ;
+
+ if ((s = socket(sa.sin_family, SOCK_STREAM, 0)) < 0) { /* get socket */
+! return -1 ;
+ }
+ if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) { /* connect */
+! close(s) ;
+! return -1 ;
+ }
+ return s ;
+ }
+
+ /* return the port number for service NAME_OR_NUMBER. If NAME is non-null,
+ * the name is the service is written there.
+ */
+--- 134,311 ----
+
+ 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 ;
+ } 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 ;
+ }
+
+ sa.sin_port = htons((u_short) port) ;
+
+ if ((s = socket(sa.sin_family, SOCK_STREAM, 0)) < 0) { /* get socket */
+! 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.
+ */
+***************
+*** 122,126 ****
+--- 339,344 ----
+ return ntohs(servent->s_port) ;
+ }
+ }
++ #endif /* !USE_INET6 */
+
+ /*EOF*/