mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	2004-10-01 Ulrich Drepper <drepper@redhat.com> * posix/bug-glob1.c (prepare): Fix creation of symlink.
		
			
				
	
	
		
			89 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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;
 | |
| }
 |