Make oslib/linux-dev-lookup.c a stand-alone library
[fio.git] / oslib / linux-dev-lookup.c
CommitLineData
40bafa33
JA
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
10c37df1 8#include "linux-dev-lookup.h"
40bafa33
JA
9
10int 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
22497370 28 sprintf(full_path, "%s/%s", path, dir->d_name);
40bafa33
JA
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}