removed need for scandir in client.c
authorAndrew Tridgell <tridge@samba.org>
Mon, 7 May 2001 05:19:52 +0000 (05:19 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 7 May 2001 05:19:52 +0000 (05:19 +0000)
fixed possible bug with readdirname on systems with NAMELEN != strlen
(This used to be commit 78f448b7d4b83f569d27e0abf6b1759c43ff21f3)

source3/client/client.c
source3/lib/util.c

index a8f11fc659b92c78f542a5c95f72227518cf3be9..4969156f08364469f2503b3af8673b9a55434bbf 100644 (file)
@@ -1170,38 +1170,29 @@ static void cmd_select(void)
        next_token(NULL,fileselection,NULL,sizeof(fileselection));
 }
 
-
 /****************************************************************************
   Recursive file matching function act as find
   match must be always set to True when calling this function
 ****************************************************************************/
-  
 static int file_find(struct file_list **list, const char *directory, 
                      const char *expression, BOOL match)
 {
-        struct dirent **namelist;
+       DIR *dir;
        struct file_list *entry;
         struct stat statbuf;
-        int n, ret;
+        int ret;
         char *path;
        BOOL isdir;
+       char *dname;
 
-        n = scandir(directory,  &namelist, 0, alphasort);
-       if (n == -1) return -1;
+        dir = opendir(directory);
+       if (!dir) return -1;
        
-        while (n--) {
-               int len = NAMLEN(namelist[n]);
-               char *dname = malloc(len+1);
-               if (!dname) continue;
-
-               memcpy(dname, namelist[n]->d_name, len);
-               dname[len] = 0;
-               
+        while ((dname = readdirname(dir))) {
                if (!strcmp("..", dname)) continue;
                if (!strcmp(".", dname)) continue;
                
                if (asprintf(&path, "%s/%s", directory, dname) <= 0) {
-                       free(dname);
                        continue;
                }
 
@@ -1209,7 +1200,7 @@ static int file_find(struct file_list **list, const char *directory,
                if (!match || !ms_fnmatch(expression, dname)) {
                        if (recurse) {
                                ret = stat(path, &statbuf);
-                               if (!ret) {
+                               if (ret == 0) {
                                        if (S_ISDIR(statbuf.st_mode)) {
                                                isdir = True;
                                                ret = file_find(list, path, expression, False);
@@ -1218,16 +1209,17 @@ static int file_find(struct file_list **list, const char *directory,
                                        DEBUG(0,("file_find: cannot stat file %s\n", path));
                                }
                                
-                               if (ret) {
+                               if (ret == -1) {
                                        free(path);
-                                       free(dname);
-                                       return ret;
+                                       closedir(dir);
+                                       return -1;
                                }
                        }
                        entry = (struct file_list *) malloc(sizeof (struct file_list));
                        if (!entry) {
                                DEBUG(0,("Out of memory in file_find\n"));
-                               return -4;
+                               closedir(dir);
+                               return -1;
                        }
                        entry->file_path = path;
                        entry->isdir = isdir;
@@ -1235,8 +1227,9 @@ static int file_find(struct file_list **list, const char *directory,
                } else {
                        free(path);
                }
-               free(dname);
         }
+
+       closedir(dir);
        return 0;
 }
 
index 3bee53abbcca39bf49a1e147b792fb908c7e18d1..b3eef430f1199e6d0dd56bca8a6032bf1882c94b 100644 (file)
@@ -1187,7 +1187,9 @@ char *readdirname(DIR *p)
 
        {
                static pstring buf;
-               memcpy(buf, dname, NAMLEN(ptr)+1);
+               int len = NAMLEN(ptr);
+               memcpy(buf, dname, len);
+               buf[len] = 0;
                dname = buf;
        }