changeset 1024:63b8e54d2c6f

syslogd: cleanup - remove flag macros - remove some unecessary gotos - inline open_udp_socks() and getport() - simplify resulting open_logfiles() Now in the syslog.conf the port numbers for remote hosts are no longer allowed to be hexadecimal. If there is need for hexadecimal port numbers, one can as well accept octal ones and use base 0 in strtoul.
author Felix Janda <felix.janda@posteo.de>
date Wed, 21 Aug 2013 21:24:45 +0200
parents 97383e221a4a
children f19286ac3e7f
files toys/pending/syslogd.c
diffstat 1 files changed, 70 insertions(+), 96 deletions(-) [+]
line wrap: on
line diff
--- a/toys/pending/syslogd.c	Wed Aug 21 05:38:53 2013 -0500
+++ b/toys/pending/syslogd.c	Wed Aug 21 21:24:45 2013 +0200
@@ -55,9 +55,6 @@
   int sigfd[2];
 )
 
-#define flag_get(f,v,d)  ((toys.optflags & f) ? v : d)
-#define flag_chk(f)    ((toys.optflags & f) ? 1 : 0)
-
 
 // UNIX Sockets for listening
 struct unsocks {
@@ -70,7 +67,7 @@
 struct logfile {
   char *filename;
   char *config;
-  uint8_t isNetwork;
+  int isNetwork;
   uint32_t facility[8];
   uint8_t level[LOG_NFACILITIES];
   int logfd;
@@ -129,28 +126,6 @@
   return ret;
 }
 
-/*
- * creates a socket of family INET and protocol UDP
- * if successful then returns SOCK othrwise error
- */
-static int open_udp_socks(char *host, int port, struct sockaddr_in *sadd)
-{
-  struct addrinfo *info, rp;
-
-  memset(&rp, 0, sizeof(rp));
-  rp.ai_family = AF_INET;
-  rp.ai_socktype = SOCK_DGRAM;
-  rp.ai_protocol = IPPROTO_UDP;
-
-  if (getaddrinfo(host, NULL, &rp, &info) || !info) 
-    perror_exit("BAD ADDRESS: can't find : %s ", host);
-  ((struct sockaddr_in*)info->ai_addr)->sin_port = htons(port);
-  memcpy(sadd, info->ai_addr, info->ai_addrlen);
-  freeaddrinfo(info);
-
-  return xsocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-}
-
 // Returns node having filename
 static struct arg_list *get_file_node(char *filename, struct arg_list *list)
 {
@@ -261,7 +236,7 @@
    * all other log files are neglected
    * thus no need to open config either.
    */
-  if (flag_chk(FLAG_K)) {
+  if (toys.optflags & FLAG_K) {
     node = xzalloc(sizeof(struct arg_list));
     file = xzalloc(sizeof(struct logfile));
     file->filename = "/dev/kmsg";
@@ -278,7 +253,7 @@
    * files are neglected thus no need to
    * open config either so just return.
    */
-   if (flag_chk(FLAG_R)) {
+   if (toys.optflags & FLAG_R) {
      node = xzalloc(sizeof(struct arg_list));
      file = xzalloc(sizeof(struct logfile));
      file->filename = xmsprintf("@%s",TT.remote_log);
@@ -288,14 +263,14 @@
      memset(file->facility, 0xFFFFFFFF, sizeof(file->facility));
      node->arg = (char*) file;
      TT.lfiles = node;
-     if (!flag_chk(FLAG_L))return 0;
+     if (!(toys.optflags & FLAG_L))return 0;
    }
   /*
    * Read config file and add logfiles to the list
    * with their configuration.
    */
   fp = fopen(TT.config_file, "r");
-  if (!fp && flag_chk(FLAG_f))
+  if (!fp && (toys.optflags & FLAG_f))
     perror_exit("can't open '%s'", TT.config_file);
 
   for (len = 0, linelen = 0; fp;) {
@@ -323,29 +298,28 @@
       error_msg("bad line %d: 1 tokens found, 2 needed", lineno);
       return -1;
     }
-    if (*tokens[1] == '*') goto loop_again;
-
-    node = get_file_node(tokens[1], TT.lfiles);
-    if (!node) {
-      node = xzalloc(sizeof(struct arg_list));
-      file = xzalloc(sizeof(struct logfile));
-      file->config = xstrdup(tokens[0]);
-      if (resolve_config(file)==-1) {
-        error_msg("error in '%s' at line %d", TT.config_file, lineno);
-        return -1;
+    if (*tokens[1] != '*') {
+      node = get_file_node(tokens[1], TT.lfiles);
+      if (!node) {
+        node = xzalloc(sizeof(struct arg_list));
+        file = xzalloc(sizeof(struct logfile));
+        file->config = xstrdup(tokens[0]);
+        if (resolve_config(file)==-1) {
+          error_msg("error in '%s' at line %d", TT.config_file, lineno);
+          return -1;
+        }
+        file->filename = xstrdup(tokens[1]);
+        if (*file->filename == '@') file->isNetwork = 1;
+        node->arg = (char*) file;
+        node->next = TT.lfiles;
+        TT.lfiles = node;
+      } 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]);
       }
-      file->filename = xstrdup(tokens[1]);
-      if (*file->filename == '@') file->isNetwork = 1;
-      node->arg = (char*) file;
-      node->next = TT.lfiles;
-      TT.lfiles = node;
-    } 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]);
     }
-loop_again:
     if (tokens[0]) free(tokens[0]);
     if (tokens[1]) free(tokens[1]);
     free(confline);
@@ -358,7 +332,8 @@
   if (!fp){
     node = xzalloc(sizeof(struct arg_list));
     file = xzalloc(sizeof(struct logfile));
-    file->filename = flag_get(FLAG_O, TT.logfile, "/var/log/messages"); //DEFLOGFILE
+    file->filename = (toys.optflags & FLAG_O) ?
+                     TT.logfile : "/var/log/messages"; //DEFLOGFILE
     file->isNetwork = 0;
     file->config = "*.*";
     memset(file->level, 0xFF, sizeof(file->level));
@@ -374,45 +349,46 @@
   return 0;
 }
 
-static int getport(char *str, char *filename)
-{
-  char *endptr = NULL;
-  int base = 10;
-  errno = 0;
-  if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
-    base = 16;
-    str += 2;
-  }
-  long port = strtol(str, &endptr, base);
-  if (errno || *endptr!='\0'|| endptr == str 
-    || port < 0 || port > 65535) error_exit("wrong port no in %s", filename);
-  return (int)port;
-}
-
 // open every log file in list.
 static void open_logfiles(void)
 {
-  struct logfile *tfd;
-  char *p, *tmpfile;
-  int port = -1;
-  struct arg_list *node = TT.lfiles;
+  struct arg_list *node;
 
-  while (node) {
-    tfd = (struct logfile*) node->arg;
+  for (node = TT.lfiles; node; node = node->next) {
+    struct logfile *tfd = (struct logfile*) node->arg;
+    char *p, *tmpfile;
+    long port = 514;
+
     if (tfd->isNetwork) {
-      tmpfile = xstrdup(tfd->filename +1);
+      struct addrinfo *info, rp;
+
+      tmpfile = xstrdup(tfd->filename + 1);
       if ((p = strchr(tmpfile, ':'))) {
+        char *endptr;
+
         *p = '\0';
-        port = getport(p + 1, tfd->filename);
+        port = strtol(++p, &endptr, 10);
+        if (*endptr || endptr == p || port < 0 || port > 65535)
+          error_exit("bad port in %s", tfd->filename);
       }
-      tfd->logfd = open_udp_socks(tmpfile, (port>=0)?port:514, &tfd->saddr);
+      memset(&rp, 0, sizeof(rp));
+      rp.ai_family = AF_INET;
+      rp.ai_socktype = SOCK_DGRAM;
+      rp.ai_protocol = IPPROTO_UDP;
+
+      if (getaddrinfo(tmpfile, NULL, &rp, &info) || !info) 
+        perror_exit("BAD ADDRESS: can't find : %s ", tmpfile);
+      ((struct sockaddr_in*)info->ai_addr)->sin_port = htons(port);
+      memcpy(&tfd->saddr, info->ai_addr, info->ai_addrlen);
+      freeaddrinfo(info);
+
+      tfd->logfd = xsocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
       free(tmpfile);
     } else tfd->logfd = open(tfd->filename, O_CREAT | O_WRONLY | O_APPEND, 0666);
     if (tfd->logfd < 0) {
       tfd->filename = "/dev/console";
       tfd->logfd = open(tfd->filename, O_APPEND);
     }
-    node = node->next;
   }
 }
 
@@ -424,7 +400,7 @@
   isreg = (!fstat(tf->logfd, &statf) && S_ISREG(statf.st_mode));
   size = statf.st_size;
 
-  if (flag_chk(FLAG_s) || flag_chk(FLAG_b)) {
+  if ((toys.optflags & FLAG_s) || (toys.optflags & FLAG_b)) {
     if (TT.rot_size && isreg && (size + len) > (TT.rot_size*1024)) {
       if (TT.rot_count) { /* always 0..99 */
         int i = strlen(tf->filename) + 3 + 1;
@@ -513,18 +489,15 @@
   fac = LOG_FAC(pri);
   lvl = LOG_PRI(pri);
 
-  if (flag_chk(FLAG_K)) {
-    len = sprintf(toybuf, "<%d> %s\n", pri, msg);
-    goto do_log;
+  if (toys.optflags & FLAG_K) len = sprintf(toybuf, "<%d> %s\n", pri, msg);
+  else {
+    priority_to_string(pri, &facstr, &lvlstr);
+
+    p = "local";
+    if (!uname(&uts)) p = uts.nodename;
+    if (toys.optflags & FLAG_S) len = sprintf(toybuf, "%s %s\n", ts, msg);
+    else len = sprintf(toybuf, "%s %s %s.%s %s\n", ts, p, facstr, lvlstr, msg);
   }
-  priority_to_string(pri, &facstr, &lvlstr);
-
-  p = "local";
-  if (!uname(&uts)) p = uts.nodename;
-  if (flag_chk(FLAG_S)) len = sprintf(toybuf, "%s %s\n", ts, msg);
-  else len = sprintf(toybuf, "%s %s %s.%s %s\n", ts, p, facstr, lvlstr, msg);
-
-do_log:
   if (lvl >= TT.log_prio) return;
 
   while (lnode) {
@@ -535,7 +508,7 @@
         if (tf->isNetwork)
           wlen = sendto(tf->logfd, omsg, olen, 0, (struct sockaddr*)&tf->saddr, sizeof(tf->saddr));
         else wlen = write_rotate(tf, len);
-        if (wlen < 0) perror_msg("write failed file : %s ", (tf->isNetwork)?(tf->filename+1):tf->filename);
+        if (wlen < 0) perror_msg("write failed file : %s ", tf->filename + tf->isNetwork);
       }
     }
     lnode = lnode->next;
@@ -583,18 +556,19 @@
   struct arg_list *node;
   char *temp, *buffer = (toybuf +2048), *last_buf = (toybuf + 3072); //these two buffs are of 1K each
 
-  if (flag_chk(FLAG_p) && strlen(TT.unix_socket) > 108)
+  if ((toys.optflags & FLAG_p) && (strlen(TT.unix_socket) > 108))
     error_exit("Socket path should not be more than 108");
 
-  TT.config_file = flag_get(FLAG_f, TT.config_file, "/etc/syslog.conf"); //DEFCONFFILE
+  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 = flag_get(FLAG_p, TT.unix_socket , "/dev/log"); // DEFLOGSOCK
+  tsd->path = (toys.optflags & FLAG_p) ? TT.unix_socket : "/dev/log"; // DEFLOGSOCK
   TT.lsocks->arg = (char*) tsd;
 
-  if (flag_chk(FLAG_a)) {
+  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';
@@ -624,7 +598,7 @@
 
   if (parse_config_file() == -1) goto clean_and_exit;
   open_logfiles();
-  if (!flag_chk(FLAG_n)) {
+  if (!(toys.optflags & FLAG_n)) {
     //don't daemonize again if SIGHUP received.
     toys.optflags |= FLAG_n;
   }
@@ -690,7 +664,7 @@
           int len = read(sd, buffer, 1023); //buffer is of 1K, hence readingonly 1023 bytes, 1 for NUL
           if (len > 0) {
             buffer[len] = '\0';
-            if(flag_chk(FLAG_D) && (len == last_len))
+            if((toys.optflags & FLAG_D) && (len == last_len))
               if (!memcmp(last_buf, buffer, len)) break;
 
             memcpy(last_buf, buffer, len);