d66b1112ff
I have created a patch that can be applied to provide IPv6 support for sysutils/socket utility. The patch imported from NetBSD and cleaned up to be cleanly work on FreeBSD. PR: ports/36202 Submitted by: Janos Mohacsi <janos.mohacsi@dante.org.uk> Approved by: maintainer timeout
327 lines
8.3 KiB
Text
327 lines
8.3 KiB
Text
*** socket.c.orig Fri Mar 22 11:42:23 2002
|
|
--- socket.c Fri Mar 22 12:06:16 2002
|
|
***************
|
|
*** 9,14 ****
|
|
--- 9,17 ----
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
+ #ifdef USE_INET6
|
|
+ #include <sys/time.h>
|
|
+ #endif /* USE_INET6 */
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
#include <errno.h>
|
|
***************
|
|
*** 36,44 ****
|
|
char *progname ; /* name of the game */
|
|
char *pipe_program = NULL ; /* program to execute in two-way pipe */
|
|
|
|
void server A((int port, char *service_name)) ;
|
|
- void handle_server_connection A((void)) ;
|
|
void client A((char *host, int port, char *service_name)) ;
|
|
extern void init_signals A((void)) ;
|
|
extern void do_io A((void)) ;
|
|
|
|
--- 39,53 ----
|
|
char *progname ; /* name of the game */
|
|
char *pipe_program = NULL ; /* program to execute in two-way pipe */
|
|
|
|
+ #ifndef USE_INET6
|
|
void server A((int port, char *service_name)) ;
|
|
void client A((char *host, int port, char *service_name)) ;
|
|
+ #else /* USE_INET6 */
|
|
+ void server A((char *port)) ;
|
|
+ void client A((char *host, char *port)) ;
|
|
+ #endif /* USE_INET6 */
|
|
+
|
|
+ void handle_server_connection A((void)) ;
|
|
extern void init_signals A((void)) ;
|
|
extern void do_io A((void)) ;
|
|
|
|
***************
|
|
*** 51,58 ****
|
|
--- 60,69 ----
|
|
int error = 0 ; /* usage error occurred */
|
|
extern int optind ; /* from getopt() */
|
|
/* char *host ; */ /* name of remote host */
|
|
+ #ifndef USE_INET6
|
|
int port ; /* port number for socket */
|
|
char *service_name ; /* name of service for port */
|
|
+ #endif /* USE_INET6 */
|
|
|
|
/* print version ID if requested */
|
|
if (argv[1] && !strcmp(argv[1], "-version")) {
|
|
***************
|
|
*** 62,68 ****
|
|
|
|
/* set up progname for later use */
|
|
progname = argv[0] ;
|
|
! if ((cp = strrchr(progname, '/'))) progname = cp + 1 ;
|
|
|
|
/* parse options */
|
|
while ((opt = getopt(argc, argv, "bcflp:qrsvw?")) != -1) {
|
|
--- 73,80 ----
|
|
|
|
/* set up progname for later use */
|
|
progname = argv[0] ;
|
|
! cp = strrchr(progname, '/');
|
|
! if (cp) progname = cp + 1 ;
|
|
|
|
/* parse options */
|
|
while ((opt = getopt(argc, argv, "bcflp:qrsvw?")) != -1) {
|
|
***************
|
|
*** 130,135 ****
|
|
--- 142,148 ----
|
|
/* set up signal handling */
|
|
init_signals() ;
|
|
|
|
+ #ifndef USE_INET6
|
|
/* get port number */
|
|
port = resolve_service(argv[optind + 1 - serverflag],
|
|
"tcp", &service_name) ;
|
|
***************
|
|
*** 138,178 ****
|
|
--- 151,231 ----
|
|
exit(5) ;
|
|
}
|
|
|
|
+ #endif /* not USE_INET6 */
|
|
/* and go */
|
|
if (serverflag) {
|
|
if (backgflag) {
|
|
background() ;
|
|
}
|
|
+ #ifndef USE_INET6
|
|
server(port, service_name) ;
|
|
+ #else /* USE_INET6 */
|
|
+ server(argv[optind]) ;
|
|
+ #endif /* USE_INET6 */
|
|
} else {
|
|
+ #ifndef USE_INET6
|
|
client(argv[optind], port, service_name) ;
|
|
+ #else /* USE_INET6 */
|
|
+ client(argv[optind], argv[optind + 1]) ;
|
|
+ #endif /* USE_INET6 */
|
|
}
|
|
exit(0) ;
|
|
}
|
|
|
|
|
|
+ #ifndef USE_INET6
|
|
void server(port, service_name)
|
|
int port ;
|
|
char *service_name ;
|
|
+ #else /* USE_INET6 */
|
|
+ void server(port)
|
|
+ char *port ;
|
|
+ #endif /* USE_INET6 */
|
|
{
|
|
+ #ifndef USE_INET6
|
|
int socket_handle, alen ;
|
|
+ #else /* USE_INET6 */
|
|
+ int *socket_handle_list ;
|
|
+ #endif /* USE_INET6 */
|
|
|
|
/* allocate server socket */
|
|
+ #ifndef USE_INET6
|
|
socket_handle = create_server_socket(port, 1) ;
|
|
if (socket_handle < 0) {
|
|
+ #else /* USE_INET6 */
|
|
+ socket_handle_list = create_server_sockets(&port, 1) ;
|
|
+ if (!socket_handle_list) {
|
|
+ #endif /* USE_INET6 */
|
|
perror2("server socket") ;
|
|
exit(1) ;
|
|
}
|
|
+ #ifdef USE_INET6
|
|
+
|
|
+ #endif /* USE_INET6 */
|
|
if (verboseflag) {
|
|
+ #ifndef USE_INET6
|
|
fprintf(stderr, "listening on port %d", port) ;
|
|
if (service_name) {
|
|
fprintf(stderr, " (%s)", service_name) ;
|
|
}
|
|
fprintf(stderr, "\n") ;
|
|
+ #else /* USE_INET6 */
|
|
+ char *ip, *port;
|
|
+ int fd, i;
|
|
+
|
|
+ fd = socket_handle_list[1];
|
|
+ for (i = 1; i <= socket_handle_list[0]; i++) {
|
|
+ if (!fd || fd < socket_handle_list[i])
|
|
+ fd = socket_handle_list[i];
|
|
+ socket_local_name (fd, NULL, &ip, &port);
|
|
+ fprintf(stderr, "listening at address %s on port %s\n", ip, port) ;
|
|
+ }
|
|
+ #endif /* USE_INET6 */
|
|
}
|
|
|
|
/* server loop */
|
|
do {
|
|
+ #ifndef USE_INET6
|
|
struct sockaddr_in sa ;
|
|
|
|
alen = sizeof(sa) ;
|
|
***************
|
|
*** 189,204 ****
|
|
long norder ;
|
|
char dotted[20] ;
|
|
|
|
! he = gethostbyaddr((char *)&sa.sin_addr.s_addr,
|
|
sizeof(sa.sin_addr.s_addr), AF_INET) ;
|
|
if (!he) {
|
|
norder = htonl(sa.sin_addr.s_addr) ;
|
|
sprintf(dotted, "%d.%d.%d.%d",
|
|
! (int)((norder >> 24) & 0xff),
|
|
! (int)((norder >> 16) & 0xff),
|
|
! (int)((norder >> 8) & 0xff),
|
|
! (int)(norder & 0xff)) ;
|
|
}
|
|
fprintf(stderr, "connection from %s\n",
|
|
(he ? he->h_name : dotted)) ;
|
|
}
|
|
--- 242,317 ----
|
|
long norder ;
|
|
char dotted[20] ;
|
|
|
|
! he = gethostbyaddr((const char *)&sa.sin_addr.s_addr,
|
|
sizeof(sa.sin_addr.s_addr), AF_INET) ;
|
|
if (!he) {
|
|
norder = htonl(sa.sin_addr.s_addr) ;
|
|
sprintf(dotted, "%d.%d.%d.%d",
|
|
! (int)((norder >> 24) & 0xff),
|
|
! (int)((norder >> 16) & 0xff),
|
|
! (int)((norder >> 8) & 0xff),
|
|
! (int)(norder & 0xff)) ;
|
|
! #else /* USE_INET6 */
|
|
! struct timeval tv;
|
|
! fd_set readfd;
|
|
! int fd, i, nfds, retval;
|
|
!
|
|
! fd = socket_handle_list[1];
|
|
! for (i = 1; i <= socket_handle_list[0]; i++) {
|
|
! if (!fd || fd < socket_handle_list[i])
|
|
! fd = socket_handle_list[i];
|
|
! }
|
|
! nfds=fd+1;
|
|
!
|
|
! FD_ZERO(&readfd);
|
|
! for (i = 1; i <= socket_handle_list[0]; i++)
|
|
! FD_SET(socket_handle_list[i],&readfd);
|
|
!
|
|
! tv.tv_sec = 10;
|
|
! tv.tv_usec = 0;
|
|
!
|
|
! retval = select(nfds, &readfd, NULL, NULL, &tv);
|
|
!
|
|
! if(retval!=-1) {
|
|
! for (i = 1; i <= socket_handle_list[0]; i++) {
|
|
! fd = socket_handle_list[i];
|
|
! if (FD_ISSET(fd, &readfd)) {
|
|
!
|
|
! /* accept a connection */
|
|
! active_socket = accept(fd, (struct sockaddr *) 0, (int *)0);
|
|
! if (active_socket == -1) {
|
|
! perror2("accept") ;
|
|
! } else {
|
|
! /* if verbose, get name of peer and give message */
|
|
! if (verboseflag) {
|
|
! char *host, *ip, *port;
|
|
!
|
|
! if(!socket_remote_name(active_socket,&host, &ip, &port)) {
|
|
! fprintf(stderr, "connection from %s at %s to %s\n", host, ip, port);
|
|
! }
|
|
! else
|
|
! fprintf(stderr, "cannot get name or address of peer") ;
|
|
! }
|
|
!
|
|
! if (forkflag) {
|
|
! switch (fork()) {
|
|
! case 0:
|
|
! handle_server_connection() ;
|
|
! exit(0) ;
|
|
! case -1:
|
|
! perror2("fork") ;
|
|
! break ;
|
|
! default:
|
|
! close(active_socket) ;
|
|
! wait_for_children() ;
|
|
! }
|
|
! } else {
|
|
! handle_server_connection() ;
|
|
! }
|
|
! }
|
|
! #endif /* USE_INET6 */
|
|
}
|
|
+ #ifndef USE_INET6
|
|
fprintf(stderr, "connection from %s\n",
|
|
(he ? he->h_name : dotted)) ;
|
|
}
|
|
***************
|
|
*** 216,224 ****
|
|
--- 329,342 ----
|
|
}
|
|
} else {
|
|
handle_server_connection() ;
|
|
+ #endif /* not USE_INET6 */
|
|
}
|
|
}
|
|
} while (loopflag) ;
|
|
+ #ifdef USE_INET6
|
|
+
|
|
+ free (socket_handle_list);
|
|
+ #endif /* USE_INET6 */
|
|
}
|
|
|
|
|
|
***************
|
|
*** 239,251 ****
|
|
--- 357,381 ----
|
|
}
|
|
|
|
|
|
+ #ifndef USE_INET6
|
|
void client(host, port, service_name)
|
|
+ #else /* USE_INET6 */
|
|
+ void client(host, port)
|
|
+ #endif /* USE_INET6 */
|
|
char *host ;
|
|
+ #ifndef USE_INET6
|
|
int port ;
|
|
char *service_name ;
|
|
+ #else /* USE_INET6 */
|
|
+ char *port ;
|
|
+ #endif /* USE_INET6 */
|
|
{
|
|
/* get connection */
|
|
+ #ifndef USE_INET6
|
|
active_socket = create_client_socket(&host, port) ;
|
|
+ #else /* USE_INET6 */
|
|
+ active_socket = create_client_socket(&host, &port) ;
|
|
+ #endif /* USE_INET6 */
|
|
if (active_socket == -1) {
|
|
perror2("client socket") ;
|
|
exit(errno) ;
|
|
***************
|
|
*** 254,264 ****
|
|
--- 384,401 ----
|
|
exit(13) ;
|
|
}
|
|
if (verboseflag) {
|
|
+ #ifndef USE_INET6
|
|
fprintf(stderr, "connected to %s port %d", host, port) ;
|
|
if (service_name) {
|
|
fprintf(stderr, " (%s)", service_name) ;
|
|
}
|
|
fprintf(stderr, "\n") ;
|
|
+ #else /* USE_INET6 */
|
|
+ char *host, *ip, *port;
|
|
+
|
|
+ socket_local_name (active_socket, &host, &ip, &port);
|
|
+ fprintf(stderr, "connected to %s with address %s at port %s\n", host, ip, port) ;
|
|
+ #endif /* USE_INET6 */
|
|
}
|
|
|
|
/* open pipes to program if requested */
|