int r, fd;
if (machine_name_is_valid(argv[1])) {
- r = image_find(argv[1], &image);
+ r = image_find(IMAGE_MACHINE, argv[1], &image);
if (r < 0)
return log_error_errno(r, "Failed to look for machine %s: %m", argv[1]);
if (r == 0) {
int r, fd;
if (machine_name_is_valid(argv[1])) {
- r = image_find(argv[1], &image);
+ r = image_find(IMAGE_MACHINE, argv[1], &image);
if (r < 0)
return log_error_errno(r, "Failed to look for machine %s: %m", argv[1]);
if (r == 0) {
}
if (!arg_force) {
- r = image_find(local, NULL);
+ r = image_find(IMAGE_MACHINE, local, NULL);
if (r < 0)
return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local);
else if (r > 0) {
}
if (!arg_force) {
- r = image_find(local, NULL);
+ r = image_find(IMAGE_MACHINE, local, NULL);
if (r < 0)
return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local);
else if (r > 0) {
}
if (!arg_force) {
- r = image_find(local, NULL);
+ r = image_find(IMAGE_MACHINE, local, NULL);
if (r < 0)
return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local);
else if (r > 0) {
}
if (!arg_force) {
- r = image_find(local, NULL);
+ r = image_find(IMAGE_MACHINE, local, NULL);
if (r < 0)
return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local);
else if (r > 0) {
if (r < 0)
return r;
- r = image_find(e, &image);
+ r = image_find(IMAGE_MACHINE, e, &image);
if (r <= 0)
return r;
if (!images)
return -ENOMEM;
- r = image_discover(images);
+ r = image_discover(IMAGE_MACHINE, images);
if (r < 0)
return r;
if (r < 0)
return r;
- r = image_find(name, NULL);
+ r = image_find(IMAGE_MACHINE, name, NULL);
if (r == 0)
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_IMAGE, "No image '%s' known", name);
if (r < 0)
if (!images)
return -ENOMEM;
- r = image_discover(images);
+ r = image_discover(IMAGE_MACHINE, images);
if (r < 0)
return r;
if (!image_name_is_valid(name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
- r = image_find(name, &i);
+ r = image_find(IMAGE_MACHINE, name, &i);
if (r < 0)
return r;
if (r == 0)
if (!image_name_is_valid(old_name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", old_name);
- r = image_find(old_name, &i);
+ r = image_find(IMAGE_MACHINE, old_name, &i);
if (r < 0)
return r;
if (r == 0)
if (!image_name_is_valid(old_name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", old_name);
- r = image_find(old_name, &i);
+ r = image_find(IMAGE_MACHINE, old_name, &i);
if (r < 0)
return r;
if (r == 0)
if (!image_name_is_valid(name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
- r = image_find(name, &i);
+ r = image_find(IMAGE_MACHINE, name, &i);
if (r < 0)
return r;
if (r == 0)
if (!image_name_is_valid(name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
- r = image_find(name, &i);
+ r = image_find(IMAGE_MACHINE, name, &i);
if (r < 0)
return r;
if (r == 0)
if (!image_name_is_valid(name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
- r = image_find(name, &i);
+ r = image_find(IMAGE_MACHINE, name, &i);
if (r < 0)
return r;
if (r == 0)
if (!image_name_is_valid(name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
- r = image_find(name, &i);
+ r = image_find(IMAGE_MACHINE, name, &i);
if (r < 0)
return r;
if (r == 0)
if (!image_name_is_valid(name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
- r = image_find(name, &i);
+ r = image_find(IMAGE_MACHINE, name, &i);
if (r < 0)
return r;
if (r == 0)
goto child_fail;
}
- r = image_discover(images);
+ r = image_discover(IMAGE_MACHINE, images);
if (r < 0)
goto child_fail;
if (!image_name_is_valid(name))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
- r = image_find(name, &i);
+ r = image_find(IMAGE_MACHINE, name, &i);
if (r < 0)
return r;
if (r == 0)
if (arg_machine) {
_cleanup_(image_unrefp) Image *i = NULL;
- r = image_find(arg_machine, &i);
+ r = image_find(IMAGE_MACHINE, arg_machine, &i);
if (r < 0)
return log_error_errno(r, "Failed to find image for machine '%s': %m", arg_machine);
if (r == 0) {
#include "util.h"
#include "xattr-util.h"
-static const char image_search_path[] =
- "/var/lib/machines\0"
- "/var/lib/container\0" /* legacy */
- "/usr/local/lib/machines\0"
- "/usr/lib/machines\0";
+static const char* const image_search_path[_IMAGE_CLASS_MAX] = {
+ [IMAGE_MACHINE] = "/var/lib/machines\0"
+ "/var/lib/container\0" /* legacy */
+ "/usr/local/lib/machines\0"
+ "/usr/lib/machines\0",
+
+ [IMAGE_PORTABLE] = "/var/lib/portables\0"
+ "/usr/local/lib/portables\0"
+ "/usr/lib/portables\0",
+};
Image *image_unref(Image *i) {
if (!i)
return 0;
}
-int image_find(const char *name, Image **ret) {
+int image_find(ImageClass class, const char *name, Image **ret) {
const char *path;
int r;
+ assert(class >= 0);
+ assert(class < _IMAGE_CLASS_MAX);
assert(name);
/* There are no images with invalid names */
if (!image_name_is_valid(name))
return 0;
- NULSTR_FOREACH(path, image_search_path) {
+ NULSTR_FOREACH(path, image_search_path[class]) {
_cleanup_closedir_ DIR *d = NULL;
d = opendir(path);
return 1;
}
- if (streq(name, ".host"))
+ if (class == IMAGE_MACHINE && streq(name, ".host"))
return image_make(".host", AT_FDCWD, NULL, "/", ret);
return 0;
};
-int image_discover(Hashmap *h) {
+int image_discover(ImageClass class, Hashmap *h) {
const char *path;
int r;
+ assert(class >= 0);
+ assert(class < _IMAGE_CLASS_MAX);
assert(h);
- NULSTR_FOREACH(path, image_search_path) {
+ NULSTR_FOREACH(path, image_search_path[class]) {
_cleanup_closedir_ DIR *d = NULL;
struct dirent *de;
}
}
- if (!hashmap_contains(h, ".host")) {
+ if (class == IMAGE_MACHINE && !hashmap_contains(h, ".host")) {
_cleanup_(image_unrefp) Image *image = NULL;
r = image_make(".host", AT_FDCWD, NULL, "/", &image);
if (r < 0)
return r;
- r = image_find(new_name, NULL);
+ r = image_find(IMAGE_MACHINE, new_name, NULL);
if (r < 0)
return r;
if (r > 0)
if (r < 0)
return r;
- r = image_find(new_name, NULL);
+ r = image_find(IMAGE_MACHINE, new_name, NULL);
if (r < 0)
return r;
if (r > 0)
#include "string-util.h"
#include "time-util.h"
+typedef enum ImageClass {
+ IMAGE_MACHINE,
+ IMAGE_PORTABLE,
+ _IMAGE_CLASS_MAX,
+ _IMAGE_CLASS_INVALID = -1
+} ImageClass;
+
typedef enum ImageType {
IMAGE_DIRECTORY,
IMAGE_SUBVOLUME,
DEFINE_TRIVIAL_CLEANUP_FUNC(Image*, image_unref);
DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, image_hashmap_free);
-int image_find(const char *name, Image **ret);
-int image_discover(Hashmap *map);
+int image_find(ImageClass class, const char *name, Image **ret);
+int image_discover(ImageClass class, Hashmap *map);
int image_remove(Image *i);
int image_rename(Image *i, const char *new_name);