diff options
| -rw-r--r-- | toys/pending/syslogd.c | 129 | 
1 files changed, 47 insertions, 82 deletions
| diff --git a/toys/pending/syslogd.c b/toys/pending/syslogd.c index de37e16a..5136e37c 100644 --- a/toys/pending/syslogd.c +++ b/toys/pending/syslogd.c @@ -37,27 +37,9 @@ config SYSLOGD  #include "toys.h"  #include "toynet.h" -GLOBALS( -  char *socket; -  char *config_file; -  char *unix_socket; -  char *logfile; -  long interval; -  long rot_size; -  long rot_count; -  char *remote_log; -  long log_prio; - -  struct arg_list *lsocks;  // list of listen sockets -  struct arg_list *lfiles;  // list of write logfiles -  fd_set rfds;        // fds for reading -  int sd;            // socket for logging remote messeges. -  int sigfd[2]; -) - -  // UNIX Sockets for listening  struct unsocks { +  struct unsocks *next;    char *path;    struct sockaddr_un sdu;    int sd; @@ -65,6 +47,7 @@ struct unsocks {  // Log file entry to log into.  struct logfile { +  struct logfile *next;    char *filename;    char *config;    int isNetwork; @@ -74,6 +57,24 @@ struct logfile {    struct sockaddr_in saddr;  }; +GLOBALS( +  char *socket; +  char *config_file; +  char *unix_socket; +  char *logfile; +  long interval; +  long rot_size; +  long rot_count; +  char *remote_log; +  long log_prio; + +  struct unsocks *lsocks;  // list of listen sockets +  struct logfile *lfiles;  // list of write logfiles +  fd_set rfds;        // fds for reading +  int sd;            // socket for logging remote messeges. +  int sigfd[2]; +) +  // Lookup numerical code from name  // Also used in logger  int logger_lookup(int where, char *key) @@ -97,18 +98,15 @@ static char *dec(int val, CODE *clist)  // Adds opened socks to rfds for select()  static int addrfds(void)  { -  struct unsocks *sock; +  struct unsocks *sock = TT.lsocks;    int ret = 0; -  struct arg_list *node = TT.lsocks;    FD_ZERO(&TT.rfds); -  while (node) { -    sock = (struct unsocks*) node->arg; +  for (; sock; sock = sock->next) {      if (sock->sd > 2) {        FD_SET(sock->sd, &TT.rfds);        ret = sock->sd;      } -    node = node->next;    }    FD_SET(TT.sigfd[0], &TT.rfds);    return (TT.sigfd[0] > ret) ? TT.sigfd[0] : ret; @@ -121,12 +119,10 @@ static int addrfds(void)   */  static int open_unix_socks(void)  { -  struct arg_list *node;    struct unsocks *sock;    int ret = 0; -  for(node = TT.lsocks; node; node = node->next) { -    sock = (struct unsocks*) node->arg; +  for(sock = TT.lsocks; sock; sock = sock->next) {      sock->sdu.sun_family = AF_UNIX;      strcpy(sock->sdu.sun_path, sock->path);      sock->sd = socket(AF_UNIX, SOCK_DGRAM, 0); @@ -146,16 +142,6 @@ static int open_unix_socks(void)    return ret;  } -// Returns node having filename -static struct arg_list *get_file_node(char *filename, struct arg_list *list) -{ -  while (list) { -    if (!strcmp(((struct logfile*) list->arg)->filename, filename)) return list; -    list = list->next; -  } -  return list; -} -  /*   * recurses the logfile list and resolves config   * for evry file and updates facilty and log level bits. @@ -222,21 +208,18 @@ static int parse_config_file(void)    char *confline = NULL, *tk = NULL, *tokens[2] = {NULL, NULL};    int len, tcount, lineno = 0;    size_t linelen; -  struct arg_list *node;    /*     * if -K then open only /dev/kmsg     * all other log files are neglected     * thus no need to open config either.     */    if (toys.optflags & FLAG_K) { -    node = xzalloc(sizeof(struct arg_list));      file = xzalloc(sizeof(struct logfile));      file->filename = "/dev/kmsg";      file->config = "*.*";      memset(file->level, 0xFF, sizeof(file->level));      memset(file->facility, 0xFFFFFFFF, sizeof(file->facility)); -    node->arg = (char*) file; -    TT.lfiles = node; +    TT.lfiles = file;      return 0;    }    /* @@ -246,15 +229,13 @@ static int parse_config_file(void)     * open config either so just return.     */    if (toys.optflags & FLAG_R) { -    node = xzalloc(sizeof(struct arg_list));      file = xzalloc(sizeof(struct logfile));      file->filename = xmsprintf("@%s",TT.remote_log);      file->isNetwork = 1;      file->config = "*.*";      memset(file->level, 0xFF, sizeof(file->level));      memset(file->facility, 0xFFFFFFFF, sizeof(file->facility)); -    node->arg = (char*) file; -    TT.lfiles = node; +    TT.lfiles = file;      if (!(toys.optflags & FLAG_L)) return 0;    }    /* @@ -291,9 +272,9 @@ static int parse_config_file(void)        return -1;      }      if (*tokens[1] != '*') { -      node = get_file_node(tokens[1], TT.lfiles); -      if (!node) { -        node = xzalloc(sizeof(struct arg_list)); +      file = TT.lfiles; +      while (file && !strcmp(file->filename, tokens[1])) file = file->next; +      if (!file) {          file = xzalloc(sizeof(struct logfile));          file->config = xstrdup(tokens[0]);          if (resolve_config(file)==-1) { @@ -302,11 +283,9 @@ static int parse_config_file(void)          }          file->filename = xstrdup(tokens[1]);          if (*file->filename == '@') file->isNetwork = 1; -        node->arg = (char*) file; -        node->next = TT.lfiles; -        TT.lfiles = node; +        file->next = TT.lfiles; +        TT.lfiles = file;        } else { -        file = (struct logfile*) node->arg;          int rel = strlen(file->config) + strlen(tokens[0]) + 2;          file->config = xrealloc(file->config, rel);          sprintf(file->config, "%s;%s", file->config, tokens[0]); @@ -322,16 +301,14 @@ static int parse_config_file(void)     * adding default logfile to the head of list.     */    if (!fp){ -    node = xzalloc(sizeof(struct arg_list));      file = xzalloc(sizeof(struct logfile));      file->filename = (toys.optflags & FLAG_O) ?                       TT.logfile : "/var/log/messages"; //DEFLOGFILE      file->config = "*.*";      memset(file->level, 0xFF, sizeof(file->level));      memset(file->facility, 0xFFFFFFFF, sizeof(file->facility)); -    node->arg = (char*) file; -    node->next = TT.lfiles; -    TT.lfiles = node; +    file->next = TT.lfiles; +    TT.lfiles = file;    } else fclose(fp);    return 0;  } @@ -339,10 +316,9 @@ static int parse_config_file(void)  // open every log file in list.  static void open_logfiles(void)  { -  struct arg_list *node; +  struct logfile *tfd; -  for (node = TT.lfiles; node; node = node->next) { -    struct logfile *tfd = (struct logfile*) node->arg; +  for (tfd = TT.lfiles; tfd; tfd = tfd->next) {      char *p, *tmpfile;      long port = 514; @@ -418,7 +394,7 @@ static void logmsg(char *msg, int len)    char *p, *ts, *lvlstr, *facstr;    struct utsname uts;    int pri = 0; -  struct arg_list *lnode = TT.lfiles; +  struct logfile *tf = TT.lfiles;    char *omsg = msg;    int olen = len, fac, lvl; @@ -455,8 +431,7 @@ static void logmsg(char *msg, int len)    }    if (lvl >= TT.log_prio) return; -  while (lnode) { -    struct logfile *tf = (struct logfile*) lnode->arg; +  for (; tf; tf = tf->next) {      if (tf->logfd > 0) {        if ((tf->facility[lvl] & (1 << fac)) && (tf->level[fac] & (1<<lvl))) {          int wlen; @@ -466,7 +441,6 @@ static void logmsg(char *msg, int len)          if (wlen < 0) perror_msg("write failed file : %s ", tf->filename + tf->isNetwork);        }      } -    lnode = lnode->next;    }  } @@ -476,22 +450,19 @@ static void logmsg(char *msg, int len)   */  static void cleanup(void)  { -  struct arg_list *fnode;    while (TT.lsocks) { -    fnode = TT.lsocks; -    if (((struct unsocks*) fnode->arg)->sd >= 0) -      close(((struct unsocks*) fnode->arg)->sd); -    free(fnode->arg); +    struct unsocks *fnode = TT.lsocks; + +    if (fnode->sd >= 0) close(fnode->sd);      TT.lsocks = fnode->next;      free(fnode);    }    unlink("/dev/log");    while (TT.lfiles) { -    fnode = TT.lfiles; -    if (((struct logfile*) fnode->arg)->logfd >= 0) -      close(((struct logfile*) fnode->arg)->logfd); -    free(fnode->arg); +    struct logfile *fnode = TT.lfiles; + +    if (fnode->logfd >= 0) close(fnode->logfd);      TT.lfiles = fnode->next;      free(fnode);    } @@ -508,7 +479,6 @@ void syslogd_main(void)    struct unsocks *tsd;    int maxfd, retval, last_len=0;    struct timeval tv; -  struct arg_list *node;    char *temp, *buffer = (toybuf +2048), *last_buf = (toybuf + 3072); //these two buffs are of 1K each    if ((toys.optflags & FLAG_p) && (strlen(TT.unix_socket) > 108)) @@ -517,21 +487,18 @@ void syslogd_main(void)    TT.config_file = (toys.optflags & FLAG_f) ?                     TT.config_file : "/etc/syslog.conf"; //DEFCONFFILE  init_jumpin: -  TT.lsocks = xzalloc(sizeof(struct arg_list));    tsd = xzalloc(sizeof(struct unsocks));    tsd->path = (toys.optflags & FLAG_p) ? TT.unix_socket : "/dev/log"; // DEFLOGSOCK -  TT.lsocks->arg = (char*) tsd; +  TT.lsocks = tsd;    if (toys.optflags & FLAG_a) {      for (temp = strtok(TT.socket, ":"); temp; temp = strtok(NULL, ":")) { -      struct arg_list *ltemp = xzalloc(sizeof(struct arg_list));        if (strlen(temp) > 107) temp[108] = '\0';        tsd = xzalloc(sizeof(struct unsocks));        tsd->path = temp; -      ltemp->arg = (char*) tsd; -      ltemp->next = TT.lsocks; -      TT.lsocks = ltemp; +      tsd->next = TT.lsocks; +      TT.lsocks = tsd;      }    }    if (!open_unix_socks()) { @@ -612,9 +579,8 @@ init_jumpin:        }      }      if (retval > 0) { /* Some activity on listen sockets. */ -      node = TT.lsocks; -      while (node) { -        int sd = ((struct unsocks*) node->arg)->sd; +      for (tsd = TT.lsocks; tsd; tsd = tsd->next) { +        int sd = tsd->sd;          if (FD_ISSET(sd, &TT.rfds)) {            int len = read(sd, buffer, 1023); //buffer is of 1K, hence readingonly 1023 bytes, 1 for NUL            if (len > 0) { @@ -628,7 +594,6 @@ init_jumpin:            }            break;          } -        node = node->next;        }      }    } | 
