home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit v2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Unix / c-src / dp.c < prev    next >
C/C++ Source or Header  |  1999-11-04  |  3KB  |  138 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <sys/wait.h>
  4. #include <netinet/in.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <errno.h>
  8. #include <unistd.h>
  9. #include <netdb.h>
  10.  
  11. #include <linux/time.h>
  12.  
  13. #undef STRERROR
  14. #ifdef STRERROR
  15. extern char *sys_errlist[];
  16. extern int sys_nerr;
  17. char *undef = "Undefined error";
  18.  
  19. char *strerror(error)  
  20.   int error;
  21. {
  22.   if (error > sys_nerr)
  23.     return undef;
  24.   return sys_errlist[error];
  25. }
  26. #endif
  27.  
  28. main(argc, argv)
  29.   int argc;
  30.   char **argv;
  31. {
  32.   int lsock, csock, osock;
  33.   FILE *cfile;
  34.   char buf[4096];
  35.   struct sockaddr_in laddr, caddr, oaddr;
  36.   int caddrlen = sizeof(caddr);
  37.   fd_set fdsr, fdse;
  38.   struct hostent *h;
  39.   struct servent *s;
  40.   int nbyt;
  41.   unsigned long a;
  42.   unsigned short oport;
  43.  
  44.   if (argc != 4) {
  45.     fprintf(stderr,"Usage: %s localport remoteport remotehost\n",argv[0]);
  46.     return 30;
  47.   }
  48.   a = inet_addr(argv[3]);
  49.   if (!(h = gethostbyname(argv[3])) &&
  50.       !(h = gethostbyaddr(&a, 4, AF_INET))) {
  51.     perror(argv[3]);
  52.     return 25;
  53.   }
  54.   oport = atol(argv[2]);
  55.   laddr.sin_port = htons((unsigned short)(atol(argv[1])));
  56.   if ((lsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  57.     perror("socket");
  58.     return 20;
  59.   }
  60.   laddr.sin_family = htons(AF_INET);
  61.   laddr.sin_addr.s_addr = htonl(0);
  62.   if (bind(lsock, &laddr, sizeof(laddr))) {
  63.     perror("bind");
  64.     return 20;
  65.   }
  66.   if (listen(lsock, 1)) {
  67.     perror("listen");
  68.     return 20;
  69.   }
  70.   if ((nbyt = fork()) == -1) {
  71.     perror("fork");
  72.     return 20;
  73.   }
  74.   if (nbyt > 0)
  75.     return 0;
  76.   setsid();
  77.   while ((csock = accept(lsock, &caddr, &caddrlen)) != -1) {
  78.     cfile = fdopen(csock,"r+");
  79.     if ((nbyt = fork()) == -1) {
  80.       fprintf(cfile, "500 fork: %s\n", strerror(errno));
  81.       shutdown(csock,2);
  82.       fclose(cfile);
  83.       continue;
  84.     }
  85.     if (nbyt == 0)
  86.       goto gotsock;
  87.     fclose(cfile);
  88.     while (waitpid(-1, NULL, WNOHANG) > 0);
  89.   }
  90.   return 20;
  91.  
  92.  gotsock:
  93.   if ((osock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  94.     fprintf(cfile, "500 socket: %s\n", strerror(errno));
  95.     goto quit1;
  96.   }
  97.   oaddr.sin_family = h->h_addrtype;
  98.   oaddr.sin_port = htons(oport);
  99.   memcpy(&oaddr.sin_addr, h->h_addr, h->h_length);
  100.   if (connect(osock, &oaddr, sizeof(oaddr))) {
  101.     fprintf(cfile, "500 connect: %s\n", strerror(errno));
  102.     goto quit1;
  103.   }
  104.   while (1) {
  105.     FD_ZERO(&fdsr);
  106.     FD_ZERO(&fdse);
  107.     FD_SET(csock,&fdsr);
  108.     FD_SET(csock,&fdse);
  109.     FD_SET(osock,&fdsr);
  110.     FD_SET(osock,&fdse);
  111.     if (select(20, &fdsr, NULL, &fdse, NULL) == -1) {
  112.       fprintf(cfile, "500 select: %s\n", strerror(errno));
  113.       goto quit2;
  114.     }
  115.     if (FD_ISSET(csock,&fdsr) || FD_ISSET(csock,&fdse)) {
  116.       if ((nbyt = read(csock,buf,4096)) <= 0)
  117.     goto quit2;
  118.       if ((write(osock,buf,nbyt)) <= 0)
  119.     goto quit2;
  120.     } else if (FD_ISSET(osock,&fdsr) || FD_ISSET(osock,&fdse)) {
  121.       if ((nbyt = read(osock,buf,4096)) <= 0)
  122.     goto quit2;
  123.       if ((write(csock,buf,nbyt)) <= 0)
  124.     goto quit2;
  125.     }
  126.   }
  127.  
  128.  quit2:
  129.   shutdown(osock,2);
  130.   close(osock);
  131.  quit1:
  132.   fflush(cfile);
  133.   shutdown(csock,2);
  134.  quit0:
  135.   fclose(cfile);
  136.   return 0;
  137. }
  138.