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

[Xen-changelog] [xen master] libxl: replace deprecated readdir_r() with readdir()



commit b9daff9d811285f1e40669bc621c2241793f7a95
Author:     Chris Patterson <pattersonc@xxxxxxxxxxxx>
AuthorDate: Fri Jun 3 12:50:09 2016 -0400
Commit:     Wei Liu <wei.liu2@xxxxxxxxxx>
CommitDate: Fri Jun 3 18:11:48 2016 +0100

    libxl: replace deprecated readdir_r() with readdir()
    
    Replace the usage of readdir_r() with readdir() to address a
    compilation error under glibc due to the deprecation of readdir_r
    for their next release (2.24) [1, 2].
    
    Remove code specific to usage of readdir_r which is no longer required,
    such as zalloc_dirent().
    
    --
    
    From the GNU libc manual [3]:
    "
     It is expected that future versions of POSIX will obsolete readdir_r and
     mandate the level of thread safety for readdir which is provided by the
     GNU C Library and other implementations today.
    "
    
    There is a filed bug in the Austin Group Defect Tracker [4]  in which 
'dalias'
    proposes (in comment 0001632) that:
    "
       I would like to propose an alternate solution. For readdir, replace the 
text:
        "The readdir() function need not be thread-safe."
       with:
        "If multiple threads call the readdir() function with the same directory
        stream argument and without synchronization to preclude simultaneous
        access, then the behavior is undefined."
    
       With this change, the clunky readdir_r function is no longer needed or
       useful, and should probably be deprecated. As the only reasonable way
       to meet the implementation requirements for readdir is to have the dirent
       buffer in the DIR structure, this change should not require any change to
       existing implementations.
    "
    
    [1] https://sourceware.org/ml/libc-alpha/2016-02/msg00093.html
    [2] https://sourceware.org/bugzilla/show_bug.cgi?id=19056
    [3] 
https://www.gnu.org/software/libc/manual/html_node/Reading_002fClosing-Directory.html
    [4] http://austingroupbugs.net/view.php?id=696
    
    Signed-off-by: Chris Patterson <pattersonc@xxxxxxxxxxxx>
    Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
    Release-acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/libxl/libxl_pvusb.c | 24 ++++++------------------
 tools/libxl/libxl_utils.c |  8 +++-----
 2 files changed, 9 insertions(+), 23 deletions(-)

diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c
index 58cf21c..885f0d4 100644
--- a/tools/libxl/libxl_pvusb.c
+++ b/tools/libxl/libxl_pvusb.c
@@ -501,19 +501,10 @@ int libxl_devid_to_device_usbctrl(libxl_ctx *ctx,
     return rc;
 }
 
-static void *zalloc_dirent(libxl__gc *gc, const char *dirpath)
-{
-    size_t need = offsetof(struct dirent, d_name) +
-                  pathconf(dirpath, _PC_NAME_MAX) + 1;
-
-    return libxl__zalloc(gc, need);
-}
-
 static char *usbdev_busaddr_to_busid(libxl__gc *gc, int bus, int addr)
 {
     DIR *dir;
     char *busid = NULL;
-    struct dirent *de_buf;
     struct dirent *de;
 
     /* invalid hostbus or hostaddr */
@@ -526,16 +517,15 @@ static char *usbdev_busaddr_to_busid(libxl__gc *gc, int 
bus, int addr)
         return NULL;
     }
 
-    de_buf = zalloc_dirent(gc, SYSFS_USB_DEV);
-
     for (;;) {
         char *filename;
         void *buf;
         int busnum = -1;
         int devnum = -1;
 
-        int r = readdir_r(dir, de_buf, &de);
-        if (r) {
+        errno = 0;
+        de = readdir(dir);
+        if (!de && errno) {
             LOGE(ERROR, "failed to readdir %s", SYSFS_USB_DEV);
             break;
         }
@@ -1152,7 +1142,6 @@ static int usbdev_get_all_interfaces(libxl__gc *gc, const 
char *busid,
 {
     DIR *dir;
     char *buf;
-    struct dirent *de_buf;
     struct dirent *de;
     int rc;
 
@@ -1167,12 +1156,11 @@ static int usbdev_get_all_interfaces(libxl__gc *gc, 
const char *busid,
         return ERROR_FAIL;
     }
 
-    de_buf = zalloc_dirent(gc, SYSFS_USB_DEV);
-
     for (;;) {
-        int r = readdir_r(dir, de_buf, &de);
+        errno = 0;
+        de = readdir(dir);
 
-        if (r) {
+        if (!de && errno) {
             LOGE(ERROR, "failed to readdir %s", SYSFS_USB_DEV);
             rc = ERROR_FAIL;
             goto out;
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index ceb8825..4ca6bcb 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -548,14 +548,12 @@ int libxl__remove_directory(libxl__gc *gc, const char 
*dirpath)
         goto out;
     }
 
-    size_t need = offsetof(struct dirent, d_name) +
-        pathconf(dirpath, _PC_NAME_MAX) + 1;
-    struct dirent *de_buf = libxl__zalloc(gc, need);
     struct dirent *de;
 
     for (;;) {
-        int r = readdir_r(d, de_buf, &de);
-        if (r) {
+        errno = 0;
+        de = readdir(d);
+        if (!de && errno) {
             LOGE(ERROR, "failed to readdir %s for removal", dirpath);
             rc = ERROR_FAIL;
             break;
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.