I got this code from this post
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
void main()
{
char* folder="/dev/input"; //folder to open
DIR* dir_p;
struct dirent* dir_element;
struct stat file_info;
// open directory
dir_p=opendir(folder);
// show some info for each file in given directory
while(dir_element = readdir(dir_p)) {
lstat(dir_element->d_name, &file_info); //getting a file stats
puts(dir_element->d_name); // show current filename
printf("file mode: %d\n", file_info.st_mode);
// print what kind of file we are dealing with
if (file_info.st_mode == S_IFDIR) puts("|| directory");
if (file_info.st_mode == S_IFREG) puts("|| regular file");
if (file_info.st_mode == S_IFLNK) puts("|| symbolic link");
if (S_ISCHR(file_info.st_mode)) puts("|| character file");
}
}
I modified it a little bit so that it prints if files in /dev/input are character files or not. But when I run this(even with sudo) it only prints the file name, file mode and nothing else.
First,
file_info.st_modeare bit-fields, so you should check if individual bits are set with the&operator.That is,
However, using
S_ISXXXmacros is more explicit as you did for the last one.Second,
dir_element->d_namecontains only the basename of the path. Hence, you should prependfolderto it before feeding it intolstat. If you have checked the return value oflstat, you could have known that it didn't succeed. So you can do something like