4 #include <sys/socketcall.h>
5 #include <netinet/in.h>
8 _syscall2(long,socketcall,int,call,unsigned long *,args);
10 int real_connect(int sockfd, const struct sockaddr *saddr, int addrlen)
12 unsigned long args[3];
15 args[1] = (unsigned long)saddr;
17 return socketcall(SYS_CONNECT, args);
20 int connect(int fd, const struct sockaddr *them_any, int addrlen) {
21 struct sockaddr_in *them= (struct sockaddr_in*)them_any;
23 struct sockaddr_in us;
25 if (addrlen == sizeof(us) &&
26 them->sin_family == AF_INET &&
27 them->sin_port == htons(25)) {
28 memset(&us,0,sizeof(us));
30 us.sin_family= AF_INET;
31 us.sin_addr.s_addr= INADDR_ANY;
32 r= getsockname(fd,(struct sockaddr*)&us,&l);
33 if (r<0 && errno != EINVAL) return r;
34 if (!ntohs(us.sin_port)) {
35 for (i=1023; i>0; i--) {
36 us.sin_port= htons(i);
37 if (!bind(fd,(struct sockaddr*)&us,sizeof(us))) break;
38 if (errno != EADDRINUSE) return -1;
41 } else if (r<0) return r;
43 return real_connect(fd,them_any,addrlen);