Hi Yuriy, On Fri, 05 Jun 2009 03:25:06 +0400, Yuriy Kaminskiy wrote: > Hello! > Most filesystems (in particular - reiserfs, jfs, xfs, nfs); maybe, > some legacy installation of ext2/3 too) always return dirent->dt_type = > DT_UNKNOWN, so libsensors fails to parse /etc/sensors.d. > Also, symlink (DT_LNK) can point to directory, or FIFO/socket/device > (very bad!) - current check insufficient anyways. > I've attached [somewhat hackerish] patch to solve both problem. > === cut !man 3 readdir === > Currently, only some file systems (among them: ext2, etx3, and ext4) > have full support returning the file type in d_type. All applications > must properly handle a return of DT_UNKNOWN. > === cut === Thanks for reporting, I had totally missed the fact that not all filesystems implemented this interface. > Maybe, it would be better to remove dt_type check and use stat() always. Yes, I think so. I don't much like the complexity of your proposed solution. The problem is simple, it should have a simple solution. Performance isn't critical for this part of the code, what matters is robustness and readability. What about the simplified version below? Index: lib/init.c =================================================================== --- lib/init.c (r?vision 5729) +++ lib/init.c (copie de travail) @@ -23,12 +23,14 @@ #define _BSD_SOURCE #include <sys/types.h> +#include <sys/stat.h> #include <locale.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <dirent.h> +#include <unistd.h> #include "sensors.h" #include "data.h" #include "error.h" @@ -120,8 +122,7 @@ static int config_file_filter(const struct dirent *entry) { - return (entry->d_type == DT_REG || entry->d_type == DT_LNK) - && entry->d_name[0] != '.'; /* Skip hidden files */ + return entry->d_name[0] != '.'; /* Skip hidden files */ } static int add_config_from_dir(const char *dir) @@ -143,6 +144,7 @@ int len; char path[PATH_MAX]; FILE *input; + struct stat st; len = snprintf(path, sizeof(path), "%s/%s", dir, namelist[i]->d_name); @@ -151,6 +153,10 @@ continue; } + /* Only accept regular files */ + if (stat(path, &st) < 0 || !S_ISREG(st.st_mode)) + continue; + input = fopen(path, "r"); if (input) { res = parse_config(input, path); -- Jean Delvare