Skip to content

Commit

Permalink
fix logic for execute log file
Browse files Browse the repository at this point in the history
The problem here is that lxc-init runs *inside* the container. So if a
person has the log file set to /home/$USER/foo, lxc-init ends up making a
directory /home/$USER/foo inside the container to put the log file in. What
we really want are the logs to be propagated from inside the container to
the outside. We accomplish this by passing an fd without O_CLOEXEC, and
telling lxc-init to log to that file.

Signed-off-by: Tycho Andersen <tycho@tycho.ws>
  • Loading branch information
tych0 committed May 3, 2018
1 parent cef701e commit cd90db2
Showing 1 changed file with 25 additions and 4 deletions.
29 changes: 25 additions & 4 deletions src/lxc/execute.c
Expand Up @@ -21,11 +21,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#include "conf.h"
#include "log.h"
Expand All @@ -36,9 +38,9 @@ lxc_log_define(lxc_execute, lxc_start);

static int execute_start(struct lxc_handler *handler, void* data)
{
int j, i = 0;
int j, i = 0, log = -1;
struct execute_args *my_args = data;
char **argv;
char **argv, *logfd;
int argc = 0, argc_add;

while (my_args->argv[argc++]);
Expand Down Expand Up @@ -69,9 +71,25 @@ static int execute_start(struct lxc_handler *handler, void* data)
argv[i++] = (char *)lxc_log_priority_to_string(lxc_log_get_level());
}

if (handler->conf->logfile) {
if (current_config->logfd != -1 || lxc_log_fd != -1) {
int to_dup = current_config->logfd;

if (current_config->logfd == -1)
to_dup = lxc_log_fd;

log = dup(to_dup);
if (log < 0) {
SYSERROR("dup of log fd failed");
goto out2;
}

if (asprintf(&logfd, "/proc/1/fd/%d", log) < 0) {
ERROR("Couldn't allocate memory for log string");
goto out3;
}

argv[i++] = "-o";
argv[i++] = (char *)handler->conf->logfile;
argv[i++] = logfd;
}

if (my_args->quiet)
Expand All @@ -92,6 +110,9 @@ static int execute_start(struct lxc_handler *handler, void* data)
execvp(argv[0], argv);
SYSERROR("Failed to exec %s", argv[0]);

free(logfd);
out3:
close(log);
out2:
free(argv);
out1:
Expand Down

0 comments on commit cd90db2

Please sign in to comment.