static bool reg_match_one(struct smbcli_state *cli, const char *pattern, const char *file) { /* oh what a weird world this is */ if (old_list && strcmp(pattern, "*.*") == 0) return true; if (ISDOT(pattern)) return false; if (ISDOTDOT(file)) file = "."; return ms_fnmatch_protocol( pattern, file, cli->transport->negotiate.protocol, false)==0; }
/* read a directory and find all matching file names and stat info returned names are separate unix and DOS names. The returned names are relative to the directory */ struct cifspsx_dir *cifspsx_list_unix(TALLOC_CTX *mem_ctx, struct ntvfs_request *req, const char *unix_path) { char *p, *mask; struct cifspsx_dir *dir; DIR *odir; struct dirent *dent; unsigned int allocated = 0; char *low_mask; dir = talloc(mem_ctx, struct cifspsx_dir); if (!dir) { return NULL; } dir->count = 0; dir->files = 0; /* find the base directory */ p = strrchr(unix_path, '/'); if (!p) { return NULL; } dir->unix_dir = talloc_strndup(mem_ctx, unix_path, PTR_DIFF(p, unix_path)); if (!dir->unix_dir) { return NULL; } /* the wildcard pattern is the last part */ mask = p+1; low_mask = strlower_talloc(mem_ctx, mask); if (!low_mask) { return NULL; } odir = opendir(dir->unix_dir); if (!odir) { return NULL; } while ((dent = readdir(odir))) { unsigned int i = dir->count; char *full_name; char *low_name; int ret; if (strchr(dent->d_name, ':') && !strchr(unix_path, ':')) { /* don't show streams in dir listing */ continue; } low_name = strlower_talloc(mem_ctx, dent->d_name); if (!low_name) { continue; } /* check it matches the wildcard pattern */ if (ms_fnmatch_protocol(low_mask, low_name, PROTOCOL_NT1) != 0) { continue; } if (dir->count >= allocated) { allocated = (allocated + 100) * 1.2; dir->files = talloc_realloc(dir, dir->files, struct cifspsx_dirfile, allocated); if (!dir->files) { closedir(odir); return NULL; } } dir->files[i].name = low_name; if (!dir->files[i].name) { continue; } ret = asprintf(&full_name, "%s/%s", dir->unix_dir, dir->files[i].name); if (ret == -1) { continue; } if (!full_name) { continue; } if (stat(full_name, &dir->files[i].st) == 0) { dir->count++; } free(full_name); }