oslib/getopt_long: allow (unique) short match
[fio.git] / oslib / linux-dev-lookup.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <dirent.h>
4 #include <string.h>
5 #include <stdio.h>
6 #include <unistd.h>
7
8 #include "../os/os.h"
9
10 int blktrace_lookup_device(const char *redirect, char *path, unsigned int maj,
11                            unsigned int min)
12 {
13         struct dirent *dir;
14         struct stat st;
15         int found = 0;
16         DIR *D;
17
18         D = opendir(path);
19         if (!D)
20                 return 0;
21
22         while ((dir = readdir(D)) != NULL) {
23                 char full_path[256];
24
25                 if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
26                         continue;
27
28                 sprintf(full_path, "%s%s%s", path, FIO_OS_PATH_SEPARATOR, dir->d_name);
29                 if (lstat(full_path, &st) == -1) {
30                         perror("lstat");
31                         break;
32                 }
33
34                 if (S_ISDIR(st.st_mode)) {
35                         found = blktrace_lookup_device(redirect, full_path,
36                                                                 maj, min);
37                         if (found) {
38                                 strcpy(path, full_path);
39                                 break;
40                         }
41                 }
42
43                 if (!S_ISBLK(st.st_mode))
44                         continue;
45
46                 /*
47                  * If replay_redirect is set then always return this device
48                  * upon lookup which overrides the device lookup based on
49                  * major minor in the actual blktrace
50                  */
51                 if (redirect) {
52                         strcpy(path, redirect);
53                         found = 1;
54                         break;
55                 }
56
57                 if (maj == major(st.st_rdev) && min == minor(st.st_rdev)) {
58                         strcpy(path, full_path);
59                         found = 1;
60                         break;
61                 }
62         }
63
64         closedir(D);
65         return found;
66 }