*** socket.c.orig Fri Mar 22 11:42:23 2002 --- socket.c Fri Mar 22 12:06:16 2002 *************** *** 9,14 **** --- 9,17 ---- #include #include + #ifdef USE_INET6 + #include + #endif /* USE_INET6 */ #include #include #include *************** *** 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 */