On Sun, Oct 04, 2009 at 03:29:01PM -0400, Amy Griffis wrote:
Before launching the lxc controller, have the lxc driver query the
log
settings and setup envp[]. This provides the advantage of honoring the
actual log configuration instead of only what had been set in the
environment. The lxc controller now simply has to call
virLogSetFromEnv().
---
src/lxc/lxc_controller.c | 3 ++
src/lxc/lxc_driver.c | 73 ++++++++++++++++++++++++++++++++++++++++------
2 files changed, 66 insertions(+), 10 deletions(-)
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index bca721b..545f718 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -793,6 +793,9 @@ int main(int argc, char *argv[])
}
}
+ /* Initialize logging */
+ virLogSetFromEnv();
+
/* Accept initial client which is the libvirtd daemon */
if ((client = accept(monitor, NULL, 0)) < 0) {
virReportSystemError(NULL, errno, "%s",
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 5fb4105..c5a49f2 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -830,9 +830,13 @@ static int lxcControllerStart(virConnectPtr conn,
{
int i;
int rc;
- int ret = -1;
int largc = 0, larga = 0;
const char **largv = NULL;
+ int lenvc = 0, lenva = 0;
+ const char **lenv = NULL;
+ virBuffer filterbuf = VIR_BUFFER_INITIALIZER;
+ virBuffer outputbuf = VIR_BUFFER_INITIALIZER;
+ char *tmp;
pid_t child;
int status;
fd_set keepfd;
@@ -863,6 +867,48 @@ static int lxcControllerStart(virConnectPtr conn,
goto no_memory; \
} while (0)
+#define ADD_ENV_SPACE \
+ do { \
+ if (lenvc == lenva) { \
+ lenva += 10; \
+ if (VIR_REALLOC_N(lenv, lenva) < 0) \
+ goto no_memory; \
+ } \
+ } while (0)
+
+#define ADD_ENV(thisarg) \
+ do { \
+ ADD_ENV_SPACE; \
+ lenv[lenvc++] = thisarg; \
+ } while (0)
+
+#define ADD_ENV_PAIR(envname, val) \
+ do { \
+ char *envval; \
+ ADD_ENV_SPACE; \
+ if (virAsprintf(&envval, "%s=%s", envname, val) < 0)
\
+ goto no_memory; \
+ lenv[lenvc++] = envval; \
+ } while (0)
+
+ if (virAsprintf(&tmp, "LIBVIRT_DEBUG=%d", virLogGetDefaultPriority())
< 0)
+ goto no_memory;
+ ADD_ENV(tmp);
+
+ if (virLogGetNbFilters() > 0) {
+ if (virLogGetFilters(&filterbuf) < 0)
+ goto no_memory;
+ ADD_ENV_PAIR("LIBVIRT_LOG_FILTERS",
virBufferContentAndReset(&filterbuf));
+ }
+
+ if (virLogGetNbOutputs() > 0) {
+ if (virLogGetOutputs(&outputbuf) < 0)
+ goto no_memory;
+ ADD_ENV_PAIR("LIBVIRT_LOG_OUTPUTS",
virBufferContentAndReset(&outputbuf));
+ }
+
+ ADD_ENV(NULL);
+
snprintf(appPtyStr, sizeof(appPtyStr), "%d", appPty);
emulator = vm->def->emulator;
@@ -883,7 +929,7 @@ static int lxcControllerStart(virConnectPtr conn,
FD_SET(appPty, &keepfd);
- if (virExec(conn, largv, NULL, &keepfd, &child,
+ if (virExec(conn, largv, lenv, &keepfd, &child,
-1, &logfd, &logfd,
VIR_EXEC_NONE) < 0)
goto cleanup;
@@ -910,18 +956,25 @@ static int lxcControllerStart(virConnectPtr conn,
#undef ADD_ARG
#undef ADD_ARG_LIT
#undef ADD_ARG_SPACE
+#undef ADD_ENV_SPACE
+#undef ADD_ENV_PAIR
- ret = 0;
-
-cleanup:
- for (i = 0 ; i < largc ; i++)
- VIR_FREE(largv[i]);
-
- return ret;
+ return 0;
no_memory:
virReportOOMError(conn);
- goto cleanup;
+cleanup:
+ if (largv) {
+ for (i = 0 ; i < largc ; i++)
+ VIR_FREE(largv[i]);
+ VIR_FREE(largv);
+ }
+ if (lenv) {
+ for (i=0 ; i < lenvc ; i++)
+ VIR_FREE(lenv[i]);
+ VIR_FREE(lenv);
+ }
+ return -1;
}
ACK, although it'd need a small change for my suggested API contract
change in your previous patch in the series
Daniel
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|