/* Check for corner case: readlink of too-long name. #notarget: cris*-*-elf */ #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <stdarg.h> void bye (const char *s, int i) { fprintf (stderr, "%s: %d\n", s, i); fflush (NULL); abort (); } int main (int argc, char *argv[]) { char *buf; char buf2[1024]; int max, i; /* We assume this limit is what we see in the simulator as well. */ #ifdef PATH_MAX max = PATH_MAX; #else max = pathconf (argv[0], _PC_PATH_MAX); #endif max *= 10; if (max <= 0) bye ("path_max", max); if ((buf = malloc (max + 1)) == NULL) bye ("malloc", 0); strcat (buf, argv[0]); if (rindex (buf, '/') == NULL) strcat (buf, "./"); for (i = rindex (buf, '/') - buf + 1; i < max; i++) buf[i] = 'a'; buf [i] = 0; i = readlink (buf, buf2, sizeof (buf2) - 1); if (i != -1) bye ("i", i); if (errno != ENAMETOOLONG) { perror (buf); bye ("errno", errno); } printf ("pass\n"); exit (0); } |