#include #include #include #include #include #include extern int errno; #include #include #include #include extern char *optarg; extern int optind; extern struct servent *getservbyport(); char *target = (char *)0; int vflg = 0; int xflg = 0; int gflg = 0; int waitime = 5; main(ac,av) int ac; char **av; { int loport = 1; int hiport = 30000; char *s; struct sockaddr_in addr; struct hostent *hp; int fd; int x; int xit; char *p; signal(SIGPIPE,SIG_IGN); while((x = getopt(ac,av,"gl:h:vxw:")) != -1) { switch(x) { case 'v': vflg++; break; case 'x': xflg++; break; case 'g': gflg++; break; case 'h': hiport = atoi(optarg); break; case 'w': waitime = atoi(optarg); break; case 'l': loport = atoi(optarg); break; } } if(optind == ac) { fprintf(stderr,"usage: %s [-g (grab output)] [-w waittimeout] [-l low port] [-h high port] [-v] host\n",av[0]); exit(1); } for(xit = optind; xit < ac; xit++) { s = target = av[xit]; p = s; while(*p != '\0' && (*p == '.' || isdigit(*p))) p++; /* not all digits or dots */ if(*p != '\0') { if((hp = gethostbyname(s)) == (struct hostent *)0) { fprintf(stderr,"%s: address unknown\n",s); exit(1); } (void)bcopy(hp->h_addr,(char *)&addr.sin_addr,hp->h_length); } else { unsigned long f; if((f = inet_addr(s)) == -1L) { fprintf(stderr,"%s: address unparsable\n",s); exit(1); } (void)bcopy((char *)&f,(char *)&addr.sin_addr,sizeof(f)); } if(vflg) fprintf(stderr,"%s: trying stream ports between %d and %d\n",inet_ntoa(addr.sin_addr),loport,hiport); for(x = loport; x < hiport + 1; x++) { if(vflg) fprintf(stderr,"."); addr.sin_port = htons(x); addr.sin_family = AF_INET; fd = socket(AF_INET,SOCK_STREAM,0); fcntl(fd,F_SETFL,FNDELAY); if(fd < 0) { perror("socket"); exit(1); } if(connect(fd,(struct sockaddr *)&addr,sizeof(addr)) != 0) { fd_set msk; struct timeval timo; if(errno != EWOULDBLOCK && errno != EINPROGRESS) { if(vflg) perror("connect"); goto giveup; } FD_ZERO(&msk); FD_SET(fd,&msk); timo.tv_sec = waitime; timo.tv_usec = 0; if(select(fd + 1,&msk,0,0,&timo) < 1) goto giveup; if(write(fd,"",0) < 0) goto giveup; gotport(x,fd); } else gotport(x,fd); giveup: close(fd); } if(vflg) fprintf(stderr,"\n"); } exit(0); } gotport(p,fd) int p; int fd; { struct servent *sp; setservent(1); if((sp = getservbyport(htons(p),"tcp")) != (struct servent *)0) { if(vflg) fprintf(stderr,"\n%c%s\n",07,sp->s_name); else { if(xflg) printf("%s: ",target); printf("%s\n",sp->s_name); } } else { if(vflg) fprintf(stderr,"\n%c%d\n",07,p); else { if(xflg) printf("%s: ",target); printf("%d\n",p); } } if(gflg) { char gbuf[BUFSIZ]; fd_set msk; struct timeval timo; int cnt; int red; cnt = 0; get_more: FD_ZERO(&msk); FD_SET(fd,&msk); timo.tv_sec = waitime; timo.tv_usec = 0; if(select(fd + 1,&msk,0,0,&timo) != 1) goto nomore; if((red = read(fd,gbuf,sizeof(gbuf))) > 0) { if(cnt == 0) { if(vflg) fprintf(stderr,"-begin capture-\n"); else { if(xflg) printf("%s: ",target); printf("-begin capture-\n"); } } pbuf(gbuf,red); if(++cnt < 5) { (void)write(fd,"foo\r\n",2); goto get_more; } } nomore: if(cnt > 0) { if(vflg) fprintf(stderr,"\n-end capture-\n"); else { if(xflg) printf("%s: ",target); printf("\n-end capture-\n"); } } } } pbuf(buf,siz) unsigned char *buf; int siz; { int px; for(px = 0; px < siz; px++) { if(isprint(buf[px]) || isspace(buf[px])) { if(vflg) fprintf(stderr,"%c",buf[px]); else printf("%c",buf[px]); } else { if(vflg) fprintf(stderr,"(0x%o)",buf[px]); else printf("(0x%o)",buf[px]); } } }