chiark / gitweb /
found on davenant in /usr/local/src/misc
[chiark-utils.git] / cprogs / smtpallow.c~
1 /**/
2
3 #include <netinet/in.h>
4
5 _syscall2(long,socketcall,int,call,unsigned long *,args);
6 int real_connect(int sockfd, const struct sockaddr *saddr, int addrlen)
7 {
8         unsigned long args[3];
9
10         args[0] = sockfd;
11         args[1] = (unsigned long)saddr;
12         args[2] = addrlen;
13         return socketcall(SYS_CONNECT, args);
14 }
15
16 int connect(int fd, struct sockaddr_in *them, int *addrlen) {
17   int r,l;
18   struct sockaddr_in us;
19   pid_t c;
20   
21   if (*addrlen == sizeof(us) &&
22       them->sin_family == AF_INET &&
23       them->sin_port == htons(13)) {
24     r= getsockname(fd,&us,&l); if (r<0) return r;
25     if (!ntohs(us.port)) {
26       for (i=1023; i>0; i++) {
27         us.port= htons(i);
28         if (!bind(fd,&us,sizeof(us))) break;
29         if (errno != EADDRINUSE) return -1;
30       }
31       if (!i) return -1;
32     }
33   }
34   return real_connect(fd,them,addrlen);
35 }