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 "linux-dev-lookup.h" 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 28 sprintf(full_path, "%s/%s", path, 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} 67