home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1999 May / pcp151c.iso / misc / src / install / syslog.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  2.1 KB  |  97 lines

  1. #include <errno.h>
  2. #include <sys/fcntl.h>
  3. #include <sys/select.h>
  4. #include <sys/socket.h>
  5. #include <sys/types.h>
  6. #include <sys/un.h>
  7. #include <sys/wait.h>
  8. #include <unistd.h>
  9.  
  10. #include "log.h"
  11.  
  12. int handleSyslogSocket(char * rootPath) {
  13.     int sock;
  14.     struct sockaddr_un sockaddr;
  15.     char buf[8192];
  16.     int out;
  17.     pid_t child;
  18.     int readFd = -1;
  19.     int rc, i, s;
  20.     fd_set readSet;
  21.     char * fn;
  22.  
  23.     logMessage("in handleSyslogSocket");
  24.  
  25.     if ((child = fork())) {
  26.     /* original parent */
  27.     waitpid(child, &out, 0);
  28.     return 0;
  29.     }
  30.  
  31.     logMessage("in intermediate child -- pid is %d", getpid());
  32.  
  33.     /* disassociate from parent -- init makes a find stepparent */
  34.     if (fork()) exit(0);
  35.  
  36.     logMessage("in final child -- pid is %d", getpid());
  37.  
  38.     /* now open the syslog socket */
  39.     fn = alloca(strlen(rootPath + 20));
  40.     sprintf(fn, "%s/dev/log", rootPath);
  41.     sockaddr.sun_family = AF_UNIX;
  42.     unlink(fn);
  43.     strcpy(sockaddr.sun_path, fn);
  44.     sock = socket(AF_UNIX, SOCK_STREAM, 0);
  45.     if (sock < 0) {
  46.     logMessage("syslog: error creating socket: %d", errno);
  47.     exit(1);
  48.     }
  49.     if (bind(sock, (struct sockaddr *) &sockaddr, sizeof(sockaddr.sun_family) + 
  50.             strlen(sockaddr.sun_path))) {
  51.     logMessage("syslog: bind error: %d", errno);
  52.     }
  53.     if (listen(sock, 5)) {
  54.     logMessage("listen error: %d", errno);
  55.     }
  56.  
  57.     out = open("/dev/tty4", O_RDONLY);
  58.     logMessage("out file is %d", out);
  59.  
  60.     while (sock > 0) {
  61.     FD_ZERO(&readSet);
  62.     FD_SET(sock, &readSet);
  63.     if (readFd > -1) {
  64.         FD_SET(readFd, &readSet);
  65.     }
  66.  
  67.     rc = select(20, &readSet, NULL, NULL, NULL);
  68.     if (rc <= 0) continue;
  69.  
  70.     if (FD_ISSET(sock, &readSet)) {
  71.         s = sizeof(sockaddr);
  72.         /* if readFd is already set, we lose data. shucks. */
  73.         readFd = accept(sock, (struct sockaddr *) &sockaddr, &s);
  74.         if (readFd < 0) {
  75.         logMessage("error in accept: %d", errno);
  76.         close(sock);
  77.         sock = -1;
  78.         }
  79.     }
  80.  
  81.     if ((readFd > -1) && FD_ISSET(readFd, &readSet)) {
  82.         i = read(readFd, buf, sizeof(buf));
  83.         if (i > 0) 
  84.         write(out, buf, i);
  85.         else {
  86.         close(readFd);
  87.         readFd = -1;
  88.         }
  89.     }
  90.     }
  91.  
  92.     logMessage("syslog() voodoo exiting");
  93.  
  94.     exit(0);
  95. }
  96.  
  97.