static int parse_dir(struct pl_parser *p) { if (p->real_stream->type != STREAMTYPE_DIR) return -1; if (p->probing) return 0; char *path = mp_file_get_path(p, bstr0(p->real_stream->url)); char **files = NULL; int num_files = 0; struct stat dir_stack[MAX_DIR_STACK]; scan_dir(p, path, dir_stack, 0, &files, &num_files); if (files) qsort(files, num_files, sizeof(files[0]), cmp_filename); for (int n = 0; n < num_files; n++) playlist_add_file(p->pl, files[n]); p->add_base = false; return num_files > 0 ? 0 : -1; }
static int parse_dir(struct pl_parser *p) { if (p->real_stream->type != STREAMTYPE_DIR) return -1; if (p->probing) return 0; char *path = mp_file_get_path(p, bstr0(p->real_stream->url)); if (strlen(path) >= 8192) return -1; // things like mount bind loops DIR *dp = opendir(path); if (!dp) { MP_ERR(p, "Could not read directory.\n"); return -1; } char **files = NULL; int num_files = 0; struct dirent *ep; while ((ep = readdir(dp))) { if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) continue; MP_TARRAY_APPEND(p, files, num_files, talloc_strdup(p, ep->d_name)); } if (files) qsort(files, num_files, sizeof(files[0]), cmp_filename); for (int n = 0; n < num_files; n++) playlist_add_file(p->pl, mp_path_join(p, path, files[n])); closedir(dp); p->add_base = false; return num_files > 0 ? 0 : -1; }