1 /*
2 * Copyright (c) 2007 Bret S. Lambert <blambert@gsipt.net>
3 *
4 * Public domain.
5 */
6
7 #include <libgen.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <limits.h>
11 #include <errno.h>
12
13 int
main(void)14 main(void)
15 {
16 char path[2 * PATH_MAX];
17 const char *dir = "junk/";
18 const char *fname = "file.name.ext";
19 char *str;
20 int i;
21
22 /* Test normal functioning */
23 strlcpy(path, "/", sizeof(path));
24 strlcat(path, dir, sizeof(path));
25 strlcat(path, fname, sizeof(path));
26 str = basename(path);
27 if (strcmp(str, fname) != 0)
28 goto fail;
29
30 /*
31 * There are four states that require special handling:
32 *
33 * 1) path is NULL
34 * 2) path is the empty string
35 * 3) path is composed entirely of slashes
36 * 4) the resulting name is larger than PATH_MAX
37 *
38 * The first two cases require that a pointer
39 * to the string "." be returned.
40 *
41 * The third case requires that a pointer
42 * to the string "/" be returned.
43 *
44 * The final case requires that NULL be returned
45 * and errno * be set to ENAMETOOLONG.
46 */
47 /* Case 1 */
48 str = basename(NULL);
49 if (strcmp(str, ".") != 0)
50 goto fail;
51
52 /* Case 2 */
53 strlcpy(path, "", sizeof(path));
54 str = basename(path);
55 if (strcmp(str, ".") != 0)
56 goto fail;
57
58 /* Case 3 */
59 for (i = 0; i < PATH_MAX - 1; i++)
60 strlcat(path, "/", sizeof(path)); /* path cleared above */
61 str = basename(path);
62 if (strcmp(str, "/") != 0)
63 goto fail;
64
65 /* Case 4 */
66 strlcpy(path, "/", sizeof(path));
67 strlcat(path, dir, sizeof(path));
68 for (i = 0; i <= PATH_MAX; i += sizeof(fname))
69 strlcat(path, fname, sizeof(path));
70 str = basename(path);
71 if (str != NULL || errno != ENAMETOOLONG)
72 goto fail;
73
74 return (0);
75 fail:
76 return (1);
77 }
78