diff options
author | Andrew Tridgell <tridge@samba.org> | 2001-05-07 05:19:52 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2001-05-07 05:19:52 +0000 |
commit | 9d5348c7587507796cdc448a89b953cf877226a3 (patch) | |
tree | e364c1dcae1b2731fcee1006bd1ba3f77ea0116d /source3/client | |
parent | 34417b19f8501b556b4f80c5c391e2633c2a8997 (diff) | |
download | samba-9d5348c7587507796cdc448a89b953cf877226a3.tar.gz samba-9d5348c7587507796cdc448a89b953cf877226a3.tar.bz2 samba-9d5348c7587507796cdc448a89b953cf877226a3.zip |
removed need for scandir in client.c
fixed possible bug with readdirname on systems with NAMELEN != strlen
(This used to be commit 78f448b7d4b83f569d27e0abf6b1759c43ff21f3)
Diffstat (limited to 'source3/client')
-rw-r--r-- | source3/client/client.c | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/source3/client/client.c b/source3/client/client.c index a8f11fc659..4969156f08 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -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; } |