]>
Commit | Line | Data |
---|---|---|
558d2836 A |
1 | #include <errno.h> |
2 | #include <fcntl.h> | |
3 | #include <unistd.h> | |
4 | #include <sys/stat.h> | |
5 | #include <sys/ioctl.h> | |
6 | #include <libgen.h> | |
7 | ||
8 | #include "hfs-tests.h" | |
9 | #include "test-utils.h" | |
10 | #include "disk-image.h" | |
11 | ||
12 | TEST(access) | |
13 | ||
14 | struct ext_access_t { | |
15 | uint32_t flags; /* IN: access requested (i.e. R_OK) */ | |
16 | uint32_t num_files; /* IN: number of files to process */ | |
17 | uint32_t map_size; /* IN: size of the bit map */ | |
18 | uint32_t *file_ids; /* IN: Array of file ids */ | |
19 | char *bitmap; /* OUT: hash-bitmap of interesting directory ids */ | |
20 | short *access; /* OUT: access info for each file (0 for 'has access') */ | |
21 | uint32_t num_parents; /* future use */ | |
22 | uint32_t *parents; /* future use */ | |
23 | }; | |
24 | ||
25 | int run_access(__unused test_ctx_t *ctx) | |
26 | { | |
27 | disk_image_t *di = disk_image_get(); | |
28 | ||
29 | char *path; | |
30 | asprintf(&path, "%s/acces_check.data", di->mount_point); | |
31 | ||
32 | int fd; | |
33 | assert_with_errno((fd = open(path, O_RDWR | O_CREAT, 0666)) >= 0); | |
34 | ||
35 | struct stat sb; | |
36 | assert_no_err(fstat(fd, &sb)); | |
37 | ||
38 | assert_no_err(unlink(path)); | |
39 | ||
40 | char dir_map[1 << 16] = { 0 }; | |
41 | short access_vector[1024] = { 0 }; | |
42 | ||
43 | struct ext_access_t params = { | |
44 | .flags = R_OK, | |
45 | .num_files = 1, | |
46 | .map_size = sizeof(dir_map), | |
47 | .file_ids = (uint32_t[]){ (uint32_t)sb.st_ino }, | |
48 | .bitmap = dir_map, | |
49 | .access = access_vector, | |
50 | }; | |
51 | ||
52 | #define HFSIOC_EXT_BULKACCESS _IOW('h', 15, struct ext_access_t) | |
53 | ||
54 | char *base_path = strdup(path); | |
55 | base_path = dirname(base_path); | |
56 | assert_no_err(fsctl(base_path, HFSIOC_EXT_BULKACCESS, ¶ms, 0)); | |
57 | ||
58 | if (access_vector[0] != ENOENT) | |
59 | assert_fail("access_vector[0] != ENOENT (== %u)!", access_vector[0]); | |
60 | ||
61 | free(path); | |
62 | ||
63 | return 0; | |
64 | } |