changeset 1026:09cc81f6e411

syslogd: stop abusing arg_list
author Felix Janda <felix.janda at posteo.de>
date Fri, 23 Aug 2013 22:50:29 +0200
parents f19286ac3e7f
children 4b0ad1c7af42
files toys/pending/syslogd.c
diffstat 1 files changed, 49 insertions(+), 84 deletions(-) [+]
line wrap: on
line diff
--- a/toys/pending/syslogd.c	Fri Aug 23 22:19:55 2013 +0200
+++ b/toys/pending/syslogd.c	Fri Aug 23 22:50:29 2013 +0200
@@ -37,6 +37,26 @@
 #include "toys.h"
 #include "toynet.h"
 
+// UNIX Sockets for listening
+struct unsocks {
+  struct unsocks *next;
+  char *path;
+  struct sockaddr_un sdu;
+  int sd;
+};
+
+// Log file entry to log into.
+struct logfile {
+  struct logfile *next;
+  char *filename;
+  char *config;
+  int isNetwork;
+  uint32_t facility[8];
+  uint8_t level[LOG_NFACILITIES];
+  int logfd;
+  struct sockaddr_in saddr;
+};
+
 GLOBALS(
   char *socket;
   char *config_file;
@@ -48,32 +68,13 @@
   char *remote_log;
   long log_prio;
 
-  struct arg_list *lsocks;  // list of listen sockets
-  struct arg_list *lfiles;  // list of write logfiles
+  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];
 )
 
-
-// UNIX Sockets for listening
-struct unsocks {
-  char *path;
-  struct sockaddr_un sdu;
-  int sd;
-};
-
-// Log file entry to log into.
-struct logfile {
-  char *filename;
-  char *config;
-  int isNetwork;
-  uint32_t facility[8];
-  uint8_t level[LOG_NFACILITIES];
-  int logfd;
-  struct sockaddr_in saddr;
-};
-
 // Lookup numerical code from name
 // Also used in logger
 int logger_lookup(int where, char *key)
@@ -97,18 +98,15 @@
 // 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 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 @@
   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 @@
   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 @@
    * 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 @@
       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 @@
         }
         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 @@
    * 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 @@
 // 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 @@
   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 @@
   }
   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 @@
         if (wlen < 0) perror_msg("write failed file : %s ", tf->filename + tf->isNetwork);
       }
     }
-    lnode = lnode->next;
   }
 }
 
@@ -476,22 +450,19 @@
  */
 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 @@
   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 @@
   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 @@
       }
     }
     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 @@
           }
           break;
         }
-        node = node->next;
       }
     }
   }