static int _recursive_rmdir(const char *dirname, dev_t pdev,
const char *exclude, int level, bool onedev)
{
+ __do_closedir DIR *dir = NULL;
+ int failed = 0;
+ bool hadexclude = false;
+ int ret;
struct dirent *direntp;
- DIR *dir;
- int ret, failed = 0;
char pathname[PATH_MAX];
- bool hadexclude = false;
dir = opendir(dirname);
- if (!dir) {
- ERROR("Failed to open \"%s\"", dirname);
- return -1;
- }
+ if (!dir)
+ return log_error(-1, "Failed to open \"%s\"", dirname);
while ((direntp = readdir(dir))) {
- struct stat mystat;
int rc;
+ struct stat mystat;
if (!strcmp(direntp->d_name, ".") ||
!strcmp(direntp->d_name, ".."))
rc = snprintf(pathname, PATH_MAX, "%s/%s", dirname, direntp->d_name);
if (rc < 0 || rc >= PATH_MAX) {
ERROR("The name of path is too long");
- failed=1;
+ failed = 1;
continue;
}
if (!level && exclude && !strcmp(direntp->d_name, exclude)) {
ret = rmdir(pathname);
if (ret < 0) {
- switch(errno) {
+ switch (errno) {
case ENOTEMPTY:
INFO("Not deleting snapshot \"%s\"", pathname);
hadexclude = true;
}
if (onedev && mystat.st_dev != pdev) {
- /* TODO should we be checking /proc/self/mountinfo for
- * pathname and not doing this if found? */
if (btrfs_try_remove_subvol(pathname))
INFO("Removed btrfs subvolume at \"%s\"", pathname);
continue;
}
if (S_ISDIR(mystat.st_mode)) {
- if (_recursive_rmdir(pathname, pdev, exclude, level+1, onedev) < 0)
- failed=1;
+ if (_recursive_rmdir(pathname, pdev, exclude, level + 1, onedev) < 0)
+ failed = 1;
} else {
if (unlink(pathname) < 0) {
SYSERROR("Failed to delete \"%s\"", pathname);
- failed=1;
+ failed = 1;
}
}
}
if (rmdir(dirname) < 0 && !btrfs_try_remove_subvol(dirname) && !hadexclude) {
SYSERROR("Failed to delete \"%s\"", dirname);
- failed=1;
- }
-
- ret = closedir(dir);
- if (ret) {
- SYSERROR("Failed to close directory \"%s\"", dirname);
- failed=1;
+ failed = 1;
}
return failed ? -1 : 0;
}
-/* In overlayfs, st_dev is unreliable. So on overlayfs we don't do the
- * lxc_rmdir_onedev()
+/*
+ * In overlayfs, st_dev is unreliable. So on overlayfs we don't do the
+ * lxc_rmdir_onedev().
*/
-static bool is_native_overlayfs(const char *path)
+static inline bool is_native_overlayfs(const char *path)
{
- if (has_fs_type(path, OVERLAY_SUPER_MAGIC) ||
- has_fs_type(path, OVERLAYFS_SUPER_MAGIC))
- return true;
-
- return false;
+ return has_fs_type(path, OVERLAY_SUPER_MAGIC) ||
+ has_fs_type(path, OVERLAYFS_SUPER_MAGIC);
}
/* returns 0 on success, -1 if there were any failures */
if (errno == ENOENT)
return 0;
- SYSERROR("Failed to stat \"%s\"", path);
- return -1;
+ return log_error_errno(-1, errno, "Failed to stat \"%s\"", path);
}
return _recursive_rmdir(path, mystat.st_dev, exclude, 0, onedev);
const char *orig = dir;
do {
+ __do_free char *makeme = NULL;
int ret;
- char *makeme;
dir = tmp + strspn(tmp, "/");
tmp = dir + strcspn(dir, "/");
- errno = ENOMEM;
makeme = strndup(orig, dir - orig);
if (!makeme)
- return -1;
+ return ret_set_errno(-1, ENOMEM);
ret = mkdir(makeme, mode);
- if (ret < 0 && errno != EEXIST) {
- SYSERROR("Failed to create directory \"%s\"", makeme);
- free(makeme);
- return -1;
- }
+ if (ret < 0 && errno != EEXIST)
+ return log_error_errno(-1, errno, "Failed to create directory \"%s\"", makeme);
- free(makeme);
} while (tmp != dir);
return 0;
char *get_rundir()
{
char *rundir;
+ size_t len;
const char *homedir;
struct stat sb;
if (stat(RUNTIME_PATH, &sb) < 0)
return NULL;
- if (geteuid() == sb.st_uid || getegid() == sb.st_gid) {
- rundir = strdup(RUNTIME_PATH);
- return rundir;
- }
+ if (geteuid() == sb.st_uid || getegid() == sb.st_gid)
+ return strdup(RUNTIME_PATH);
rundir = getenv("XDG_RUNTIME_DIR");
- if (rundir) {
- rundir = strdup(rundir);
- return rundir;
- }
+ if (rundir)
+ return strdup(rundir);
INFO("XDG_RUNTIME_DIR isn't set in the environment");
homedir = getenv("HOME");
- if (!homedir) {
- ERROR("HOME isn't set in the environment");
- return NULL;
- }
+ if (!homedir)
+ return log_error(NULL, "HOME isn't set in the environment");
- rundir = malloc(sizeof(char) * (17 + strlen(homedir)));
+ len = strlen(homedir) + 17;
+ rundir = malloc(sizeof(char) * len);
if (!rundir)
return NULL;
- sprintf(rundir, "%s/.cache/lxc/run/", homedir);
-
+ snprintf(rundir, len, "%s/.cache/lxc/run/", homedir);
return rundir;
}
#ifdef HAVE_OPENSSL
#include <openssl/evp.h>
-static int do_sha1_hash(const char *buf, int buflen, unsigned char *md_value, unsigned int *md_len)
+static int do_sha1_hash(const char *buf, int buflen, unsigned char *md_value,
+ unsigned int *md_len)
{
EVP_MD_CTX *mdctx;
const EVP_MD *md;
md = EVP_get_digestbyname("sha1");
- if(!md) {
- printf("Unknown message digest: sha1\n");
- return -1;
- }
+ if (!md)
+ return log_error(-1, "Unknown message digest: sha1\n");
mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, md, NULL);
int sha1sum_file(char *fnam, unsigned char *digest, unsigned int *md_len)
{
- char *buf;
+ __do_free char *buf = NULL;
+ __do_fclose FILE *f = NULL;
int ret;
- FILE *f;
long flen;
if (!fnam)
return -1;
f = fopen_cloexec(fnam, "r");
- if (!f) {
- SYSERROR("Failed to open template \"%s\"", fnam);
- return -1;
- }
+ if (!f)
+ return log_error_errno(-1, errno, "Failed to open template \"%s\"", fnam);
- if (fseek(f, 0, SEEK_END) < 0) {
- SYSERROR("Failed to seek to end of template");
- fclose(f);
- return -1;
- }
+ if (fseek(f, 0, SEEK_END) < 0)
+ return log_error_errno(-1, errno, "Failed to seek to end of template");
- if ((flen = ftell(f)) < 0) {
- SYSERROR("Failed to tell size of template");
- fclose(f);
- return -1;
- }
+ flen = ftell(f);
+ if (flen < 0)
+ return log_error_errno(-1, errno, "Failed to tell size of template");
- if (fseek(f, 0, SEEK_SET) < 0) {
- SYSERROR("Failed to seek to start of template");
- fclose(f);
- return -1;
- }
+ if (fseek(f, 0, SEEK_SET) < 0)
+ return log_error_errno(-1, errno, "Failed to seek to start of template");
- if ((buf = malloc(flen+1)) == NULL) {
- SYSERROR("Out of memory");
- fclose(f);
- return -1;
- }
+ buf = malloc(flen + 1);
+ if (!buf)
+ return log_error_errno(-1, ENOMEM, "Out of memory");
- if (fread(buf, 1, flen, f) != flen) {
- SYSERROR("Failed to read template");
- free(buf);
- fclose(f);
- return -1;
- }
-
- if (fclose(f) < 0) {
- SYSERROR("Failed to close template");
- free(buf);
- return -1;
- }
+ if (fread(buf, 1, flen, f) != flen)
+ return log_error_errno(-1, errno, "Failed to read template");
buf[flen] = '\0';
ret = do_sha1_hash(buf, flen, (void *)digest, md_len);
- free(buf);
return ret;
}
#endif
uid_t nsid, hostid, range;
f = fopen("/proc/self/uid_map", "re");
- if (!f) {
- SYSERROR("Failed to open uid_map");
- return 0;
- }
+ if (!f)
+ return log_error_errno(0, errno, "Failed to open uid_map");
while (getline(&line, &sz, f) != -1) {
if (sscanf(line, "%u %u %u", &nsid, &hostid, &range) != 3)
gid_t nsid, hostid, range;
f = fopen("/proc/self/gid_map", "re");
- if (!f) {
- SYSERROR("Failed to open gid_map");
- return 0;
- }
+ if (!f)
+ return log_error_errno(0, errno, "Failed to open gid_map");
while (getline(&line, &sz, f) != -1) {
if (sscanf(line, "%u %u %u", &nsid, &hostid, &range) != 3)
return false;
fd = open(nspath, O_RDONLY | O_CLOEXEC);
- if (fd < 0) {
- SYSERROR("Failed to open \"%s\"", nspath);
- return false;
- }
+ if (fd < 0)
+ return log_error_errno(false, errno, "Failed to open \"%s\"", nspath);
ret = setns(fd, 0);
- if (ret) {
- SYSERROR("Failed to set process %d to \"%s\" of %d.", pid, ns,
- fd);
- return false;
- }
+ if (ret)
+ return log_error_errno(false, errno, "Failed to set process %d to \"%s\" of %d", pid, ns, fd);
return true;
}
char *on_path(const char *cmd, const char *rootfs)
{
- char *entry = NULL, *path = NULL;
+ __do_free char *path = NULL;
+ char *entry = NULL;
char cmdpath[PATH_MAX];
int ret;
if (!path)
return NULL;
- lxc_iterate_parts (entry, path, ":") {
+ lxc_iterate_parts(entry, path, ":") {
if (rootfs)
ret = snprintf(cmdpath, PATH_MAX, "%s/%s/%s", rootfs,
entry, cmd);
if (ret < 0 || ret >= PATH_MAX)
continue;
- if (access(cmdpath, X_OK) == 0) {
- free(path);
+ if (access(cmdpath, X_OK) == 0)
return strdup(cmdpath);
- }
}
- free(path);
return NULL;
}