| /* 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; | 
 | } |