| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | /* 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 preparestatic int do_test (void);#define TEST_FUNCTION do_test ()#include "../test-skeleton.c"static char *fname;static voidprepare (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);*/  close(mkstemp(fname));  unlink(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 intdo_test (void){  glob_t gl;  int retval = 0;  int e;  e = glob (fname, 0, NULL, &gl);  if (e == 0)    {      printf ("glob(\"%s\") succeeded when it should not have\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 when it should not have\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 when it should not have\n", buf);      retval = 1;    }  globfree (&gl);  return retval;}
 |