(linenum→info "unix/slp.c:2238")

glibc/2.7/posix/bug-glob1.c

    1: /* Test case for globbing dangling symlink.  By Ulrich Drepper.  */
    2: #include <errno.h>
    3: #include <error.h>
    4: #include <glob.h>
    5: #include <stdio.h>
    6: #include <stdlib.h>
    7: #include <string.h>
    8: #include <unistd.h>
    9: 
   10: 
   11: static void prepare (int argc, char *argv[]);
   12: #define PREPARE prepare
   13: static int do_test (void);
   14: #define TEST_FUNCTION do_test ()
   15: 
   16: #include "../test-skeleton.c"
   17: 
   18: 
   19: static char *fname;
   20: 
   21: static void
   22: prepare (int argc, char *argv[])
   23: {
   24:   if (argc < 2)
   25:     error (EXIT_FAILURE, 0, "missing argument");
   26: 
   27:   size_t len = strlen (argv[1]);
   28:   static const char ext[] = "globXXXXXX";
   29:   fname = malloc (len + sizeof (ext));
   30:   if (fname == NULL)
   31:     error (EXIT_FAILURE, errno, "cannot create temp file");
   32:  again:
   33:   strcpy (stpcpy (fname, argv[1]), ext);
   34:   fname = mktemp (fname);
   35:   if (fname == NULL || *fname == '\0')
   36:     error (EXIT_FAILURE, errno, "cannot create temp file name");
   37:   if (symlink ("bug-glob1-does-not-exist", fname) != 0)
   38:     {
   39:       if (errno == EEXIST)
   40:         goto again;
   41: 
   42:       error (EXIT_FAILURE, errno, "cannot create symlink");
   43:     }
   44:   add_temp_file (fname);
   45: }
   46: 
   47: 
   48: static int
   49: do_test (void)
   50: {
   51:   glob_t gl;
   52:   int retval = 0;
   53:   int e;
   54: 
   55:   e = glob (fname, 0, NULL, &gl);
   56:   if (e == 0)
   57:     {
   58:       printf ("glob(\"%s\") succeeded\n", fname);
   59:       retval = 1;
   60:     }
   61:   globfree (&gl);
   62: 
   63:   size_t fnamelen = strlen (fname);
   64:   char buf[fnamelen + 2];
   65: 
   66:   strcpy (buf, fname);
   67:   buf[fnamelen - 1] = '?';
   68:   e = glob (buf, 0, NULL, &gl);
   69:   if (e == 0)
   70:     {
   71:       printf ("glob(\"%s\") succeeded\n", buf);
   72:       retval = 1;
   73:     }
   74:   globfree (&gl);
   75: 
   76:   strcpy (buf, fname);
   77:   buf[fnamelen] = '*';
   78:   buf[fnamelen + 1] = '\0';
   79:   e = glob (buf, 0, NULL, &gl);
   80:   if (e == 0)
   81:     {
   82:       printf ("glob(\"%s\") succeeded\n", buf);
   83:       retval = 1;
   84:     }
   85:   globfree (&gl);
   86: 
   87:   return retval;
   88: }
Syntax (Markdown)