| #include <errno.h> | 
 | #include <libgen.h> | 
 | #undef basename | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 | #include <unistd.h> | 
 | #include <sys/stat.h> | 
 |  | 
 |  | 
 | static void prepare (int argc, char *argv[]); | 
 | static int do_test (void); | 
 | #define PREPARE(argc, argv) prepare (argc, argv) | 
 | #define TEST_FUNCTION do_test () | 
 | #include "../test-skeleton.c" | 
 |  | 
 |  | 
 | static char *copy; | 
 |  | 
 | static void | 
 | prepare (int argc, char *argv[]) | 
 | { | 
 |   char *buf; | 
 |   int off; | 
 |   asprintf (&buf, "cp %s %n%s-copy", argv[0], &off, argv[0]); | 
 |   if (buf == NULL) | 
 |     { | 
 |       puts ("asprintf  failed"); | 
 |       exit (1); | 
 |     } | 
 |   if (system (buf) != 0) | 
 |     { | 
 |       puts ("system  failed"); | 
 |       exit (1); | 
 |     } | 
 |  | 
 |   /* Make it not executable.  */ | 
 |   copy = buf + off; | 
 |   if (chmod (copy, 0666) != 0) | 
 |     { | 
 |       puts ("chmod  failed"); | 
 |       exit (1); | 
 |     } | 
 |  | 
 |   add_temp_file (copy); | 
 | } | 
 |  | 
 |  | 
 | static int | 
 | do_test (void) | 
 | { | 
 |   /* Make sure we do not find a binary with the name we are going to | 
 |      use.  */ | 
 |   char *bindir = strdupa (copy); | 
 |   bindir = canonicalize_file_name (dirname (bindir)); | 
 |   if (bindir == NULL) | 
 |     { | 
 |       puts ("canonicalize_file_name failed"); | 
 |       return 1; | 
 |     } | 
 |   char *path; | 
 |   asprintf (&path, "%s:../libio:../elf", bindir); | 
 |   if (path == NULL) | 
 |     { | 
 |       puts ("asprintf  failed"); | 
 |       return 1; | 
 |     } | 
 |  | 
 |   setenv ("PATH", path, 1); | 
 |  | 
 |   char *argv[] = { basename (copy), NULL }; | 
 |   errno = 0; | 
 |   execvp (argv[0], argv); | 
 |  | 
 |   if (errno != EACCES) | 
 |     { | 
 |       printf ("errno = %d (%m), expected EACCES\n", errno); | 
 |       return 1; | 
 |     } | 
 |  | 
 |   return 0; | 
 | } |