static int printf_loopdev(struct loopdev_cxt *lc) { uint64_t x; dev_t dev = 0; ino_t ino = 0; char *fname = NULL; uint32_t type; fname = loopcxt_get_backing_file(lc); if (!fname) return -EINVAL; if (loopcxt_get_backing_devno(lc, &dev) == 0) loopcxt_get_backing_inode(lc, &ino); if (!dev && !ino) { /* * Probably non-root user (no permissions to * call LOOP_GET_STATUS ioctls). */ printf("%s: []: (%s)", loopcxt_get_device(lc), fname); if (loopcxt_get_offset(lc, &x) == 0 && x) printf(_(", offset %ju"), x); if (loopcxt_get_sizelimit(lc, &x) == 0 && x) printf(_(", sizelimit %ju"), x); printf("\n"); return 0; } printf("%s: [%04d]:%" PRIu64 " (%s)", loopcxt_get_device(lc), (int) dev, ino, fname); if (loopcxt_get_offset(lc, &x) == 0 && x) printf(_(", offset %ju"), x); if (loopcxt_get_sizelimit(lc, &x) == 0 && x) printf(_(", sizelimit %ju"), x); if (loopcxt_get_encrypt_type(lc, &type) == 0) { const char *e = loopcxt_get_crypt_name(lc); if ((!e || !*e) && type == 1) e = "XOR"; if (e && *e) printf(_(", encryption %s (type %u)"), e, type); } printf("\n"); return 0; }
static void test_loop_info(const char *device, int flags, int debug) { struct loopdev_cxt lc; char *p; uint64_t u64; loopcxt_init(&lc, flags); loopcxt_enable_debug(&lc, debug); if (loopcxt_set_device(&lc, device)) err(EXIT_FAILURE, "failed to set device"); p = loopcxt_get_backing_file(&lc); printf("\tBACKING FILE: %s\n", p); free(p); if (loopcxt_get_offset(&lc, &u64) == 0) printf("\tOFFSET: %jd\n", u64); if (loopcxt_get_sizelimit(&lc, &u64) == 0) printf("\tSIZE LIMIT: %jd\n", u64); printf("\tAUTOCLEAR: %s\n", loopcxt_is_autoclear(&lc) ? "YES" : "NOT"); loopcxt_deinit(&lc); }