home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / lpopper.zip / connect.c < prev    next >
C/C++ Source or Header  |  1999-11-09  |  3KB  |  131 lines

  1. #include "popper.h"
  2.  
  3.  
  4. char TimeStamp[1024];
  5.  
  6.  
  7. void ChildDie (int SigNo)
  8. { int PID, t;
  9.  
  10.   if(SigNo==SIGCHLD)
  11.     { PID=wait(&t);
  12.       signal(SIGCHLD, SIG_ACK);
  13.     }
  14. }
  15.  
  16. int WaitConn(void)
  17. { int Sk, clSk;
  18.   int i;
  19.   struct sockaddr_in SAddr, Client;
  20.   struct servent * pop3Port;
  21.   struct hostent * ClAddr;
  22.   char Host[128];
  23. /*  time_t Time;*/
  24.   int Res;
  25.   
  26.  
  27.   Sk=socket(AF_INET, SOCK_STREAM, 0);
  28.   if(Sk<0)
  29.     { perror("Can't create socket");
  30.       return(-1);
  31.     }
  32.   i=1;
  33.   if(setsockopt(Sk, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i))!=0)
  34.     { perror("Can't set socket options");
  35.       return(-1);
  36.     }
  37.  
  38.   pop3Port=getservbyname("pop3", NULL);
  39.   if(pop3Port==NULL)
  40.     { perror("pop3 : unknown service");
  41.       return(-1);
  42.     }
  43.   memset(&SAddr, 0, sizeof(struct sockaddr_in));
  44.   SAddr.sin_port=pop3Port->s_port;
  45.   SAddr.sin_family=AF_INET;
  46.   SAddr.sin_addr.s_addr=INADDR_ANY;
  47.   if(bind(Sk, (struct sockaddr*) &SAddr, sizeof(struct sockaddr_in))!=0)
  48.     { perror("Can't bind socket");
  49.       return(-1);
  50.     }
  51.  
  52.   if(listen(Sk, 5)!=0)
  53.     { perror("Can't set listening socket");
  54.       return(-1);
  55.     }
  56.  
  57.   printf("Accepting connections on port %u\n", ntohs(SAddr.sin_port));
  58.  
  59.   signal(SIGCHLD, ChildDie);
  60.  
  61.   do { 
  62.        do { i=sizeof(struct sockaddr_in);
  63.             clSk=accept(Sk, (struct sockaddr*)&Client, &i);
  64.           } while((clSk<0) && (errno==EINTR));
  65.        if(clSk<0)
  66.          { /*perror("Can't accept incoming connection");*/
  67.            continue;
  68.          }
  69.        ClAddr=gethostbyaddr((char*)&Client.sin_addr.s_addr, sizeof(Client.sin_addr.s_addr), AF_INET);
  70.        Host[0]=0;
  71.        if(ClAddr!=NULL)
  72.          { strncpy(Host, ClAddr->h_name, 120);
  73.            Host[120]=0;
  74.            ePrintTime();
  75.            fprintf(stderr, "Incoming connection from %s [%s]\n", Host, inet_ntoa(Client.sin_addr));
  76.          }
  77.  
  78.        fflush(stdout);
  79.        fflush(stderr);
  80.        Res=fork();
  81.        if(Res<0)
  82.          { perror("Panic : can't start child process ");
  83.            close(clSk);
  84.            continue;
  85.          }
  86.        if(Res==0)
  87.          { /*New connection - process it*/
  88.  
  89.            if(close(Sk)!=0)
  90.              { perror("Can't close master socket (child)");
  91.                return(-1);
  92.              }
  93.            DoCommand(clSk);
  94.            ePrintTime();
  95.            fprintf(stderr, "%s POP3 session ends.\n", Host);
  96.            exit(0);
  97.          }
  98.         else
  99.          { if(close(clSk)!=0)
  100.              { perror("Can't close child socket (parent)");
  101.                return(-1);
  102.              }
  103.          }
  104.      }while(1);
  105.  
  106.   return(0);
  107. }
  108.  
  109.  
  110. int SkGetS (int Sk, char * Buf)
  111. { int i=0;
  112.  
  113.   i=Buf[0]=0;
  114.   do { if(read(Sk, &Buf[i], 1)!=1) return(-1);
  115.        if(i>2040) return(-1);
  116.        if(Buf[i]==0x0A)
  117.          { Buf[i]=0;
  118.            break;
  119.          }
  120. /*       fprintf(stderr, "[%c][%2.2X]\n", (unsigned int)Buf[i], (unsigned int)Buf[i]);*/
  121.        i++;
  122.      } while(1);
  123.  
  124. /*  fprintf(stderr, "\n");*/
  125.   DelEndCRLF(Buf);
  126.   ePrintTime();
  127.   fprintf(stderr, "%s\n", Buf);
  128.   return(0);
  129. }
  130.  
  131.