home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / UNIX / Mail / qpopper-2.4-MIHS / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-05  |  2.3 KB  |  139 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <sys/wait.h>
  5. #include <sys/errno.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <varargs.h>
  9. #include <signal.h>
  10.  
  11. #define SERV_TCP_PORT 110
  12.  
  13. char *pname = NULL;
  14. pid_t pgrpid;
  15. int clean=0;
  16.  
  17. extern int errno;
  18. extern int sys_nerr;
  19. extern char *sys_errlist[];
  20. void reaper();
  21. void cleanup();
  22.  
  23. main(argc, argv)
  24. int argc;
  25. char *argv[];
  26. {
  27.     int sockfd, newsockfd, clilen, childpid;
  28.     struct sockaddr_in cli_addr, serv_addr;
  29.  
  30.     pname = argv[0];
  31.  
  32.     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  33.         err_dump("Server : Can't open stream socket");
  34.  
  35.     bzero((char *) &serv_addr, sizeof(serv_addr));
  36.     serv_addr.sin_family = AF_INET;
  37.     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  38.     serv_addr.sin_port = htons(SERV_TCP_PORT);
  39.  
  40.     if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  41.         err_dump("Server : Can't bind local address");
  42.     
  43.     listen(sockfd, 5);
  44.  
  45.     signal(SIGCHLD, reaper);
  46.     signal(SIGTERM, cleanup);
  47.  
  48.     pgrpid = setpgrp();
  49.  
  50.     for(;;) {
  51.  
  52.         if(clean)
  53.         {
  54.             close(sockfd);
  55.             exit(0);
  56.         }
  57.         clilen = sizeof(cli_addr);
  58.         newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
  59.  
  60.         if(newsockfd < 0)
  61.         {
  62.             if(errno == EINTR)
  63.                 continue;
  64.             err_dump("Server: accept error");
  65.         }
  66.         
  67.         if((childpid = fork()) < 0)
  68.             err_dump("Server : fork error");
  69.         
  70.         else if(childpid == 0) {
  71.             close(sockfd);
  72.             dup2(newsockfd,0);
  73.             dup2(newsockfd,1);
  74.             dup2(newsockfd,2);
  75.             close(newsockfd);
  76.             printf("Starting the popper server\n");
  77.             popper(argc,argv);
  78.             exit(0);
  79.         }
  80.  
  81.         close(newsockfd);
  82.     }
  83. }
  84.  
  85. err_dump(va_alist)
  86. va_dcl
  87. {
  88.     va_list args;
  89.     char *fmt;
  90.     va_start(args);
  91.     if(pname != NULL)
  92.         fprintf(stderr, "%s: ", pname);
  93.     fmt = va_arg(args, char *);
  94.     vfprintf(stderr, fmt, args);
  95.     va_end(args);
  96.  
  97.     my_perror();
  98.  
  99.     fflush(stdout);
  100.     fflush(stderr);
  101.  
  102.     abort();
  103.     exit(1);
  104. }
  105.  
  106. my_perror()
  107. {
  108.     char *sys_err_str();
  109.     fprintf(stderr, " %s\n", sys_err_str());
  110. }
  111.  
  112. char *sys_err_str()
  113. {
  114.     static char msgstr[200];
  115.     if(errno != 0)
  116.         if(errno > 0 && errno < sys_nerr)
  117.             sprintf(msgstr,"(%s)", sys_errlist[errno]);
  118.         else
  119.             sprintf(msgstr,"(errno = %d)", errno);
  120.     else
  121.         msgstr[0] = '\0';
  122.     
  123.     return(msgstr);
  124. }
  125.  
  126. void reaper()
  127. {
  128.     int stts;
  129.     while(wait3(&stts, WNOHANG, (struct rusage *)0) >= 0);
  130.     signal(SIGCHLD, reaper);
  131. }
  132.  
  133. void cleanup()
  134. {
  135.     killpg(pgrpid,SIGHUP);
  136.     clean = 1;
  137. }
  138.  
  139.