Commit 9ec01ff3 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

log: don't create a log file in a current directory

We can set a directory for log and image files.
crtools sets it as a current directory and then creates all files in it.
It works before we don't decide to change a mount name space.

I suggest to open a log dir and create files for help openat.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 855c20ac
...@@ -311,6 +311,8 @@ static int restore_one_alive_task(int pid, CoreEntry *core) ...@@ -311,6 +311,8 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_sigactions(pid)) if (prepare_sigactions(pid))
return -1; return -1;
log_closedir();
return prepare_and_sigreturn(pid, core); return prepare_and_sigreturn(pid, core);
} }
......
...@@ -99,6 +99,7 @@ extern struct cr_options opts; ...@@ -99,6 +99,7 @@ extern struct cr_options opts;
enum { enum {
LOG_FD_OFF = 1, LOG_FD_OFF = 1,
LOG_DIR_FD_OFF,
IMG_FD_OFF, IMG_FD_OFF,
SELF_EXE_FD_OFF, SELF_EXE_FD_OFF,
PROC_FD_OFF, PROC_FD_OFF,
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
extern int log_init(const char *output); extern int log_init(const char *output);
extern void log_fini(void); extern void log_fini(void);
extern int log_init_by_pid(void); extern int log_init_by_pid(void);
extern void log_closedir(void);
extern int log_get_fd(void); extern int log_get_fd(void);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
static unsigned int current_loglevel = DEFAULT_LOGLEVEL; static unsigned int current_loglevel = DEFAULT_LOGLEVEL;
static int current_logfd = DEFAULT_LOGFD; static int current_logfd = DEFAULT_LOGFD;
static int logdir = -1;
static char buffer[PAGE_SIZE]; static char buffer[PAGE_SIZE];
static char buf_off = 0; static char buf_off = 0;
...@@ -33,7 +34,27 @@ int log_get_fd(void) ...@@ -33,7 +34,27 @@ int log_get_fd(void)
int log_init(const char *output) int log_init(const char *output)
{ {
int new_logfd, sfd; int new_logfd, sfd, dfd;
dfd = get_service_fd(LOG_DIR_FD_OFF);
if (dfd < 0) {
pr_msg("Can't obtain logfd");
goto err;
}
if (logdir < 0) {
int tmp;
tmp = open(".", O_RDONLY);
if (tmp == -1) {
pr_perror("Can't open a current directory");
return -1;
}
if (reopen_fd_as(dfd, tmp) < 0)
return -1;
logdir = dfd;
}
sfd = get_service_fd(LOG_FD_OFF); sfd = get_service_fd(LOG_FD_OFF);
if (sfd < 0) { if (sfd < 0) {
...@@ -42,7 +63,8 @@ int log_init(const char *output) ...@@ -42,7 +63,8 @@ int log_init(const char *output)
} }
if (output) { if (output) {
new_logfd = open(output, O_CREAT | O_TRUNC | O_WRONLY | O_APPEND, 0600); new_logfd = openat(logdir, output,
O_CREAT | O_TRUNC | O_WRONLY | O_APPEND, 0600);
if (new_logfd < 0) { if (new_logfd < 0) {
pr_perror("Can't create log file %s", output); pr_perror("Can't create log file %s", output);
return -1; return -1;
...@@ -95,6 +117,11 @@ void log_fini(void) ...@@ -95,6 +117,11 @@ void log_fini(void)
current_logfd = DEFAULT_LOGFD; current_logfd = DEFAULT_LOGFD;
} }
void log_closedir(void)
{
close_safe(&logdir);
}
void log_set_loglevel(unsigned int level) void log_set_loglevel(unsigned int level)
{ {
if (!level) if (!level)
......
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