Advertisement
Guest User

Untitled

a guest
Apr 30th, 2013
57
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. #include <sys/socket.h>
  7. #include <arpa/inet.h>
  8. #include <errno.h>
  9. #include <sys/wait.h>
  10. #define PPPD_PATH "/usr/sbin/pppd"
  11.  
  12.  
  13.  
  14.  
  15. int main(int argc, char **argv)
  16. {
  17.     char *server = NULL;
  18.     char *mode;
  19.     int srv;
  20.  
  21.  
  22.     int port, conn_s;
  23.     struct sockaddr_in serv_addr, client_addr; 
  24.     int cliaddr;
  25.  
  26.  
  27.  
  28.     int readpipe[2], writepipe[2];
  29.    
  30.     unsigned char buf[1024];
  31.  
  32.     int ret=0;
  33.    
  34.     if (argc == 1)
  35.     {
  36.         printf("no arguments!\n");
  37.         return 0;
  38.     }
  39.     mode = argv[1];
  40.    
  41.     if (strcmp(mode, "server")==0)
  42.     {
  43.         srv = 1;
  44.     }
  45.     else if (strcmp(mode, "client") == 0)
  46.     {
  47.         srv = 0;
  48.     }
  49.     else
  50.     {
  51.         printf("wrong argument!\n");
  52.         return 0;
  53.     }
  54.    
  55.     pipe(readpipe);
  56.     pipe(writepipe);
  57.  
  58.    
  59.    
  60.     port=socket(AF_INET, SOCK_STREAM, 0);  
  61.  
  62.  
  63.     if (srv == 0)
  64.     {
  65.         int portn;
  66.         port=socket(AF_INET, SOCK_STREAM, 0);
  67.         sscanf(argv[3], "%i", &portn);
  68.  
  69.  
  70.             serv_addr.sin_family = AF_INET;
  71.             serv_addr.sin_addr.s_addr = inet_addr(argv[2]);
  72.         serv_addr.sin_port = htons(portn);
  73.  
  74.             ret = connect(port, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
  75.             if (ret < 0)
  76.             {
  77.                     printf("server not found\n");
  78.                     return (0);
  79.             }
  80.         conn_s = port;
  81.     }
  82.     else
  83.     {
  84.         int portn;
  85.         sscanf(argv[2], "%i", &portn);
  86.         serv_addr.sin_family = AF_INET;
  87.             serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  88.             serv_addr.sin_port = htons(portn);
  89.  
  90.             bind(port, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
  91.             listen(port, 1024);
  92.         conn_s = accept(port, NULL, NULL);
  93.                 printf("Accepted!\n");
  94.     }
  95.     ret = fork();
  96.     if (ret < 0)
  97.     {
  98.         printf("fork failed!\n");
  99.         return 0;
  100.     }
  101.     else if (ret == 0)
  102.     {
  103.        
  104.         ret = fork();
  105.         if (ret == 0)
  106.         {
  107.             printf("PPP\n");
  108.             dup2(readpipe[0], 0);
  109.             dup2(writepipe[1], 1);
  110.    
  111.             close(readpipe[0]);
  112.             close(readpipe[1]);
  113.             close(writepipe[0]);
  114.             close(writepipe[1]);
  115.    
  116.             if (srv == 0)  
  117.             {
  118.                 execl(PPPD_PATH, "nodetach", "notty", "noauth", NULL); 
  119.             }
  120.             else
  121.             {
  122.                 execl(PPPD_PATH, "nodetach", "notty", "noauth", "persist", "passive", NULL);   
  123.             }
  124.         }
  125.         else
  126.         {
  127.             int code;
  128.             close(readpipe[0]);
  129.             close(readpipe[1]);
  130.             close(writepipe[0]);
  131.             close(writepipe[1]);
  132.    
  133.             wait(&code);
  134.             printf("PARENT: Код возврата PPPD:%d\n", WEXITSTATUS(code));
  135.            
  136.         }
  137.     }
  138.     else
  139.     {
  140.         printf("PPP id = %i\n", ret);
  141.         unsigned code = 0;
  142.         while (1)
  143.         {
  144.             int cnt;
  145.             cnt = read(writepipe[0], buf, 1024);
  146.             if (cnt > 0)
  147.             {
  148.                 send(conn_s, buf, cnt, MSG_DONTWAIT);
  149.                 printf("send %i\n", cnt);
  150.             }
  151.            
  152.             cnt = recv(conn_s, buf, 1024, 0);
  153.             if (cnt > 0)
  154.             {
  155.                 printf("Receive %i\n", cnt);
  156.                 write(readpipe[1], buf, cnt);
  157.             }
  158.         }  
  159.  
  160.        
  161.     }
  162.     return 0;
  163. }
Advertisement
RAW Paste Data Copied
Advertisement