diff --git a/src/util/virlog.c b/src/util/virlog.c index 92ef794084b8ad9aeff638a9200775eba1e097de..9c98588f89daeb245c8f21a3598f4eb89fd5fb3d 100644 --- a/src/util/virlog.c +++ b/src/util/virlog.c @@ -1794,16 +1794,37 @@ virLogFindOutput(virLogOutputPtr *outputs, size_t noutputs, int virLogDefineOutputs(virLogOutputPtr *outputs, size_t noutputs) { + int ret = -1; + int id; + char *tmp = NULL; + if (virLogInitialize() < 0) return -1; virLogLock(); virLogResetOutputs(); + + /* syslog needs to be special-cased, since it keeps the fd in private */ + if ((id = virLogFindOutput(outputs, noutputs, VIR_LOG_TO_SYSLOG, + current_ident)) != -1) { + /* nothing can go wrong now (except for malloc) and since we're also + * holding the lock so it's safe to call openlog and change the message + * tag + */ + if (VIR_STRDUP_QUIET(tmp, outputs[id]->name) < 0) + goto cleanup; + VIR_FREE(current_ident); + current_ident = tmp; + openlog(current_ident, 0, 0); + } + virLogOutputs = outputs; virLogNbOutputs = noutputs; - virLogUnlock(); - return 0; + ret = 0; + cleanup: + virLogUnlock(); + return ret; }