/* EGGTEL.C used to fork out for telnet connections */ #include #include #include #include #include #include #include #include #include #include /* connects to socket & returns file descriptor */ /* returns <0 if connection refused: */ /* -1 connection refused */ /* -2 can't resolve hostname */ int open_telnet_raw(sock,server,port) int sock; char *server; int port; { int number,i; struct sockaddr_in name; struct hostent *hp; bzero((char *)&name,sizeof(struct sockaddr_in)); name.sin_family=AF_INET; name.sin_port=htons(port); number=1; i=strlen(server)-1; while ((server[i]!='.') && (i!=0)) { if ((server[i]<'0') || (server[i]>'9')) number=0; i--; } if (number) { unsigned char *p,*p1; unsigned long a; p1=(unsigned char *)&a; p1[0]=atoi(server); p=(unsigned char *)strchr(server,'.'); if (p!=NULL) p1[1]=atoi((char *)(p+1)); if (p!=NULL) { p=(unsigned char *)strchr((char *)(p+1),'.'); if (p!=NULL) p1[2]=atoi((char *)(p+1)); } if (p!=NULL) { p=(unsigned char *)strchr((char *)(p+1),'.'); if (p!=NULL) p1[3]=atoi((char *)(p+1)); } if (p!=NULL) name.sin_addr.s_addr=htonl(a); else { close(sock); return -2; } } else { hp=gethostbyname(server); if (hp==NULL) { close(sock); return -2; } bcopy(hp->h_addr,(char *)&name.sin_addr /*.s_addr*/ ,hp->h_length); name.sin_family=hp->h_addrtype; } if (connect(sock,(struct sockaddr *)&name,sizeof(struct sockaddr_in)) <0) { close(sock); sock=-1; } return sock; } /* like open_telnet, but uses server & port specifications of dcc */ int open_telnet_dcc(sock,server,port) int sock; char *server,*port; { int p; unsigned long addr; char sv[121]; unsigned char *c; if (port!=NULL) p=atoi(port); else p=2000; if (server!=NULL) addr=atol(server); else addr=0L; if (addr<(1<<24)) return -3; /* fake address */ c=(unsigned char *)&addr; sprintf(sv,"%u.%u.%u.%u",c[0],c[1],c[2],c[3]); return open_telnet_raw(sock,sv,p); } main(argc,argv) int argc; char **argv; { int sk; if (argc<4) { fprintf(stderr,"Usage: eggtel \n"); exit(1); } sk=atoi(argv[1]); if (strchr(argv[2],'.')==NULL) sk=open_telnet_dcc(sk,argv[2],argv[3]); else sk=open_telnet_raw(sk,argv[2],argv[3]); if (sk>=0) exit(0); else exit(errno); }