diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2014-10-09 13:24:37 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2014-10-09 13:24:37 +0000 |
commit | 54338f169f98409a0efd45a323cc9f358a78ac12 (patch) | |
tree | d8698a3200918f95346a5d76dd69ce918f813d18 | |
parent | 633cf9b5dd846d6dbd5ab6102de24cf2a7c4582c (diff) | |
download | newlib-54338f169f98409a0efd45a323cc9f358a78ac12.zip newlib-54338f169f98409a0efd45a323cc9f358a78ac12.tar.gz newlib-54338f169f98409a0efd45a323cc9f358a78ac12.tar.bz2 |
* 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.
-rw-r--r-- | winsup/cygwin/ChangeLog | 10 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_proc.cc | 5 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_process.cc | 7 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_procnet.cc | 6 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_procsys.cc | 12 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_procsysvipc.cc | 4 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_virtual.h | 25 |
7 files changed, 61 insertions, 8 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a846d83..0627977 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +2014-10-09 Corinna Vinschen <corinna@vinschen.de> + + * 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. + 2014-10-08 Corinna Vinschen <corinna@vinschen.de> * common.din (ffsl): Export. diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc index 0ae6ab0..796d58d 100644 --- a/winsup/cygwin/fhandler_proc.cc +++ b/winsup/cygwin/fhandler_proc.cc @@ -254,7 +254,9 @@ fhandler_proc::readdir (DIR *dir, dirent *de) int res; if (dir->__d_position < PROC_LINK_COUNT) { - strcpy (de->d_name, proc_tab[dir->__d_position++].name); + strcpy (de->d_name, proc_tab[dir->__d_position].name); + de->d_type = virt_ftype_to_dtype (proc_tab[dir->__d_position].type); + dir->__d_position++; dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; res = 0; } @@ -267,6 +269,7 @@ fhandler_proc::readdir (DIR *dir, dirent *de) if (found++ == dir->__d_position - PROC_LINK_COUNT) { __small_sprintf (de->d_name, "%d", pids[i]->pid); + de->d_type = DT_DIR; dir->__d_position++; res = 0; break; diff --git a/winsup/cygwin/fhandler_process.cc b/winsup/cygwin/fhandler_process.cc index 077ea99..e2de05b 100644 --- a/winsup/cygwin/fhandler_process.cc +++ b/winsup/cygwin/fhandler_process.cc @@ -230,9 +230,14 @@ fhandler_process::readdir (DIR *dir, dirent *de) { int *p = (int *) filebuf; __small_sprintf (de->d_name, "%d", p[dir->__d_position++ - 2]); + de->d_type = DT_LNK; } else - strcpy (de->d_name, process_tab[dir->__d_position++].name); + { + strcpy (de->d_name, process_tab[dir->__d_position].name); + de->d_type = virt_ftype_to_dtype (process_tab[dir->__d_position].type); + dir->__d_position++; + } dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; res = 0; out: diff --git a/winsup/cygwin/fhandler_procnet.cc b/winsup/cygwin/fhandler_procnet.cc index 0ba64ae..1961fdd 100644 --- a/winsup/cygwin/fhandler_procnet.cc +++ b/winsup/cygwin/fhandler_procnet.cc @@ -1,6 +1,6 @@ /* fhandler_procnet.cc: fhandler for /proc/net virtual filesystem - Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc. + Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc. This file is part of Cygwin. @@ -115,7 +115,9 @@ fhandler_procnet::readdir (DIR *dir, dirent *de) if (procnet_tab[dir->__d_position].type == virt_file && !get_adapters_addresses (NULL, AF_INET6)) goto out; - strcpy (de->d_name, procnet_tab[dir->__d_position++].name); + strcpy (de->d_name, procnet_tab[dir->__d_position].name); + de->d_type = virt_ftype_to_dtype (procnet_tab[dir->__d_position].type); + dir->__d_position++; dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; res = 0; out: diff --git a/winsup/cygwin/fhandler_procsys.cc b/winsup/cygwin/fhandler_procsys.cc index 759712f..98fa9e2 100644 --- a/winsup/cygwin/fhandler_procsys.cc +++ b/winsup/cygwin/fhandler_procsys.cc @@ -1,6 +1,6 @@ /* fhandler_procsys.cc: fhandler for native NT namespace. - Copyright 2010, 2011, 2012, 2013 Red Hat, Inc. + Copyright 2010, 2011, 2012, 2013, 2014 Red Hat, Inc. This file is part of Cygwin. @@ -346,6 +346,7 @@ fhandler_procsys::readdir (DIR *dir, dirent *de) WCHAR buf[2][NAME_MAX + 1]; } f; int res = EBADF; + tmp_pathbuf tp; if (dir->__handle != INVALID_HANDLE_VALUE) { @@ -357,10 +358,17 @@ fhandler_procsys::readdir (DIR *dir, dirent *de) 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; res = 0; } } diff --git a/winsup/cygwin/fhandler_procsysvipc.cc b/winsup/cygwin/fhandler_procsysvipc.cc index 1c0ea28..bd1eee0 100644 --- a/winsup/cygwin/fhandler_procsysvipc.cc +++ b/winsup/cygwin/fhandler_procsysvipc.cc @@ -125,7 +125,9 @@ fhandler_procsysvipc::readdir (DIR *dir, dirent *de) if (cygserver_running != CYGSERVER_OK) goto out; } - strcpy (de->d_name, procsysvipc_tab[dir->__d_position++].name); + strcpy (de->d_name, procsysvipc_tab[dir->__d_position].name); + de->d_type = virt_ftype_to_dtype (procsysvipc_tab[dir->__d_position].type); + dir->__d_position++; dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; res = 0; out: diff --git a/winsup/cygwin/fhandler_virtual.h b/winsup/cygwin/fhandler_virtual.h index 9747dd2..f92c06b 100644 --- a/winsup/cygwin/fhandler_virtual.h +++ b/winsup/cygwin/fhandler_virtual.h @@ -1,6 +1,6 @@ /* fhandler_virtual.h: Header for virtual fhandlers - Copyright 2009, 2010, 2011 Red Hat, Inc. + Copyright 2009, 2010, 2011, 2014 Red Hat, Inc. This file is part of Cygwin. @@ -20,3 +20,26 @@ struct virt_tab_t { extern virt_tab_t *virt_tab_search (const char *, bool, const virt_tab_t *, size_t); + +static inline unsigned char +virt_ftype_to_dtype (virtual_ftype_t type) +{ + unsigned char d_type; + + switch (type) + { + case virt_directory: + d_type = DT_DIR; + break; + case virt_symlink: + d_type = DT_LNK; + break; + case virt_file: + d_type = DT_REG; + break; + default: + d_type = DT_UNKNOWN; + break; + } + return d_type; +} |