]> Zhao Yanbai Git Server - minix.git/commitdiff
make service look in /etc/system.conf.d/<progname> first for config file.
authorBen Gras <ben@minix3.org>
Tue, 31 Aug 2010 14:33:31 +0000 (14:33 +0000)
committerBen Gras <ben@minix3.org>
Tue, 31 Aug 2010 14:33:31 +0000 (14:33 +0000)
This makes it easier to
  - have non-base system drivers (get clobbered by global system.conf)
  - have drivers as packages (can't touch global system.conf)
  - make configs part of the drivers/servers instead of in global file
    (makes system parts more self-contained)

commands/service/service.c
etc/mtree/minix.tree
include/minix/paths.h

index 5e025c3ddead9abbef2752f6789c741f6b49ef93..7b44d7342f324aa462a864a390218790202e2d15 100644 (file)
@@ -116,6 +116,7 @@ PRIVATE long req_period = 0;
 PRIVATE char *req_script = NULL;
 PRIVATE char *req_ipc = NULL;
 PRIVATE char *req_config = PATH_CONFIG;
+PRIVATE int custom_config_file = 0;
 PRIVATE int class_recurs;      /* Nesting level of class statements */
 PRIVATE int req_lu_state = DEFAULT_LU_STATE;
 PRIVATE int req_lu_maxtime = DEFAULT_LU_MAXTIME;
@@ -339,6 +340,7 @@ PRIVATE int parse_arguments(int argc, char **argv)
           }
           else if (strcmp(argv[i], ARG_CONFIG)==0) {
               req_config = argv[i+1];
+             custom_config_file = 1;
           }
           else if (strcmp(argv[i], ARG_LU_STATE)==0) {
               errno=0;
@@ -1343,16 +1345,15 @@ PRIVATE void do_service(config_t *cpe, config_t *config)
        }
 }
 
-PRIVATE void do_config(char *label, char *filename)
+PRIVATE int do_config(char *label, char *filename)
 {
        config_t *config, *cp, *cpe;
 
        config= config_read(filename, 0, NULL);
        if (config == NULL)
        {
-               fprintf(stderr, "config_read failed for '%s': %s\n",
-                       filename, strerror(errno));
-               exit(1);
+               /* config file read failed. */
+               return 1;
        }
 
        /* Find an entry for our service */
@@ -1396,6 +1397,9 @@ PRIVATE void do_config(char *label, char *filename)
        cpe= cpe->next;
 
        do_service(cpe, config);
+
+       /* config file read ok. */
+       return 0;
 }
 
 /* Main program. 
@@ -1464,8 +1468,29 @@ PUBLIC int main(int argc, char **argv)
       rs_start.rss_cpu = DSRV_CPU;
 
       if (req_config) {
+       int config_fail = 0;
        assert(progname);
-       do_config(progname, req_config);
+       if(custom_config_file) {
+         config_fail = do_config(progname, req_config);
+       } else {
+         char *specificconfig;
+         if(asprintf(&specificconfig, "%s/%s", _PATH_SYSTEM_CONF_DIR,
+               progname) < 0) {
+               errx(1, "no memory");
+         }
+
+         /* Try specific config filename first, 
+          * and only if it fails, the global system one.
+          */
+         config_fail =
+               do_config(progname, specificconfig) &&
+               do_config(progname, req_config);
+       }
+
+        if(config_fail) {
+                 fprintf(stderr, "config_read failed for %s\n", progname);
+                 exit(1);
+        }
       }
 
       assert(rs_start.rss_priority < NR_SCHED_QUEUES);
index 25fdb078efd13c555101e558c444ff3e69125d1f..8cbec6517370ce902bd2a331c360cd2a1cea70c0 100644 (file)
@@ -4,6 +4,7 @@
 755 root    operator /dev
 /dev/mouse -> /dev/kbdaux
 755 root    operator /etc
+755 root    operator /etc/system.conf.d
 755 root    operator /boot
 755 root    operator /boot/image
 555 root    operator /mnt
index e20e5e9de6d1bc8113924b9e0f0c3d56924f62f4..9eeb297991f043e9029fb586f683d7074df3027f 100644 (file)
@@ -21,5 +21,6 @@
 #define _PATH_BSHELL   "/bin/sh"
 #define _PATH_SERVICE  "/bin/service"
 #define _PATH_SYSTEM_CONF      "/etc/system.conf"
+#define _PATH_SYSTEM_CONF_DIR  "/etc/system.conf.d"
 
 #endif