| #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; |
| } |