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 | 78f448b7d4b83f569d27e0abf6b1759c43ff21f3 (patch) | |
tree | 9f12d5b1fc1d89e2ba6a2f65d79cc7964399c2e5 /source/client | |
parent | f8c83ce28b01ffd188dd10f0c731defaacb0fb45 (diff) | |
download | samba-78f448b7d4b83f569d27e0abf6b1759c43ff21f3.tar.gz samba-78f448b7d4b83f569d27e0abf6b1759c43ff21f3.tar.xz samba-78f448b7d4b83f569d27e0abf6b1759c43ff21f3.zip |
removed need for scandir in client.c
fixed possible bug with readdirname on systems with NAMELEN != strlen
Diffstat (limited to 'source/client')
-rw-r--r-- | source/client/client.c | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/source/client/client.c b/source/client/client.c index a8f11fc659b..4969156f083 100644 --- a/source/client/client.c +++ b/source/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; } |