summaryrefslogtreecommitdiff
path: root/games/xtris/patches/patch-ae
diff options
context:
space:
mode:
Diffstat (limited to 'games/xtris/patches/patch-ae')
-rw-r--r--games/xtris/patches/patch-ae203
1 files changed, 203 insertions, 0 deletions
diff --git a/games/xtris/patches/patch-ae b/games/xtris/patches/patch-ae
new file mode 100644
index 00000000000..74a46c873e5
--- /dev/null
+++ b/games/xtris/patches/patch-ae
@@ -0,0 +1,203 @@
+$NetBSD: patch-ae,v 1.1.1.1 2002/01/25 17:47:18 hubertf Exp $
+
+--- xtserv.c.orig Wed Apr 9 20:01:58 1997
++++ xtserv.c
+@@ -95,7 +95,13 @@
+ #define NEXT(u) ((u)->next ? (u)->next : user0)
+
+ int port = DEFAULTPORT;
++#ifdef INET6
++# define MAX_LISTEN_SOCKS 16
++struct sockaddr_storage saddr;
++#else
+ struct sockaddr_in saddr;
++#endif
++int saddr_len;
+ int lfd;
+ unsigned char realbuf[512], *buf = realbuf + 4;
+
+@@ -235,6 +241,9 @@
+ void new_connect(int fd) {
+ struct user *u, *v;
+ unsigned char nxn;
++#ifdef INET6
++ char ipaddr_buf[INET6_ADDRSTRLEN];
++#endif
+
+ u = malloc(sizeof (struct user));
+ if (!u)
+@@ -263,8 +272,20 @@
+ v = v->next;
+ }
+ u->number = nxn;
++#ifdef INET6
++ if (verbose){
++ ipaddr_buf[0] = '\0';
++ getnameinfo((struct sockaddr *)&saddr, saddr_len,
++ ipaddr_buf, sizeof(ipaddr_buf),
++ NULL, 0, NI_NUMERICHOST);
++ ipaddr_buf[sizeof(ipaddr_buf)-1] = '\0';
++ printf("client %d connecting from %s\n",
++ nxn, ((ipaddr_buf[0] != '\0') ? ipaddr_buf : "(unknown)"));
++ }
++#else
+ if (verbose)
+ printf("client %d connecting from %s\n", nxn, inet_ntoa(saddr.sin_addr));
++#endif
+ clients++;
+ buf[1] = OP_YOUARE;
+ buf[0] = u->number;
+@@ -280,6 +301,15 @@
+ char *opt;
+ struct protoent *tcpproto;
+ struct timeval tv;
++#ifdef INET6
++ struct addrinfo hints, *res0, *res;
++ char serv_buf[NI_MAXSERV];
++ int socklistListen[MAX_LISTEN_SOCKS];
++ int countSock, maxSock;
++ char str_buff[512];
++ int j, sel, gai;
++ int sockListen;
++#endif
+
+ #ifndef NeXT
+ struct sigaction sact;
+@@ -343,6 +373,46 @@
+ } else fatal("Unrecognized option, try -h for help");
+ }
+
++#ifdef INET6
++ memset(&hints, 0, sizeof(hints));
++ hints.ai_family = PF_UNSPEC;
++ hints.ai_socktype = SOCK_STREAM;
++ hints.ai_flags = AI_PASSIVE;
++ snprintf(serv_buf, sizeof(serv_buf), "%d", port);
++ serv_buf[sizeof(serv_buf)-1] = '\0';
++ gai = getaddrinfo(NULL, serv_buf, &hints, &res0);
++ if (gai){
++ snprintf(str_buff, sizeof(str_buff)-1,
++ "getaddrinfo(): %s", gai_strerror(gai));
++ str_buff[sizeof(str_buff)-1] = '\0';
++ fatal(str_buff);
++ }
++ countSock = 0;
++ maxSock = -1;
++ for (res=res0; res && (countSock < MAX_LISTEN_SOCKS); res=res->ai_next){
++ sockListen = socket(res->ai_family, res->ai_socktype, 0);
++ if(sockListen < 0) continue;
++ on = 1;
++ setsockopt(sockListen, SOL_SOCKET, SO_REUSEADDR,
++ (char *)&on, sizeof(int));
++ if (bind(sockListen, res->ai_addr, res->ai_addrlen) < 0){
++ close(sockListen);
++ continue;
++ }
++ if (listen(sockListen, 5) < 0){
++ close(sockListen);
++ continue;
++ }
++ socklistListen[countSock++] = sockListen;
++ if (maxSock < sockListen) maxSock = sockListen;
++ }
++ if (!countSock){
++ snprintf(str_buff, sizeof(str_buff), "socket(),bind(),listen(): %d", countSock);
++ str_buff[sizeof(str_buff)-1] = '\0';
++ fatal(str_buff);
++ }
++ freeaddrinfo(res0);
++#else
+ lfd = socket(PF_INET, SOCK_STREAM, 0);
+ saddr.sin_family = AF_INET;
+ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
+@@ -357,13 +427,26 @@
+ syserr("bind");
+
+ listen(lfd, 5);
++#endif
+
+ if (is_daemon) {
+ /* become a daemon, breaking all ties with the controlling terminal */
+ verbose = 0;
+ for (i=0; i<255; i++) {
++#ifdef INET6
++ lfd = -1;
++ for (j=0; j<countSock; j++){
++ if (i == socklistListen[j]){
++ lfd = socklistListen[j];
++ break;
++ }
++ }
++ if (lfd < 0)
++ close(i);
++#else
+ if (i != lfd)
+ close(i);
++#endif
+ }
+ if (fork())
+ exit(0);
+@@ -395,7 +478,11 @@
+ flushuser(u);
+
+ FD_ZERO(&fds);
++#ifdef INET6
++ mfd = -1;
++#else
+ mfd = lfd;
++#endif
+ u = user0;
+ while (u) {
+ FD_SET(u->fd, &fds);
+@@ -403,7 +490,15 @@
+ mfd = u->fd;
+ u = u->next;
+ }
++#ifdef INET6
++ for (i=0; i<countSock; i++){
++ FD_SET(socklistListen[i], &fds);
++ if (socklistListen[i] > mfd)
++ mfd = socklistListen[i];
++ }
++#else
+ FD_SET(lfd, &fds);
++#endif
+ tv.tv_sec = 0;
+ tv.tv_usec = 500000;
+ if ((sl = select(mfd + 1, &fds, NULL, NULL, &tv)) < 0)
+@@ -425,11 +520,15 @@
+ if (sl == 0)
+ continue;
+
+- if (FD_ISSET(lfd, &fds)) {
+- int newfd, slen;
++#ifdef INET6
++ for (i=0; i<countSock; i++){
++ lfd = socklistListen[i];
++#endif
++ if (FD_ISSET(lfd, &fds)) {
++ int newfd;
+
+- slen = sizeof(saddr);
+- newfd = accept(lfd, (struct sockaddr *)&saddr, &slen);
++ saddr_len = sizeof(saddr);
++ newfd = accept(lfd, (struct sockaddr *)&saddr, &saddr_len);
+ if (newfd < 0) {
+ if (errno != EINTR)
+ syserr("accept");
+@@ -440,8 +539,15 @@
+ }
+ new_connect(newfd);
+ }
++#ifdef INET6
++ break;
++#else
+ continue;
++#endif
++ }
++#ifdef INET6
+ }
++#endif
+
+ u = user0;
+ do {