Eric Blake
2014-10-09 14:31:42 UTC
* fhandler_proc.cc (fhandler_proc::readdir): Set dirent d_type.
* fhandler_process.cc (fhandler_process::readdir): Ditto.
* fhandler_procnet.cc (fhandler_procnet::readdir): Ditto.
* fhandler_procsys.cc (fhandler_procsys::readdir): Ditto.
* fhandler_procsysvipc.cc (fhandler_procsysvipc::readdir): Ditto.
* fhandler_virtual.h (virt_ftype_to_dtype): Define new inline function
to generate dirent d_type from virtual_ftype_t.
@@ -357,10 +358,17 @@
res = ENMFILE;
else
{
+ struct stat st;
+ char *file = tp.c_get ();
+
sys_wcstombs (de->d_name, NAME_MAX + 1, f.dbi.ObjectName.Buffer,
f.dbi.ObjectName.Length / sizeof (WCHAR));
de->d_ino = hash_path_name (get_ino (), de->d_name);
- de->d_type = 0;
+ stpcpy (stpcpy (stpcpy (file, get_name ()), "/"), de->d_name);
+ if (!lstat64 (file, &st))
+ de->d_type = IFTODT (st.st_mode);
+ else
+ de->d_type = DT_UNKNOWN;
The whole point of d_type is for optimization, to tell a process when it* fhandler_process.cc (fhandler_process::readdir): Ditto.
* fhandler_procnet.cc (fhandler_procnet::readdir): Ditto.
* fhandler_procsys.cc (fhandler_procsys::readdir): Ditto.
* fhandler_procsysvipc.cc (fhandler_procsysvipc::readdir): Ditto.
* fhandler_virtual.h (virt_ftype_to_dtype): Define new inline function
to generate dirent d_type from virtual_ftype_t.
@@ -357,10 +358,17 @@
res = ENMFILE;
else
{
+ struct stat st;
+ char *file = tp.c_get ();
+
sys_wcstombs (de->d_name, NAME_MAX + 1, f.dbi.ObjectName.Buffer,
f.dbi.ObjectName.Length / sizeof (WCHAR));
de->d_ino = hash_path_name (get_ino (), de->d_name);
- de->d_type = 0;
+ stpcpy (stpcpy (stpcpy (file, get_name ()), "/"), de->d_name);
+ if (!lstat64 (file, &st))
+ de->d_type = IFTODT (st.st_mode);
+ else
+ de->d_type = DT_UNKNOWN;
can avoid the overhead of an lstat() because the system was able to
obtain the information in a cheaper manner. But if you have to resort
to an lstat() to get the information, then you are wasting cycles on the
case of a user that doesn't care about d_type. I'd rather we always
return DT_UNKNOWN if the only way we'd get a better type is by calling
lstat().
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org