From: Christian Brauner Date: Wed, 15 Nov 2017 12:29:49 +0000 (+0100) Subject: commands: rotate console log file X-Git-Tag: lxc-3.0.0.beta1~182^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=966b9ecd95f5b6249ece8fdaae1610d10d17eec7;p=thirdparty%2Flxc.git commands: rotate console log file Signed-off-by: Christian Brauner --- diff --git a/src/lxc/commands.c b/src/lxc/commands.c index 133b6e6c1..f0f3c076a 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -1064,6 +1064,10 @@ static int lxc_cmd_console_log_callback(int fd, struct lxc_cmd_req *req, rsp.ret = 0; if (log->clear) { + int ret; + size_t len; + char *tmp; + /* clear the ringbuffer */ lxc_ringbuf_clear(buf); @@ -1086,6 +1090,31 @@ static int lxc_cmd_console_log_callback(int fd, struct lxc_cmd_req *req, goto out; } } + + /* rotate the console log file */ + if (!console->log_path || console->log_rotate == 0) + goto out; + + /* be very certain things are kosher */ + rsp.ret = -EBADF; + if (console->log_fd < 0) + goto out; + + len = strlen(console->log_path) + sizeof(".1"); + tmp = alloca(len); + + rsp.ret = -EFBIG; + ret = snprintf(tmp, len, "%s.1", console->log_path); + if (ret < 0 || (size_t)ret >= len) + goto out; + + close(console->log_fd); + console->log_fd = -1; + rsp.ret = lxc_unpriv(rename(console->log_path, tmp)); + if (rsp.ret < 0) + goto out; + + rsp.ret = lxc_console_create_log_file(console); } else if (rsp.datalen > 0) { lxc_ringbuf_move_read_addr(buf, rsp.datalen); } diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 24e74adff..bff51f6d7 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -1803,8 +1803,11 @@ static int set_config_console_rotate(const char *key, const char *value, if (lxc_safe_uint(value, &lxc_conf->console.log_rotate) < 0) return -1; - if (lxc_conf->console.log_rotate > 1) + if (lxc_conf->console.log_rotate > 1) { + ERROR("The \"lxc.console.rotate\" config key can only be set " + "to 0 or 1"); return -1; + } return 0; } diff --git a/src/lxc/console.c b/src/lxc/console.c index 14fe40240..c8775de6c 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -674,7 +674,7 @@ static int lxc_console_create_ringbuf(struct lxc_console *console) * This is the console log file. Please note that the console log file is * (implementation wise not content wise) independent of the console ringbuffer. */ -static int lxc_console_create_log_file(struct lxc_console *console) +int lxc_console_create_log_file(struct lxc_console *console) { if (!console->log_path) return 0; diff --git a/src/lxc/console.h b/src/lxc/console.h index 389914ab5..60b299631 100644 --- a/src/lxc/console.h +++ b/src/lxc/console.h @@ -222,5 +222,6 @@ extern int lxc_console_cb_signal_fd(int fd, uint32_t events, void *cbdata, extern void lxc_console_signal_fini(struct lxc_tty_state *ts); extern int lxc_console_write_ringbuffer(struct lxc_console *console); +extern int lxc_console_create_log_file(struct lxc_console *console); #endif