OSDN Git Service

Work around a musl-libc bug that has facilitynames/prioritynames in headers
authorRob Landley <rob@landley.net>
Mon, 19 Feb 2018 01:35:10 +0000 (19:35 -0600)
committerRob Landley <rob@landley.net>
Mon, 19 Feb 2018 01:35:10 +0000 (19:35 -0600)
but then the link fails.

toys/posix/logger.c

index 16262c9..b06699e 100644 (file)
@@ -29,29 +29,54 @@ GLOBALS(
   char *ident;
 )
 
+// find str in names[], accepting unambiguous short matches
+// returns offset into array of match, or -1 if no match
+int arrayfind(char *str, char *names[], int len)
+{
+  int try, i, matchlen = 0, found = -1, ambiguous = 1;
+
+  for (try = 0; try<len; try++) {
+    for (i=0; ; i++) {
+      if (!str[i]) {
+        if (matchlen<i) found = try, ambiguous = 0;
+        if (matchlen==i) ambiguous++;
+        if (!names[try][i]) return try;
+        break;
+      }
+      if (!names[try][i]) break;
+      if (toupper(str[i]) != toupper(names[try][i])) break;
+    }
+  }
+  return ambiguous ? -1 : found;
+}
+
 void logger_main(void)
 {
   int facility = LOG_USER, priority = LOG_NOTICE, len;
-  char *s1, *s2, **arg;
-  CODE *code;
+  char *s1, *s2, **arg,
+    *priorities[] = {"emerg", "alert", "crit", "error", "warning", "notice",
+                     "info", "debug"},
+    *facilities[] = {"kern", "user", "mail", "daemon", "auth", "syslog",
+                     "lpr", "news", "uucp", "cron", "authpriv", "ftp"};
 
   if (!TT.ident) TT.ident = xstrdup(xgetpwuid(geteuid())->pw_name);
   if (toys.optflags & FLAG_p) {
     if (!(s1 = strchr(TT.priority, '.'))) s1 = TT.priority;
     else {
-      *s1++ = 0;
-      for (code = facilitynames; code->c_name; code++)
-        if (!strcasecmp(TT.priority, code->c_name)) break;
-      if (!code->c_name) error_exit("bad facility: %s", TT.priority);
-      facility = code->c_val;
+      *s1++ = len = 0;
+      facility = arrayfind(TT.priority, facilities, ARRAY_LEN(facilities));
+      if (facility == -1 && strncasecmp(TT.priority, "local", 5)) {
+        facility = s1[5]-'0';
+        if (facility>7 || s1[6]) facility = -1;
+        if (facility>=0) facility += 16;
+      }
+      if (facility<0) error_exit("bad facility: %s", TT.priority);
     }
 
-    for (code = prioritynames; code->c_name; code++)
-      if (!strcasecmp(s1, code->c_name)) break;
-    if (!code->c_name) error_exit("bad priority: %s", s1);
+    priority = arrayfind(s1, priorities, ARRAY_LEN(priorities));
+    if (priority<0) error_exit("bad priority: %s", s1);
   }
 
-
   if (toys.optc) {
     for (len = 0, arg = toys.optargs; *arg; arg++) len += strlen(*arg)+1;
     s1 = s2 = xmalloc(len);