Daniel P. Berrange wrote: [Mon Oct 05 2009, 08:52:20AM EDT]
ACK, although it'd need a small change for my suggested API
contract
change in your previous patch in the series
Updated for API change...
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 | 77 ++++++++++++++++++++++++++++++++++++++++------
2 files changed, 70 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..f79d109 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;
+ char *filterstr;
+ char *outputstr;
+ char *tmp;
pid_t child;
int status;
fd_set keepfd;
@@ -863,6 +867,52 @@ 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) {
+ filterstr = virLogGetFilters();
+ if (!filterstr)
+ goto no_memory;
+ ADD_ENV_PAIR("LIBVIRT_LOG_FILTERS", filterstr);
+ VIR_FREE(filterstr);
+ }
+
+ if (virLogGetNbOutputs() > 0) {
+ outputstr = virLogGetOutputs();
+ if (!outputstr)
+ goto no_memory;
+ ADD_ENV_PAIR("LIBVIRT_LOG_OUTPUTS", outputstr);
+ VIR_FREE(outputstr);
+ }
+
+ ADD_ENV(NULL);
+
snprintf(appPtyStr, sizeof(appPtyStr), "%d", appPty);
emulator = vm->def->emulator;
@@ -883,7 +933,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 +960,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;
}