
On Wed, May 02, 2012 at 01:53:36PM -0400, William Jon McCann wrote:
+static int migrateProfile(void) +{ + char *old_base = NULL; + char *updated = NULL; + char *home = NULL; + char *xdg_dir = NULL; + char *config_dir = NULL; + const char *config_home; + int ret = -1; + mode_t old_umask; + + if (!(home = virGetUserDirectory(geteuid()))) + goto cleanup; + + if (virAsprintf(&old_base, "%s/.libvirt", home) < 0) { + goto cleanup; + } + + /* if the new directory is there or the old one is not: do nothing */ + if (!(config_dir = virGetUserConfigDirectory(geteuid()))) + goto cleanup; + + if (!virFileIsDir(old_base) || virFileExists(config_dir)) {
This is missing an assignment 'ret = 0', since this is a success (no-op) case, rather than a failure case.
+ goto cleanup; + } +static char *virGetXDGDirectory(uid_t uid, const char *xdgenvname, const char *xdgdefdir) +{ + char *path = NULL; + virBuffer buf = VIR_BUFFER_INITIALIZER; + + if (uid == getuid ()) + path = getenv(xdgenvname); + + if (path && path[0]) { + virBufferAsprintf(&buf, "%s/libvirt/", path); + } else { + char *home; + home = virGetUserEnt(uid, VIR_USER_ENT_DIRECTORY); + virBufferAsprintf(&buf, "%s/%s/libvirt/", home, xdgdefdir); + VIR_FREE(home); + } + VIR_FREE(path);
Opps, getenv() returns a string that should not be freed. Also we can simplify this by just using virAsprintf() since there's only one printf required here
+ + if (virBufferError(&buf)) { + virBufferFreeAndReset(&buf); + virReportOOMError(); + return NULL; + } + + return virBufferContentAndReset(&buf); +} + +char *virGetUserConfigDirectory(uid_t uid) +{ + return virGetXDGDirectory(uid, "XDG_CONFIG_HOME", ".config"); +} + +char *virGetUserCacheDirectory(uid_t uid) +{ + return virGetXDGDirectory(uid, "XDG_CACHE_HOME", ".cache"); +} +
Basically I applied the following diff ontop of your patch and it then worked as expected for me diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index bb25678..67248b3 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -770,6 +770,7 @@ static int migrateProfile(void) goto cleanup; if (!virFileIsDir(old_base) || virFileExists(config_dir)) { + ret = 0; goto cleanup; } diff --git a/src/util/util.c b/src/util/util.c index 447b7b7..b47e3d8 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -2312,29 +2312,27 @@ char *virGetUserDirectory(uid_t uid) static char *virGetXDGDirectory(uid_t uid, const char *xdgenvname, const char *xdgdefdir) { - char *path = NULL; - virBuffer buf = VIR_BUFFER_INITIALIZER; + const char *path = NULL; + char *ret = NULL; + char *home = virGetUserEnt(uid, VIR_USER_ENT_DIRECTORY); - if (uid == getuid ()) + if (uid == getuid()) path = getenv(xdgenvname); if (path && path[0]) { - virBufferAsprintf(&buf, "%s/libvirt/", path); + if (virAsprintf(&ret, "%s/libvirt/", path) < 0) + goto no_memory; } else { - char *home; - home = virGetUserEnt(uid, VIR_USER_ENT_DIRECTORY); - virBufferAsprintf(&buf, "%s/%s/libvirt/", home, xdgdefdir); - VIR_FREE(home); - } - VIR_FREE(path); - - if (virBufferError(&buf)) { - virBufferFreeAndReset(&buf); - virReportOOMError(); - return NULL; + if (virAsprintf(&ret, "%s/%s/libvirt/", home, xdgdefdir) < 0) + goto no_memory; } - return virBufferContentAndReset(&buf); +cleanup: + VIR_FREE(home); + return ret; +no_memory: + virReportOOMError(); + goto cleanup; } char *virGetUserConfigDirectory(uid_t uid) @@ -2349,8 +2347,7 @@ char *virGetUserCacheDirectory(uid_t uid) char *virGetUserRuntimeDirectory(uid_t uid) { - char *path = NULL; - virBuffer buf = VIR_BUFFER_INITIALIZER; + const char *path = NULL; if (uid == getuid ()) path = getenv("XDG_RUNTIME_DIR"); @@ -2358,16 +2355,12 @@ char *virGetUserRuntimeDirectory(uid_t uid) if (!path || !path[0]) { return virGetUserCacheDirectory(uid); } else { - virBufferAsprintf(&buf, "%s/libvirt/", path); - VIR_FREE(path); - - if (virBufferError(&buf)) { - virBufferFreeAndReset(&buf); + char *ret; + if (virAsprintf(&ret, "%s/libvirt/", path) < 0) { virReportOOMError(); return NULL; } - - return virBufferContentAndReset(&buf); + return ret; } } I would ACK this patch with those changes applied. Having said that I think I would prefer to wait until after the 0.9.12 release is cut before applying this, since I'm afraid there may be some unexpected consequences. Waiting till after 0.9.13 gives us a month to test it in GIT master before it gets into a release. 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 :|