Commit 9ea87d5d by Serge Hallyn

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: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com>
parent f15b77ca
...@@ -2077,7 +2077,6 @@ struct lxc_conf *lxc_conf_init(void) ...@@ -2077,7 +2077,6 @@ struct lxc_conf *lxc_conf_init(void)
new->console.name[0] = '\0'; new->console.name[0] = '\0';
new->maincmd_fd = -1; new->maincmd_fd = -1;
new->rootfs.mount = default_rootfs_mount; new->rootfs.mount = default_rootfs_mount;
new->loglevel = LXC_LOG_PRIORITY_NOTSET;
lxc_list_init(&new->cgroup); lxc_list_init(&new->cgroup);
lxc_list_init(&new->network); lxc_list_init(&new->network);
lxc_list_init(&new->mount_list); lxc_list_init(&new->mount_list);
...@@ -2938,8 +2937,6 @@ void lxc_conf_free(struct lxc_conf *conf) ...@@ -2938,8 +2937,6 @@ void lxc_conf_free(struct lxc_conf *conf)
free(conf->ttydir); free(conf->ttydir);
if (conf->fstab) if (conf->fstab)
free(conf->fstab); free(conf->fstab);
if (conf->logfile)
free(conf->logfile);
lxc_clear_config_network(conf); lxc_clear_config_network(conf);
#if HAVE_APPARMOR #if HAVE_APPARMOR
if (conf->aa_profile) if (conf->aa_profile)
......
...@@ -246,8 +246,6 @@ struct lxc_conf { ...@@ -246,8 +246,6 @@ struct lxc_conf {
#if HAVE_APPARMOR #if HAVE_APPARMOR
char *aa_profile; char *aa_profile;
#endif #endif
char *logfile;
int loglevel;
#if HAVE_APPARMOR /* || HAVE_SELINUX || HAVE_SMACK */ #if HAVE_APPARMOR /* || HAVE_SELINUX || HAVE_SMACK */
int lsm_umount_proc; int lsm_umount_proc;
......
...@@ -922,46 +922,31 @@ static int config_aa_profile(const char *key, const char *value, ...@@ -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, static int config_logfile(const char *key, const char *value,
struct lxc_conf *lxc_conf) struct lxc_conf *lxc_conf)
{ {
char *path; if (lxc_log_get_file()) {
DEBUG("Log file already specified - ignoring new value");
// 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;
}
return 0; return 0;
} }
path = strdup(value); return lxc_log_set_file(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;
} }
static int config_loglevel(const char *key, const char *value, static int config_loglevel(const char *key, const char *value,
struct lxc_conf *lxc_conf) struct lxc_conf *lxc_conf)
{ {
int newlevel;
if (!value || strlen(value) == 0) if (!value || strlen(value) == 0)
return 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') if (value[0] >= '0' && value[0] <= '9')
lxc_conf->loglevel = atoi(value); newlevel = atoi(value);
else else
lxc_conf->loglevel = lxc_log_priority_to_int(value); newlevel = lxc_log_priority_to_int(value);
return lxc_log_set_level(lxc_conf->loglevel); return lxc_log_set_level(newlevel);
} }
static int config_autodev(const char *key, const char *value, 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, ...@@ -1612,9 +1597,9 @@ int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv,
v = c->aa_profile; v = c->aa_profile;
#endif #endif
else if (strcmp(key, "lxc.logfile") == 0) else if (strcmp(key, "lxc.logfile") == 0)
v = c->logfile; v = lxc_log_get_file();
else if (strcmp(key, "lxc.loglevel") == 0) 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 else if (strcmp(key, "lxc.cgroup") == 0) // all cgroup info
return lxc_get_cgroup_entry(c, retv, inlen, "all"); return lxc_get_cgroup_entry(c, retv, inlen, "all");
else if (strncmp(key, "lxc.cgroup.", 11) == 0) // specific cgroup info else if (strncmp(key, "lxc.cgroup.", 11) == 0) // specific cgroup info
...@@ -1694,10 +1679,10 @@ void write_config(FILE *fout, struct lxc_conf *c) ...@@ -1694,10 +1679,10 @@ void write_config(FILE *fout, struct lxc_conf *c)
if (c->aa_profile) if (c->aa_profile)
fprintf(fout, "lxc.aa_profile = %s\n", c->aa_profile); fprintf(fout, "lxc.aa_profile = %s\n", c->aa_profile);
#endif #endif
if (c->loglevel != LXC_LOG_PRIORITY_NOTSET) if (lxc_log_get_level() != LXC_LOG_PRIORITY_NOTSET)
fprintf(fout, "lxc.loglevel = %s\n", lxc_log_priority_to_string(c->loglevel)); fprintf(fout, "lxc.loglevel = %s\n", lxc_log_priority_to_string(lxc_log_get_level()));
if (c->logfile) if (lxc_log_get_file())
fprintf(fout, "lxc.logfile = %s\n", c->logfile); fprintf(fout, "lxc.logfile = %s\n", lxc_log_get_file());
lxc_list_for_each(it, &c->cgroup) { lxc_list_for_each(it, &c->cgroup) {
struct lxc_cgroup *cg = it->elem; struct lxc_cgroup *cg = it->elem;
fprintf(fout, "lxc.cgroup.%s = %s\n", cg->subsystem, cg->value); fprintf(fout, "lxc.cgroup.%s = %s\n", cg->subsystem, cg->value);
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
int lxc_log_fd = -1; int lxc_log_fd = -1;
static char log_prefix[LXC_LOG_PREFIX_SIZE] = "lxc"; 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); lxc_log_define(lxc_log, lxc);
...@@ -176,17 +176,8 @@ extern int lxc_log_init(const char *file, const char *priority, ...@@ -176,17 +176,8 @@ extern int lxc_log_init(const char *file, const char *priority,
if (prefix) if (prefix)
lxc_log_setprefix(prefix); lxc_log_setprefix(prefix);
if (file) { if (file)
int fd; return lxc_log_set_file(file);
fd = log_open(file);
if (fd == -1) {
ERROR("failed to initialize log service");
return -1;
}
lxc_log_fd = fd;
}
return 0; return 0;
} }
...@@ -208,21 +199,39 @@ extern int lxc_log_set_level(int level) ...@@ -208,21 +199,39 @@ extern int lxc_log_set_level(int level)
return 0; 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 * 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 * happens after processing command line arguments, which override the .conf
* settings. So only set the logfile if previously unset. * 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) { if (lxc_log_fd != -1) {
INFO("Configuration file was specified on command line, configuration file entry being ignored"); // this should've been caught at config_logfile.
return 0; ERROR("Race in setting logfile?");
return -1;
} }
lxc_log_fd = log_open(fname); lxc_log_fd = log_open(fname);
if (lxc_log_fd == -1) { if (lxc_log_fd == -1) {
ERROR("failed to open log file %s\n", fname); ERROR("failed to open log file %s\n", fname);
return -1; return -1;
} }
log_fname = strdup(fname);
return 0; 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;
}
...@@ -292,5 +292,7 @@ extern int lxc_log_init(const char *file, const char *priority, ...@@ -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 void lxc_log_setprefix(const char *a_prefix);
extern int lxc_log_set_level(int level); 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 #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment