
On Fri, Feb 16, 2007 at 02:44:57PM +0000, Mark McLoughlin wrote:
Add a qemudLog() function which uses syslog() if we're in daemon mode, doesn't output INFO/DEBUG messages unless the verbose flag is set and doesn't output DEBUG messages unless compiled with --enable-debug.
The QEMU daemon can run both as root, or non-root. Using syslog in the non-root case is not particularly helpful because the user will have no way to retrieve the log messages. We should have the daemon log to a file under $HOME/.libvirt somewhere, and only use syslog if explicitly turned on via a command line arg to the daemon. I think there's scope for making this more generally useful too, rather than making it just part of the QEMU daemon. The general libvirtd will definitely need it, and I think once we have remote managemnet it'll be important to have a way to do logging in the client library which integrates into apps using libvirt. eg let the app register a callback to receive debug messages. The same core functions The patch itself looks reasonable, but next time there's a patch of this scale please post this stuff for review before committing
if (sys) { - if (snprintf(sockname, sizeof(sockname), "%s/run/libvirt/qemud-sock", LOCAL_STATE_DIR) >= (int)sizeof(sockname)) { - return -1; - } + if (snprintf(sockname, sizeof(sockname), "%s/run/libvirt/qemud-sock", LOCAL_STATE_DIR) >= (int)sizeof(sockname)) + goto snprintf_error; +
I've just realized the return value checks I did here are incomplete. As well as checking for overflow with >=, we also need to check for general errors which are indicated by a -ve return value.
+ if (snprintf(sockname, sizeof(sockname), "%s/run/libvirt/qemud-sock-ro", LOCAL_STATE_DIR) >= (int)sizeof(sockname)) + goto snprintf_error;
- if (snprintf(sockname, sizeof(sockname), "%s/run/libvirt/qemud-sock-ro", LOCAL_STATE_DIR) >= (int)sizeof(sockname)) { - return -1; - }
Likewise. Dan
unlink(sockname); if (qemudListenUnix(server, sockname, 1) < 0) return -1; @@ -289,29 +375,38 @@ static int qemudListen(struct qemud_serv int uid;
if ((uid = geteuid()) < 0) { + qemudLog(QEMUD_ERR, "You must run the daemon as root to use system mode"); return -1; }
This error message looks bogus. This codepath is the per-user unprivileged session mode, and the error. And actually checking return value at all is completely unneccesssary because geteuid() is guarenteed not to fail. We do, however, need a check if (geteuid() != 0) { .... } In the first half of the if() block in the qemudListen function to check for root privs in system mode.
if ((uid = geteuid()) < 0) { + qemudLog(QEMUD_ERR, "You must run the daemon as root to use system mode"); goto cleanup; }
Again, same as above.
@@ -1226,6 +1332,7 @@ static int qemudDispatchPoll(struct qemu
while (sock) { struct qemud_socket *next = sock->next; + /* FIXME: the daemon shouldn't exit on error here */ if (fds[fd].revents) if (qemudDispatchServer(server, sock) < 0) return -1;
Yes & no. There are two reasons why qemuDispatchServer can fail. Either it can fail to set CLOSEXEC/NONBLOCK mode on the client socket, in which case we could simply drop the client & continue without exiting. If the accept() call fails for anything other than EAGAIN/EINTR then we arguably should exit, because something serious has gone wrong.
if (fds[fd].revents) { - QEMUD_DEBUG("Poll data normal\n"); + qemudDebug("Poll data normal"); if (fds[fd].revents == POLLOUT) qemudDispatchClientWrite(server, client); else if (fds[fd].revents == POLLIN) @@ -1281,7 +1388,7 @@ static int qemudDispatchPoll(struct qemu } vm = next; if (failed) - ret = -1; + ret = -1; /* FIXME: the daemon shouldn't exit on failure here */ }
The failed flag should only get set if something serious went wrong when trying to cleanup after a dead VM. If cleanup succeeds we stick around, but if it fails I'm not entirely convinced we shouldn't exit. Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|