]> git.ipfire.org Git - thirdparty/util-linux.git/blob - include/loopdev.h
lib/loopdev: use new ul_path_* API
[thirdparty/util-linux.git] / include / loopdev.h
1 #ifndef UTIL_LINUX_LOOPDEV_H
2 #define UTIL_LINUX_LOOPDEV_H
3
4 #include "sysfs.h"
5
6 /*
7 * loop_info.lo_encrypt_type
8 */
9 #define LO_CRYPT_NONE 0
10 #define LO_CRYPT_XOR 1
11 #define LO_CRYPT_DES 2
12 #define LO_CRYPT_CRYPTOAPI 18
13
14 #define LOOP_SET_FD 0x4C00
15 #define LOOP_CLR_FD 0x4C01
16 /*
17 * Obsolete (kernel < 2.6)
18 *
19 * #define LOOP_SET_STATUS 0x4C02
20 * #define LOOP_GET_STATUS 0x4C03
21 */
22 #define LOOP_SET_STATUS64 0x4C04
23 #define LOOP_GET_STATUS64 0x4C05
24 /* #define LOOP_CHANGE_FD 0x4C06 */
25 #define LOOP_SET_CAPACITY 0x4C07
26 #define LOOP_SET_DIRECT_IO 0x4C08
27 #define LOOP_SET_BLOCK_SIZE 0x4C09
28
29 /* /dev/loop-control interface */
30 #ifndef LOOP_CTL_ADD
31 # define LOOP_CTL_ADD 0x4C80
32 # define LOOP_CTL_REMOVE 0x4C81
33 # define LOOP_CTL_GET_FREE 0x4C82
34 #endif
35
36 /*
37 * loop_info.lo_flags
38 */
39 enum {
40 LO_FLAGS_READ_ONLY = 1,
41 LO_FLAGS_USE_AOPS = 2,
42 LO_FLAGS_AUTOCLEAR = 4, /* kernel >= 2.6.25 */
43 LO_FLAGS_PARTSCAN = 8, /* kernel >= 3.2 */
44 LO_FLAGS_DIRECT_IO = 16, /* kernel >= 4.2 */
45 };
46
47 #define LO_NAME_SIZE 64
48 #define LO_KEY_SIZE 32
49
50 /*
51 * Linux LOOP_{SET,GET}_STATUS64 ioctl struct
52 */
53 struct loop_info64 {
54 uint64_t lo_device;
55 uint64_t lo_inode;
56 uint64_t lo_rdevice;
57 uint64_t lo_offset;
58 uint64_t lo_sizelimit; /* bytes, 0 == max available */
59 uint32_t lo_number;
60 uint32_t lo_encrypt_type;
61 uint32_t lo_encrypt_key_size;
62 uint32_t lo_flags;
63 uint8_t lo_file_name[LO_NAME_SIZE];
64 uint8_t lo_crypt_name[LO_NAME_SIZE];
65 uint8_t lo_encrypt_key[LO_KEY_SIZE];
66 uint64_t lo_init[2];
67 };
68
69 #define LOOPDEV_MAJOR 7 /* loop major number */
70 #define LOOPDEV_DEFAULT_NNODES 8 /* default number of loop devices */
71
72 struct loopdev_iter {
73 FILE *proc; /* /proc/partitions */
74 DIR *sysblock; /* /sys/block */
75 int ncur; /* current position */
76 int *minors; /* ary of minor numbers (when scan whole /dev) */
77 int nminors; /* number of items in *minors */
78 int ct_perm; /* count permission problems */
79 int ct_succ; /* count number of detected devices */
80
81 unsigned int done:1; /* scanning done */
82 unsigned int default_check:1;/* check first LOOPDEV_NLOOPS */
83 int flags; /* LOOPITER_FL_* flags */
84 };
85
86 enum {
87 LOOPITER_FL_FREE = (1 << 0),
88 LOOPITER_FL_USED = (1 << 1)
89 };
90
91 /*
92 * handler for work with loop devices
93 */
94 struct loopdev_cxt {
95 char device[128]; /* device path (e.g. /dev/loop<N>) */
96 char *filename; /* backing file for loopcxt_set_... */
97 int fd; /* open(/dev/looo<N>) */
98 int mode; /* fd mode O_{RDONLY,RDWR} */
99
100 int flags; /* LOOPDEV_FL_* flags */
101 unsigned int has_info:1; /* .info contains data */
102 unsigned int extra_check:1; /* unusual stuff for iterator */
103 unsigned int info_failed:1; /* LOOP_GET_STATUS ioctl failed */
104 unsigned int control_ok:1; /* /dev/loop-control success */
105
106 struct path_cxt *sysfs; /* pointer to /sys/dev/block/<maj:min>/ */
107 struct loop_info64 info; /* for GET/SET ioctl */
108 struct loopdev_iter iter; /* scans /sys or /dev for used/free devices */
109 };
110
111 #define UL_LOOPDEVCXT_EMPTY { .fd = -1 }
112
113 /*
114 * loopdev_cxt.flags
115 */
116 enum {
117 LOOPDEV_FL_RDONLY = (1 << 0), /* open(/dev/loop) mode; default */
118 LOOPDEV_FL_RDWR = (1 << 1), /* necessary for loop setup only */
119 LOOPDEV_FL_OFFSET = (1 << 4),
120 LOOPDEV_FL_NOSYSFS = (1 << 5),
121 LOOPDEV_FL_NOIOCTL = (1 << 6),
122 LOOPDEV_FL_DEVSUBDIR = (1 << 7),
123 LOOPDEV_FL_CONTROL = (1 << 8), /* system with /dev/loop-control */
124 LOOPDEV_FL_SIZELIMIT = (1 << 9)
125 };
126
127 /*
128 * High-level
129 */
130 extern int loopmod_supports_partscan(void);
131
132 extern int is_loopdev(const char *device);
133 extern int loopdev_is_autoclear(const char *device);
134
135 extern char *loopdev_get_backing_file(const char *device);
136 extern int loopdev_is_used(const char *device, const char *filename,
137 uint64_t offset, uint64_t sizelimit, int flags);
138 extern char *loopdev_find_by_backing_file(const char *filename,
139 uint64_t offset, uint64_t sizelimit, int flags);
140 extern int loopcxt_find_unused(struct loopdev_cxt *lc);
141 extern int loopdev_delete(const char *device);
142 extern int loopdev_count_by_backing_file(const char *filename, char **loopdev);
143
144 /*
145 * Low-level
146 */
147 extern int loopcxt_init(struct loopdev_cxt *lc, int flags)
148 __attribute__ ((warn_unused_result));
149 extern void loopcxt_deinit(struct loopdev_cxt *lc);
150
151 extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device)
152 __attribute__ ((warn_unused_result));
153 extern int loopcxt_has_device(struct loopdev_cxt *lc);
154 extern int loopcxt_add_device(struct loopdev_cxt *lc);
155 extern char *loopcxt_strdup_device(struct loopdev_cxt *lc);
156 extern const char *loopcxt_get_device(struct loopdev_cxt *lc);
157 extern struct loop_info64 *loopcxt_get_info(struct loopdev_cxt *lc);
158
159 extern int loopcxt_get_fd(struct loopdev_cxt *lc);
160 extern int loopcxt_set_fd(struct loopdev_cxt *lc, int fd, int mode);
161
162 extern int loopcxt_init_iterator(struct loopdev_cxt *lc, int flags);
163 extern int loopcxt_deinit_iterator(struct loopdev_cxt *lc);
164 extern int loopcxt_next(struct loopdev_cxt *lc);
165
166 extern int loopcxt_setup_device(struct loopdev_cxt *lc);
167 extern int loopcxt_set_status(struct loopdev_cxt *lc);
168 extern int loopcxt_delete_device(struct loopdev_cxt *lc);
169 extern int loopcxt_set_capacity(struct loopdev_cxt *lc);
170 extern int loopcxt_set_dio(struct loopdev_cxt *lc, unsigned long use_dio);
171
172 int loopcxt_set_offset(struct loopdev_cxt *lc, uint64_t offset);
173 int loopcxt_set_sizelimit(struct loopdev_cxt *lc, uint64_t sizelimit);
174 int loopcxt_set_flags(struct loopdev_cxt *lc, uint32_t flags);
175 int loopcxt_set_backing_file(struct loopdev_cxt *lc, const char *filename);
176 int loopcxt_set_blocksize(struct loopdev_cxt *lc, uint64_t blocksize);
177
178 extern char *loopcxt_get_backing_file(struct loopdev_cxt *lc);
179 extern int loopcxt_get_backing_devno(struct loopdev_cxt *lc, dev_t *devno);
180 extern int loopcxt_get_backing_inode(struct loopdev_cxt *lc, ino_t *ino);
181 extern int loopcxt_get_offset(struct loopdev_cxt *lc, uint64_t *offset);
182 extern int loopcxt_get_blocksize(struct loopdev_cxt *lc, uint64_t *blocksize);
183 extern int loopcxt_get_sizelimit(struct loopdev_cxt *lc, uint64_t *size);
184 extern int loopcxt_get_encrypt_type(struct loopdev_cxt *lc, uint32_t *type);
185 extern const char *loopcxt_get_crypt_name(struct loopdev_cxt *lc);
186 extern int loopcxt_is_autoclear(struct loopdev_cxt *lc);
187 extern int loopcxt_is_readonly(struct loopdev_cxt *lc);
188 extern int loopcxt_is_dio(struct loopdev_cxt *lc);
189 extern int loopcxt_is_partscan(struct loopdev_cxt *lc);
190 extern int loopcxt_find_by_backing_file(struct loopdev_cxt *lc,
191 const char *filename,
192 uint64_t offset, uint64_t sizelimit,
193 int flags);
194 extern int loopcxt_find_overlap(struct loopdev_cxt *lc,
195 const char *filename,
196 uint64_t offset, uint64_t sizelimit);
197
198 extern int loopcxt_is_used(struct loopdev_cxt *lc,
199 struct stat *st,
200 const char *backing_file,
201 uint64_t offset,
202 uint64_t sizelimit,
203 int flags);
204
205 #endif /* UTIL_LINUX_LOOPDEV_H */