|  | /* Test case for globbing dangling symlink.  By Ulrich Drepper.  */ | 
|  | #include <errno.h> | 
|  | #include <error.h> | 
|  | #include <glob.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  |  | 
|  | static void prepare (int argc, char *argv[]); | 
|  | #define PREPARE prepare | 
|  | static int do_test (void); | 
|  | #define TEST_FUNCTION do_test () | 
|  |  | 
|  | #include "../test-skeleton.c" | 
|  |  | 
|  |  | 
|  | static char *fname; | 
|  |  | 
|  | static void | 
|  | prepare (int argc, char *argv[]) | 
|  | { | 
|  | if (argc < 2) | 
|  | error (EXIT_FAILURE, 0, "missing argument"); | 
|  |  | 
|  | size_t len = strlen (argv[1]); | 
|  | static const char ext[] = "globXXXXXX"; | 
|  | fname = malloc (len + sizeof (ext)); | 
|  | if (fname == NULL) | 
|  | error (EXIT_FAILURE, errno, "cannot create temp file"); | 
|  | again: | 
|  | strcpy (stpcpy (fname, argv[1]), ext); | 
|  | fname = mktemp (fname); | 
|  | if (fname == NULL || *fname == '\0') | 
|  | error (EXIT_FAILURE, errno, "cannot create temp file name"); | 
|  | if (symlink ("bug-glob1-does-not-exist", fname) != 0) | 
|  | { | 
|  | if (errno == EEXIST) | 
|  | goto again; | 
|  |  | 
|  | error (EXIT_FAILURE, errno, "cannot create symlink"); | 
|  | } | 
|  | add_temp_file (fname); | 
|  | } | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | glob_t gl; | 
|  | int retval = 0; | 
|  | int e; | 
|  |  | 
|  | e = glob (fname, 0, NULL, &gl); | 
|  | if (e == 0) | 
|  | { | 
|  | printf ("glob(\"%s\") succeeded\n", fname); | 
|  | retval = 1; | 
|  | } | 
|  | globfree (&gl); | 
|  |  | 
|  | size_t fnamelen = strlen (fname); | 
|  | char buf[fnamelen + 2]; | 
|  |  | 
|  | strcpy (buf, fname); | 
|  | buf[fnamelen - 1] = '?'; | 
|  | e = glob (buf, 0, NULL, &gl); | 
|  | if (e == 0) | 
|  | { | 
|  | printf ("glob(\"%s\") succeeded\n", buf); | 
|  | retval = 1; | 
|  | } | 
|  | globfree (&gl); | 
|  |  | 
|  | strcpy (buf, fname); | 
|  | buf[fnamelen] = '*'; | 
|  | buf[fnamelen + 1] = '\0'; | 
|  | e = glob (buf, 0, NULL, &gl); | 
|  | if (e == 0) | 
|  | { | 
|  | printf ("glob(\"%s\") succeeded\n", buf); | 
|  | retval = 1; | 
|  | } | 
|  | globfree (&gl); | 
|  |  | 
|  | return retval; | 
|  | } |