mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 00:13:36 +08:00
cb984ef2a2
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;
|
|
}
|