summaryrefslogtreecommitdiff
path: root/lang/modula-3-socks/files/patch-ab
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lang/modula-3-socks/files/patch-ab249
1 files changed, 249 insertions, 0 deletions
diff --git a/lang/modula-3-socks/files/patch-ab b/lang/modula-3-socks/files/patch-ab
new file mode 100644
index 000000000000..11c68bc51aca
--- /dev/null
+++ b/lang/modula-3-socks/files/patch-ab
@@ -0,0 +1,249 @@
+Index: SOCKS-SOURCE/client/Xconnect.c
+diff -r -u SOCKS-SOURCE/client/Xconnect.c socks-jdp/client/Xconnect.c
+--- SOCKS-SOURCE/client/Xconnect.c Wed Aug 7 19:25:51 1996
++++ socks-jdp/client/Xconnect.c Thu Oct 24 21:35:47 1996
+@@ -24,7 +24,9 @@
+ #include <netdb.h>
+ #include <arpa/nameser.h>
+ int res_init PARAM((void));
++#ifndef __FreeBSD__
+ int res_search PARAM((char*,int,int,u_char*,int));
++#endif
+ int dn_skipname PARAM((u_char*,u_char*));
+ #include <arpa/inet.h>
+ #include <resolv.h>
+@@ -39,6 +41,10 @@
+ #include "bytes.h"
+ #include "check_user.h"
+
++#ifndef FIOSNBIO
++# define FIOSNBIO FIONBIO
++#endif
++
+ unsigned char _SOCKS_version=SOCKS_VERSION;
+
+ char *socks_dst_serv=NULL, *socks_dst_name=NULL;
+@@ -102,6 +108,8 @@
+ struct info *l; /* must be first field */
+ int snum;
+ unsigned short type;
++ int connect_done:8;
++ int bind_done:8;
+ int sin_valid:8;
+ int peer_valid:8;
+ struct sockaddr_in sin;
+@@ -185,16 +193,34 @@
+ #ifndef INTERNAL_ONLY
+ if (_SOCKS_external) {
+ u_short port;
++ int status, oldf;
++
++ oldf = -1;
++ status = 0;
++ while (1)
++ {
++ if ((oldf = fcntl(s, F_GETFL, NULL)) == -1)
++ {
++ break;
++ }
++ (void)fcntl(s, F_SETFL, oldf&~(O_NDELAY|O_NONBLOCK));
+ if (_SOCKS_read(s,&net.version,sizeof(net.version)) < -1)
+- return -1;
++ break;
+ if (_SOCKS_read(s,&net.cmd,sizeof(net.cmd)) < -1)
+- return -1;
++ break;
+ if (_SOCKS_read(s,&port,sizeof(port)) < -1)
+- return -1;
+- net.port=port;
++ break;
++ net.port = port;
+ if (_SOCKS_read(s,&net.host,sizeof(net.host)) < -1)
+- return -1;
+- } else
++ break;
++ status = 1;
++ break;
++ }
++ if (oldf != -1)
++ (void)fcntl(s, F_SETFL, oldf);
++ if (!status)
++ return (-1);
++ } else
+ #endif /* INTERNAL_ONLY */
+ {
+ if (_SOCKS_read(s,&net,sizeof(net)) < -1)
+@@ -297,6 +323,12 @@
+
+ if (s>=0 && af == AF_INET) {
+ (void)add_sock(s,NULL,type);
++#if 1
++ bval = size;
++ blen = sizeof(bval);
++ (void)setsockopt(s,SOL_SOCKET,SO_RCVBUF,&bval,blen);
++ (void)setsockopt(s,SOL_SOCKET,SO_SNDBUF,&bval,blen);
++#else
+ if (getsockopt(s,SOL_SOCKET,SO_RCVBUF,&bval,&blen)==0 && bval<size) {
+ bval=size;
+ (void)setsockopt(s,SOL_SOCKET,SO_RCVBUF,&bval,blen);
+@@ -305,6 +337,7 @@
+ bval=size;
+ (void)setsockopt(s,SOL_SOCKET,SO_SNDBUF,&bval,blen);
+ }
++#endif
+ }
+ return s;
+ }
+@@ -380,6 +413,7 @@
+ oldf=fcntl(sock,F_GETFL,NULL);
+ (void)fcntl(sock,F_SETFL,oldf&~(O_NDELAY|O_NONBLOCK));
+ (void)ioctl(sock,FIOSNBIO,0);
++ errno = 0;
+ if (Xconnect(sock, sin, sizeof(struct sockaddr_in)) == 0) {
+ if (SendDst(sock, dst) < 0) {
+ ret_val=-1;
+@@ -389,6 +423,7 @@
+ lastSocksHost=sin->sin_addr.s_addr;
+ lastSocksPort=sin->sin_port;
+ *dst=mydst;
++ (void)fcntl(sock,F_SETFL,oldf);
+ return 0;
+ } else {
+ errno=ECONNREFUSED;
+@@ -402,7 +437,7 @@
+ exit(1);
+ }
+ Xclose(new_sock);
+-
++ (void)fcntl(sock,F_SETFL,oldf);
+ return ret_val;
+ }
+ #ifdef PROTOTYPES
+@@ -605,6 +640,12 @@
+ l->sin.sin_family = AF_INET;
+ l->sin_valid = 1;
+
++ if (type == SOCKS_CONNECT) {
++ l->connect_done = 1;
++ } else if (type == SOCKS_BIND) {
++ l->bind_done = 1;
++ }
++
+ return 0;
+ break;
+ default:
+@@ -627,9 +668,20 @@
+ struct sockaddr_in *sin=(struct sockaddr_in *)usin;
+
+ if (size == sizeof(struct sockaddr_in) && sin->sin_family == AF_INET) {
++ register infot *l=find_sock(sock);
+ _SOCKS_last_connect=*sin;
+- return _SOCKS_cbind(sock,sin,size,
+- sin->sin_addr.s_addr,SOCKS_CONNECT);
++ if (l == NULL || !l->connect_done) {
++ return _SOCKS_cbind(sock,sin,size,
++ sin->sin_addr.s_addr,
++ SOCKS_CONNECT);
++ l=find_sock(sock);
++ if (l) {
++ l->connect_done = 1;
++ }
++ } else {
++ errno = EISCONN;
++ return -1;
++ }
+ } else {
+ register infot *l=find_sock(sock);
+ if (l!=NULL)
+@@ -713,10 +765,10 @@
+ }
+
+ #ifdef PROTOTYPES
+-int Rrecvfrom(int s,char *m,int len,int f,struct sockaddr_in *from,int *size)
++int Rrecvfrom(int s,char *m,size_t len,int f,struct sockaddr_in *from,int *size)
+ #else
+ int Rrecvfrom(s,m,len,f,from,size)
+-int s;char *m;int len;int f;struct sockaddr_in *from;int *size;
++int s;char *m;size_t len;int f;struct sockaddr_in *from;int *size;
+ #endif
+ {
+ infot *l=find_sock(s);
+@@ -758,10 +810,10 @@
+ }
+
+ #ifdef PROTOTYPES
+-int Rrecv(int s,char *m,int len,int f)
++int Rrecv(int s,char *m,size_t len,int f)
+ #else
+ int Rrecv(s,m,len,f)
+-int s;char *m;int len;int f;
++int s;char *m;size_t len;int f;
+ #endif
+ {
+ struct sockaddr_in from;
+@@ -771,10 +823,10 @@
+ }
+
+ #ifdef PROTOTYPES
+-int Rsendto(int s,char *m,int len,int f,struct sockaddr_in *to,int size)
++int Rsendto(int s,char *m,size_t len,int f,struct sockaddr_in *to,int size)
+ #else
+ int Rsendto(s,m,len,f,to,size)
+-int s;char *m;int len;int f;struct sockaddr_in *to;int size;
++int s;char *m;size_t len;int f;struct sockaddr_in *to;int size;
+ #endif
+ {
+ infot *l=find_sock(s);
+@@ -805,10 +857,10 @@
+ return _SOCKS_write(s,m,len);
+ }
+ #ifdef PROTOTYPES
+-int Rsend(int s,char *m,int len,int f)
++int Rsend(int s,char *m,size_t len,int f)
+ #else
+ int Rsend(s,m,len,f)
+-int s;char *m;int len;int f;
++int s;char *m;size_t len;int f;
+ #endif
+ {
+ infot *l=find_sock(s);
+@@ -877,17 +929,28 @@
+ fd_set fds;
+ Socks_t dst;
+ infot *l=find_sock(sock);
++ int nfds;
++ struct timeval timeout, *tptr=NULL;
++ int flags;
+
++ errno = 0;
+ if (l == NULL || !l->sin_valid)
+ return Xaccept(sock,sin,size);
+
+ /* if we found the entry, bind or connect was called, so no
+ SOCKSinit is needed. */
+
++ flags = fcntl(sock, F_GETFL, 0);
++ if (flags != -1 && (flags & O_NONBLOCK)) {
++ timeout.tv_sec = 0;
++ timeout.tv_usec = 0;
++ tptr = &timeout;
++ }
++
+ FD_ZERO(&fds);
+ FD_SET(sock, &fds);
+
+- if (select(sock+1, (int*)&fds, NULL, NULL, NULL) > 0)
++ if ((nfds = select(sock+1, &fds, NULL, NULL, tptr)) > 0) {
+ if (FD_ISSET(sock, &fds)) {
+ if (GetDst(sock, &dst) < 0)
+ return -1;
+@@ -901,6 +964,9 @@
+
+ return dup(sock);
+ }
++ }
++ if (nfds == 0)
++ errno = EWOULDBLOCK;
+ return -1;
+ }
+ #ifdef PROTOTYPES