/*
* Low-level
*/
-extern int loopcxt_init(struct loopdev_cxt *lc, int flags);
+extern int loopcxt_init(struct loopdev_cxt *lc, int flags)
+ __attribute__ ((warn_unused_result));
extern void loopcxt_deinit(struct loopdev_cxt *lc);
extern void loopcxt_enable_debug(struct loopdev_cxt *lc, int enable);
-extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device);
+extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device)
+ __attribute__ ((warn_unused_result));
extern int loopcxt_has_device(struct loopdev_cxt *lc);
extern char *loopcxt_strdup_device(struct loopdev_cxt *lc);
extern const char *loopcxt_get_device(struct loopdev_cxt *lc);
*/
int loopcxt_init(struct loopdev_cxt *lc, int flags)
{
+ int rc;
struct stat st;
struct loopdev_cxt dummy = UL_LOOPDEVCXT_EMPTY;
memcpy(lc, &dummy, sizeof(dummy));
lc->flags = flags;
- loopcxt_set_device(lc, NULL);
+
+ rc = loopcxt_set_device(lc, NULL);
+ if (rc)
+ return rc;
if (!(lc->flags & LOOPDEV_FL_NOSYSFS) &&
get_linux_version() >= KERNEL_VERSION(2,6,37))
free(lc->filename);
lc->filename = NULL;
- loopcxt_set_device(lc, NULL);
+ ignore_result( loopcxt_set_device(lc, NULL) );
loopcxt_deinit_iterator(lc);
errno = errsv;
if ((lc->iter.flags & LOOPITER_FL_FREE) && !used)
return 0;
- DBG(lc, loopdev_debug("iter: setting device"));
- loopcxt_set_device(lc, NULL);
+ DBG(lc, loopdev_debug("iter: unset device"));
+ ignore_result( loopcxt_set_device(lc, NULL) );
return 1;
}
if (!device)
return 0;
- loopcxt_init(&lc, 0);
- loopcxt_set_device(&lc, device);
- rc = loopcxt_is_autoclear(&lc);
- loopcxt_deinit(&lc);
+ rc = loopcxt_init(&lc, 0);
+ if (!rc)
+ rc = loopcxt_set_device(&lc, device);
+ if (!rc)
+ rc = loopcxt_is_autoclear(&lc);
+ loopcxt_deinit(&lc);
return rc;
}
char *loopdev_get_backing_file(const char *device)
{
struct loopdev_cxt lc;
- char *res;
+ char *res = NULL;
if (!device)
return NULL;
+ if (loopcxt_init(&lc, 0))
+ return NULL;
+ if (loopcxt_set_device(&lc, device) == 0)
+ res = loopcxt_get_backing_file(&lc);
- loopcxt_init(&lc, 0);
- loopcxt_set_device(&lc, device);
- res = loopcxt_get_backing_file(&lc);
loopcxt_deinit(&lc);
-
return res;
}
if (!device || !filename)
return 0;
- loopcxt_init(&lc, 0);
- loopcxt_set_device(&lc, device);
+ rc = loopcxt_init(&lc, 0);
+ if (!rc)
+ rc = loopcxt_set_device(&lc, device);
+ if (rc)
+ return rc;
rc = !stat(filename, &st);
rc = loopcxt_is_used(&lc, rc ? &st : NULL, filename, offset, flags);
if (!device)
return -EINVAL;
- loopcxt_init(&lc, 0);
- rc = loopcxt_set_device(&lc, device);
+ rc = loopcxt_init(&lc, 0);
+ if (!rc)
+ rc = loopcxt_set_device(&lc, device);
if (!rc)
rc = loopcxt_delete_device(&lc);
loopcxt_deinit(&lc);
if (!filename)
return NULL;
- loopcxt_init(&lc, 0);
+ if (loopcxt_init(&lc, 0))
+ return NULL;
if (loopcxt_find_by_backing_file(&lc, filename, offset, flags))
res = loopcxt_strdup_device(&lc);
loopcxt_deinit(&lc);
int loopdev_count_by_backing_file(const char *filename, char **loopdev)
{
struct loopdev_cxt lc;
- int count = 0;
+ int count = 0, rc;
if (!filename)
return -1;
- loopcxt_init(&lc, 0);
+ rc = loopcxt_init(&lc, 0);
+ if (rc)
+ return rc;
if (loopcxt_init_iterator(&lc, LOOPITER_FL_USED))
return -1;
char *p;
uint64_t u64;
- loopcxt_init(&lc, flags);
+ if (loopcxt_init(&lc, flags))
+ return
loopcxt_enable_debug(&lc, debug);
if (loopcxt_set_device(&lc, device))
struct loopdev_cxt lc;
int rc;
- loopcxt_init(&lc, 0);
+ if (loopcxt_init(&lc, 0))
+ return;
loopcxt_enable_debug(&lc, debug);
if (loopcxt_init_iterator(&lc, flags))
static int test_loop_setup(const char *filename, const char *device, int debug)
{
struct loopdev_cxt lc;
- int rc = 0;
+ int rc;
- loopcxt_init(&lc, 0);
+ rc = loopcxt_init(&lc, 0);
+ if (rc)
+ return rc;
loopcxt_enable_debug(&lc, debug);
if (device) {
textdomain(PACKAGE);
atexit(close_stdout);
- loopcxt_init(&lc, 0);
+ if (loopcxt_init(&lc, 0))
+ err(EXIT_FAILURE, _("failed to initialize loopcxt"));
+
loopcxt_enable_debug(&lc, getenv("LOOPDEV_DEBUG") ? TRUE : FALSE);
while ((c = getopt_long(argc, argv, "ac:d:De:E:fhj:o:p:PrvV",
case 'c':
exclusive_option(&excl_any, EXCL_SET_CAPACITY, EXCL_ERROR);
act = A_SET_CAPACITY;
- loopcxt_set_device(&lc, optarg);
+ if (loopcxt_set_device(&lc, optarg))
+ err(EXIT_FAILURE, _("%s: failed to use device"),
+ optarg);
break;
case 'r':
lo_flags |= LO_FLAGS_READ_ONLY;
case 'd':
exclusive_option(&excl_any, EXCL_DETACH, EXCL_ERROR);
act = A_DELETE;
- loopcxt_set_device(&lc, optarg);
+ if (loopcxt_set_device(&lc, optarg))
+ err(EXIT_FAILURE, _("%s: failed to use device"),
+ optarg);
break;
case 'D':
exclusive_option(&excl_any, EXCL_DETACH_ALL, EXCL_ERROR);
* losetup <device>
*/
act = A_SHOW_ONE;
- loopcxt_set_device(&lc, argv[optind++]);
+ if (loopcxt_set_device(&lc, argv[optind]))
+ err(EXIT_FAILURE, _("%s: failed to use device"),
+ argv[optind]);
+ optind++;
}
if (!act) {
/*
if (optind >= argc)
errx(EXIT_FAILURE, _("no loop device specified"));
- loopcxt_set_device(&lc, argv[optind++]);
+ if (loopcxt_set_device(&lc, argv[optind]))
+ err(EXIT_FAILURE, _("%s failed to use device"),
+ argv[optind]);
+ optind++;
if (optind >= argc)
errx(EXIT_FAILURE, _("no file specified"));
case A_DELETE:
res = delete_loop(&lc);
while (optind < argc) {
- loopcxt_set_device(&lc, argv[optind++]);
+ if (loopcxt_set_device(&lc, argv[optind]))
+ warn(_("%s: failed to use device"),
+ argv[optind]);
+ optind++;
res += delete_loop(&lc);
}
break;