From: Serge Hallyn Date: Fri, 11 Jan 2013 18:39:31 +0000 (-0600) Subject: remove logfile and loglevel from struct lxc_conf X-Git-Tag: lxc-0.9.0.alpha3~1^2~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ea87d5dedf7b56eb7eeb20b0da2252d9a1087b1;p=thirdparty%2Flxc.git remove logfile and loglevel from struct lxc_conf The options are still supported in the lxc configuration file. However they are stored only in local variables in src/lxc/log.c, which can be read using two new functions: int lxc_log_get_level(void); const char *lxc_log_get_file(void); Changelog: jan 14: have lxc_log_init use lxc_log_set_file(), have lxc_log_set_file() take a const char *, and have it keep its own strdup'd copy of the filename. Signed-off-by: Serge Hallyn --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index e5e522c67..ea0fcf6fc 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2077,7 +2077,6 @@ struct lxc_conf *lxc_conf_init(void) new->console.name[0] = '\0'; new->maincmd_fd = -1; new->rootfs.mount = default_rootfs_mount; - new->loglevel = LXC_LOG_PRIORITY_NOTSET; lxc_list_init(&new->cgroup); lxc_list_init(&new->network); lxc_list_init(&new->mount_list); @@ -2938,8 +2937,6 @@ void lxc_conf_free(struct lxc_conf *conf) free(conf->ttydir); if (conf->fstab) free(conf->fstab); - if (conf->logfile) - free(conf->logfile); lxc_clear_config_network(conf); #if HAVE_APPARMOR if (conf->aa_profile) diff --git a/src/lxc/conf.h b/src/lxc/conf.h index 1f9b86173..83de84aab 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -246,8 +246,6 @@ struct lxc_conf { #if HAVE_APPARMOR char *aa_profile; #endif - char *logfile; - int loglevel; #if HAVE_APPARMOR /* || HAVE_SELINUX || HAVE_SMACK */ int lsm_umount_proc; diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 6b75b6a77..7372a347b 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -922,46 +922,31 @@ static int config_aa_profile(const char *key, const char *value, static int config_logfile(const char *key, const char *value, struct lxc_conf *lxc_conf) { - char *path; - - // if given a blank entry, null out any previous entries. - if (!value || strlen(value) == 0) { - if (lxc_conf->logfile) { - free(lxc_conf->logfile); - lxc_conf->logfile = NULL; - } + if (lxc_log_get_file()) { + DEBUG("Log file already specified - ignoring new value"); return 0; } - path = strdup(value); - if (!path) { - SYSERROR("failed to strdup '%s': %m", value); - return -1; - } - - if (lxc_log_set_file(path)) { - free(path); - return -1; - } - - if (lxc_conf->logfile) - free(lxc_conf->logfile); - lxc_conf->logfile = path; - - return 0; + return lxc_log_set_file(value); } static int config_loglevel(const char *key, const char *value, struct lxc_conf *lxc_conf) { + int newlevel; + if (!value || strlen(value) == 0) return 0; + if (lxc_log_get_level() != LXC_LOG_PRIORITY_NOTSET) { + DEBUG("Log level already set - ignoring new value"); + return 0; + } if (value[0] >= '0' && value[0] <= '9') - lxc_conf->loglevel = atoi(value); + newlevel = atoi(value); else - lxc_conf->loglevel = lxc_log_priority_to_int(value); - return lxc_log_set_level(lxc_conf->loglevel); + newlevel = lxc_log_priority_to_int(value); + return lxc_log_set_level(newlevel); } static int config_autodev(const char *key, const char *value, @@ -1612,9 +1597,9 @@ int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv, v = c->aa_profile; #endif else if (strcmp(key, "lxc.logfile") == 0) - v = c->logfile; + v = lxc_log_get_file(); else if (strcmp(key, "lxc.loglevel") == 0) - v = lxc_log_priority_to_string(c->loglevel); + v = lxc_log_priority_to_string(lxc_log_get_level()); else if (strcmp(key, "lxc.cgroup") == 0) // all cgroup info return lxc_get_cgroup_entry(c, retv, inlen, "all"); else if (strncmp(key, "lxc.cgroup.", 11) == 0) // specific cgroup info @@ -1694,10 +1679,10 @@ void write_config(FILE *fout, struct lxc_conf *c) if (c->aa_profile) fprintf(fout, "lxc.aa_profile = %s\n", c->aa_profile); #endif - if (c->loglevel != LXC_LOG_PRIORITY_NOTSET) - fprintf(fout, "lxc.loglevel = %s\n", lxc_log_priority_to_string(c->loglevel)); - if (c->logfile) - fprintf(fout, "lxc.logfile = %s\n", c->logfile); + if (lxc_log_get_level() != LXC_LOG_PRIORITY_NOTSET) + fprintf(fout, "lxc.loglevel = %s\n", lxc_log_priority_to_string(lxc_log_get_level())); + if (lxc_log_get_file()) + fprintf(fout, "lxc.logfile = %s\n", lxc_log_get_file()); lxc_list_for_each(it, &c->cgroup) { struct lxc_cgroup *cg = it->elem; fprintf(fout, "lxc.cgroup.%s = %s\n", cg->subsystem, cg->value); diff --git a/src/lxc/log.c b/src/lxc/log.c index 0354d8dfc..d2a90de7a 100644 --- a/src/lxc/log.c +++ b/src/lxc/log.c @@ -41,7 +41,7 @@ int lxc_log_fd = -1; static char log_prefix[LXC_LOG_PREFIX_SIZE] = "lxc"; -int lxc_loglevel_specified = 0; +static int lxc_loglevel_specified = 0; lxc_log_define(lxc_log, lxc); @@ -176,17 +176,8 @@ extern int lxc_log_init(const char *file, const char *priority, if (prefix) lxc_log_setprefix(prefix); - if (file) { - int fd; - - fd = log_open(file); - if (fd == -1) { - ERROR("failed to initialize log service"); - return -1; - } - - lxc_log_fd = fd; - } + if (file) + return lxc_log_set_file(file); return 0; } @@ -208,21 +199,39 @@ extern int lxc_log_set_level(int level) return 0; } +char *log_fname; // default to NULL, set in lxc_log_set_file. + /* * This is called when we read a lxc.logfile entry in a lxc.conf file. This * happens after processing command line arguments, which override the .conf * settings. So only set the logfile if previously unset. */ -extern int lxc_log_set_file(char *fname) +extern int lxc_log_set_file(const char *fname) { if (lxc_log_fd != -1) { - INFO("Configuration file was specified on command line, configuration file entry being ignored"); - return 0; + // this should've been caught at config_logfile. + ERROR("Race in setting logfile?"); + return -1; } + lxc_log_fd = log_open(fname); if (lxc_log_fd == -1) { ERROR("failed to open log file %s\n", fname); return -1; } + + log_fname = strdup(fname); return 0; } + +extern int lxc_log_get_level(void) +{ + if (!lxc_loglevel_specified) + return LXC_LOG_PRIORITY_NOTSET; + return lxc_log_category_lxc.priority; +} + +extern const char *lxc_log_get_file(void) +{ + return log_fname; +} diff --git a/src/lxc/log.h b/src/lxc/log.h index 340a3abd5..a9260f22a 100644 --- a/src/lxc/log.h +++ b/src/lxc/log.h @@ -292,5 +292,7 @@ extern int lxc_log_init(const char *file, const char *priority, extern void lxc_log_setprefix(const char *a_prefix); extern int lxc_log_set_level(int level); -extern int lxc_log_set_file(char *fname); +extern int lxc_log_set_file(const char *fname); +extern int lxc_log_get_level(void); +extern const char *lxc_log_get_file(void); #endif