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