/* (C) Spiros Ioannou 1999 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include int connect_to(char *server,int port,int *sd); int connect_to(char *server,int port,int *sd) { struct sockaddr_in sin; struct hostent *hp; hp = gethostbyname(server); if (hp==NULL) { printf("netecho:unknown host: %s\n",server); return(-2); } bzero((char*) &sin, sizeof(sin)); bcopy(hp->h_addr, (char *) &sin.sin_addr, hp->h_length); sin.sin_family = hp->h_addrtype; sin.sin_port = htons(port); return connect(*sd,(struct sockaddr *) &sin, sizeof(sin)); } int main(int argc, char **argv) { int one = 1,r,l,i,s; int sd; int fdc; fd_set inout_fds; char buff[1024]; int port; if (argc != 3 || !strcmp(argv[1],"-h")) { fprintf(stderr, "netecho version 0.1 1999\n"); fprintf(stderr, "Usage: netecho \n" "\tinput is read from stdin\n\n"); exit(0); } port = atoi(argv[2]); if (ttyname(0)){ fdc = open(ttyname(0), O_RDWR); if (!fdc) { fprintf(stderr, "netecho:open %s:\n",ttyname(0)); perror("open"); exit(1); } } else fdc=0; if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("netecho:socket"); exit(2); } setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(one)); if (connect_to(argv[1],port,&sd)<0) { perror("netecho:connect"); exit(3); } if (!fdc) { l=read(fdc, buff, 1024); r=write(sd, buff, l); } do { FD_ZERO(&inout_fds); FD_SET(sd, &inout_fds); if (fdc) FD_SET(fdc, &inout_fds); r=l=i=0; do { s = select(64, &inout_fds,(fd_set *)0,(fd_set *)0,(struct timeval *)0); } while (s == EINTR && i++ < 20); if (i < 0) { perror("statusd:select"); exit(4); } //read from socket if (FD_ISSET(sd, &inout_fds)) { r=read(sd, buff, 1024); if (fdc) l=write(fdc, buff,r); else l=write(1, buff,r); //printf("sd-> r:%d l:%d,buff=#%s#\n",r,l,buff); } //write to socket else if (fdc && FD_ISSET(fdc, &inout_fds)) { l=read(fdc, buff, 1024); r=write(sd, buff, l); //printf("->sd r:%d l:%d,buff=#%s#\n",r,l,buff); } bzero(buff,1024); } while (r&&l); return 1; }