[libvirt] [PATCH v2 8/8] rpc: pass listen FD to the daemon being started
Daniel P. Berrange
berrange at redhat.com
Wed Jul 23 09:25:34 UTC 2014
On Wed, Jul 16, 2014 at 08:30:02PM +0200, Martin Kletzander wrote:
> - retry:
> - if (connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) {
> - if ((errno == ECONNREFUSED ||
> - errno == ENOENT) &&
> - spawnDaemon && retries < 20) {
> - VIR_DEBUG("Connection refused for %s, trying to spawn %s",
> - path, binary);
> - if (retries == 0 &&
> - virNetSocketForkDaemon(binary) < 0)
> - goto error;
> + if (spawnDaemon) {
> + if ((passfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
> + virReportSystemError(errno, "%s", _("Failed to create socket"));
> + goto error;
> + }
>
> - retries++;
> - usleep(1000 * 100 * retries);
> - goto retry;
> + /*
> + * We cannot do the umask() trick here because that's not
> + * thread-safe. fchmod(), however, is not guaranteed to work on
> + * some BSD favours, but *should* work on Linux before the socket
> + * is bound. POSIX says the behaviour of fchmod() called on
> + * socket is unspecified, though.
> + */
IIUC, the entire concept of UNIX domain socket permissions is entirely
unspecified not just fchmod().
We could however use umask() here if you use a virFork() to start a
single threaded process. Set umask, create the socket, and then exit,
allowing the parent to continue.
> + if (fchmod(passfd, 0700) < 0) {
> + virReportSystemError(errno, "%s",
> + _("Failed to change permissions on socket"));
> + goto error;
> }
>
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list