]>
Commit | Line | Data |
---|---|---|
558d2836 A |
1 | #include <glob.h> |
2 | #include <sys/fcntl.h> | |
3 | #include <sys/stat.h> | |
4 | #include <unistd.h> | |
5 | #include <spawn.h> | |
6 | ||
7 | #include "hfs-tests.h" | |
8 | #include "test-utils.h" | |
9 | #include "disk-image.h" | |
10 | ||
11 | TEST(unicode_file_names) | |
12 | ||
13 | static disk_image_t *di; | |
14 | ||
15 | int run_unicode_file_names(__unused test_ctx_t *ctx) | |
16 | { | |
17 | di = disk_image_get(); | |
18 | char *dir; | |
19 | ||
20 | asprintf(&dir, "%s/unicode-file-names", di->mount_point); | |
21 | ||
22 | pid_t pid; | |
23 | assert_no_err(posix_spawn(&pid, "/bin/rm", NULL, NULL, | |
24 | (char *[]){ "rm", "-rf", dir, NULL }, NULL)); | |
25 | int stat; | |
26 | assert_with_errno(waitpid(pid, &stat, 0) == pid); | |
27 | ||
28 | assert_no_err(mkdir(dir, 0777)); | |
29 | ||
30 | char *path; | |
31 | asprintf(&path, "%s/file-\xcd\x80\xcd\x81\xcd\x82\xcd\x83\xcd\x84\xcd\x85\xcd\x86\xcd\x87\xcd\x88\xcd\x89\xcd\x90", dir); | |
32 | ||
33 | int fd; | |
34 | assert_with_errno((fd = open(path, O_RDWR | O_CREAT, 0666)) >= 0); | |
35 | ||
36 | assert_no_err(close(fd)); | |
37 | ||
38 | /* | |
39 | * Create a hard link (so that we can force the cache to | |
40 | * be purged). | |
41 | */ | |
42 | char *path2; | |
43 | asprintf(&path2, "%s/hard-link", dir); | |
44 | assert_no_err(link(path, path2)); | |
45 | ||
46 | glob_t gl; | |
47 | ||
48 | assert_no_err(chdir(dir)); | |
49 | ||
50 | assert_no_err(glob("*", 0, NULL, &gl)); | |
51 | ||
52 | int i; | |
53 | for (i = 0; i < gl.gl_matchc; ++i) { | |
54 | if (!strncmp(gl.gl_pathv[i], "file", 4)) | |
55 | goto found; | |
56 | } | |
57 | ||
58 | assert_fail("could not find file!"); | |
59 | ||
60 | found: | |
61 | ||
62 | // Paths should be different: gl_pathv should be normalised | |
63 | assert(strcmp(gl.gl_pathv[i], path) != 0); | |
64 | ||
65 | char *path3; | |
66 | asprintf(&path3, "%s/%s", dir, gl.gl_pathv[i]); | |
67 | ||
68 | assert((fd = open(path3, O_RDONLY)) >= 0); | |
69 | ||
70 | assert_no_err(unlink(path3)); | |
ec99dd30 A |
71 | assert_no_err (close(fd)); |
72 | ||
558d2836 A |
73 | free(dir); |
74 | free(path); | |
75 | free(path2); | |
76 | free(path3); | |
77 | ||
78 | return 0; | |
79 | } |