[PATCH] bug in sensors.d reading: not all filesystems can return dt_type != DT_UNKNOWN

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux