/* * Copyright (c) 2007 Bret S. Lambert * * Public domain. */ #include #include #include #include #include #include int main(void) { char path[2 * MAXPATHLEN]; char dname[128]; const char *dir = "junk"; const char *fname = "/file.name.ext"; char *str; int i; /* Test normal functioning */ strlcpy(path, "/", sizeof(path)); strlcpy(dname, "/", sizeof(dname)); strlcat(path, dir, sizeof(path)); strlcat(dname, dir, sizeof(dname)); strlcat(path, fname, sizeof(path)); str = dirname(path); if (strcmp(str, dname) != 0) errx(1, "0: dirname(%s) = %s != %s", path, str, dname); /* * There are four states that require special handling: * * 1) path is NULL * 2) path is the empty string * 3) path is composed entirely of slashes * 4) the resulting name is larger than MAXPATHLEN * * The first two cases require that a pointer * to the string "." be returned. * * The third case requires that a pointer * to the string "/" be returned. * * The final case requires that NULL be returned * and errno * be set to ENAMETOOLONG. */ /* Case 1 */ str = dirname(NULL); if (strcmp(str, ".") != 0) errx(1, "1: dirname(NULL) = %s != .", str); /* Case 2 */ strlcpy(path, "", sizeof(path)); str = dirname(path); if (strcmp(str, ".") != 0) errx(1, "2: dirname(%s) = %s != .", path, str); /* Case 3 */ for (i = 0; i < MAXPATHLEN - 1; i++) strlcat(path, "/", sizeof(path)); /* path cleared above */ str = dirname(path); if (strcmp(str, "/") != 0) errx(1, "3: dirname(%s) = %s != /", path, str); /* Case 4 */ strlcpy(path, "/", sizeof(path)); /* reset path */ for (i = 0; i <= MAXPATHLEN; i += strlen(dir)) strlcat(path, dir, sizeof(path)); strlcat(path, fname, sizeof(path)); str = dirname(path); if (str != NULL) errx(1, "4: dirname(%s) = %s != NULL", path, str); if (errno != ENAMETOOLONG) errx(1, "4: dirname(%s) sets errno to %d", path, errno); return (0); }