make service look in /etc/system.conf.d/<progname> first for config file.

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)
This commit is contained in:
Ben Gras 2010-08-31 14:33:31 +00:00
parent 1f2054c89c
commit b1847ae244
3 changed files with 32 additions and 5 deletions

View 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);

View 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

View 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