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 -=|