void load_resources() { printf("load_resources():\n"); char *path = malloc(strlen(get_prefix())+32); if(!(resources.state & RS_GfxLoaded)) { printf("- textures:\n"); strcpy(path, get_prefix()); strcat(path, "gfx"); recurse_dir(path); resources.state |= RS_GfxLoaded; } if(!tconfig.intval[NO_AUDIO] && !(resources.state & RS_SfxLoaded)) { printf("- sounds:\n"); alGenSources(SNDSRC_COUNT, resources.sndsrc); strcpy(path, get_prefix()); strcat(path, "sfx"); recurse_dir(path); resources.state |= RS_SfxLoaded; } if(!tconfig.intval[NO_SHADER] && !(resources.state & RS_ShaderLoaded)) { printf("- shader:\n"); strcpy(path, get_prefix()); strcat(path, "shader"); recurse_dir(path); strcpy(path, get_prefix()); strcat(path, "shader/laser_snippets"); if(tgl_ext[TGLEXT_draw_instanced]) load_shader_snippets(path, "laser_"); printf("init_fbo():\n"); init_fbo(&resources.fbg[0]); init_fbo(&resources.fbg[1]); init_fbo(&resources.fsec); printf("-- finished\n"); resources.state |= RS_ShaderLoaded; } if(!(resources.state & RS_ModelsLoaded)) { printf("- models:\n"); strcpy(path, get_prefix()); strcat(path, "models"); recurse_dir(path); resources.state |= RS_ModelsLoaded; } }
/** * @return 0 == ok, 1 == no changes found, > 2 is an error */ int replace_file(const char *search_str, const char *replace_str, char *file_name, int recurse) { int ret, // return code ch, // the character being read fd; // file descriptor ret = 0; struct stat stat_s; int stat_ret = stat(file_name, &stat_s); if (stat_ret != 0) { // TODO support -R fprintf(stderr, "Unable to stat file %s\n", file_name); return 2; } if ( recurse && S_ISDIR(stat_s.st_mode) ) { return recurse_dir(search_str, replace_str, file_name); } if ( ! S_ISREG(stat_s.st_mode) ) { fprintf(stderr, "Not a file %s\n", file_name); return 2; } // open file to read FILE *in = fopen(file_name, "r+"); if (in == NULL) { ret++; fprintf(stderr, "Unable to open %s\n", file_name); return 3; } // create a unique temp file char template[14];
void recurse_dir(char *path) { DIR *dir = opendir(path); if(dir == NULL) errx(-1, "Can't open directory '%s'", path); struct dirent *dp; while((dp = readdir(dir)) != NULL) { char *buf = malloc(strlen(path) + strlen(dp->d_name)+2); strcpy(buf, path); strcat(buf, "/"); strcat(buf, dp->d_name); struct stat statbuf; stat(buf, &statbuf); if(S_ISDIR(statbuf.st_mode) && dp->d_name[0] != '.') { recurse_dir(buf); } else if(strcmp(dp->d_name + strlen(dp->d_name)-4, ".png") == 0) { if(strncmp(dp->d_name, "ani_", 4) == 0) init_animation(buf); else load_texture(buf); } else if(strcmp(dp->d_name + strlen(dp->d_name)-4, ".wav") == 0) { load_sound(buf); } else if(strcmp(dp->d_name + strlen(dp->d_name)-4, ".sha") == 0) { load_shader_file(buf); } else if(strcmp(dp->d_name + strlen(dp->d_name)-4, ".obj") == 0) { load_model(buf); } free(buf); } closedir(dir); }
int main(int argc, char *argv[]) { include_path **incpathhead = &incpaths; exclude_path **excpathhead = &excpaths; astring srcdir; int unadorned = 0; // loop over arguments for (int argnum = 1; argnum < argc; argnum++) { char *arg = argv[argnum]; // include path? if (arg[0] == '-' && arg[1] == 'I') { *incpathhead = new include_path; (*incpathhead)->next = NULL; (*incpathhead)->path.cpy(&arg[2]).replacechr('/', PATH_SEPARATOR[0]); incpathhead = &(*incpathhead)->next; } // exclude path? else if (arg[0] == '-' && arg[1] == 'X') { *excpathhead = new exclude_path; (*excpathhead)->next = NULL; (*excpathhead)->path.cpy(&arg[2]).replacechr(PATH_SEPARATOR[0], '/'); (*excpathhead)->recursive = ((*excpathhead)->path.replace((*excpathhead)->path.len() - 4, "/...", "") != 0); (*excpathhead)->pathlen = (*excpathhead)->path.len(); excpathhead = &(*excpathhead)->next; } // ignore -include which is used by sdlmame to include sdlprefix.h before all other includes else if (strcmp(arg,"-include") == 0) { argnum++; } // other parameter else if (arg[0] != '-' && unadorned == 0) { srcdir.cpy(arg).replacechr('/', PATH_SEPARATOR[0]); unadorned++; } else usage(argv[0]); } // make sure we got 1 parameter if (srcdir.len() == 0) usage(argv[0]); // recurse over subdirectories return recurse_dir(srcdir.len(), srcdir); }
int main(int argc, char *argv[]) { astring *srcdir = NULL, *dstdir = NULL; int unadorned = 0; int result; int argnum; /* loop over arguments */ for (argnum = 1; argnum < argc; argnum++) { char *arg = argv[argnum]; /* include path? */ if (arg[0] == '-' && arg[1] == 'I') { *incpathhead = malloc(sizeof(**incpathhead)); if (*incpathhead != NULL) { (*incpathhead)->next = NULL; (*incpathhead)->path = astring_replacechr(astring_dupc(&arg[2]), '/', PATH_SEPARATOR[0]); incpathhead = &(*incpathhead)->next; } } /* other parameter */ else if (arg[0] != '-' && unadorned == 0) { srcdir = astring_dupc(arg); unadorned++; } else if (arg[0] != '-' && unadorned == 1) { dstdir = astring_dupc(arg); unadorned++; } else goto usage; } /* make sure we got 2 parameters */ if (srcdir == NULL || dstdir == NULL) goto usage; /* recurse over subdirectories */ result = recurse_dir(astring_len(srcdir), astring_len(dstdir), srcdir, dstdir); /* free source and destination directories */ astring_free(srcdir); astring_free(dstdir); return result; usage: fprintf(stderr, "Usage:\n%s <srcroot> <destroot> [-Iincpath [-Iincpath [...]]]\n", argv[0]); return 1; }
// Called by ms_scan either in a thread or synchronously static void *do_scan(void *userdata) { MediaScan *s = ((thread_data_type *)userdata)->s; int i; struct dirq *dir_head = (struct dirq *)s->_dirq; struct dirq_entry *dir_entry = NULL; struct fileq *file_head = NULL; struct fileq_entry *file_entry = NULL; char tmp_full_path[MAX_PATH_STR_LEN]; // Initialize the cache database if (!init_bdb(s)) { MediaScanError *e = error_create("", MS_ERROR_CACHE, "Unable to initialize libmediascan cache"); send_error(s, e); goto out; } if (s->flags & MS_CLEARDB) { reset_bdb(s); } if (s->progress == NULL) { MediaScanError *e = error_create("", MS_ERROR_TYPE_INVALID_PARAMS, "Progress object not created"); send_error(s, e); goto out; } // Build a list of all directories and paths // We do this first so we can present an accurate scan eta later progress_start_phase(s->progress, "Discovering"); for (i = 0; i < s->npaths; i++) { LOG_INFO("Scanning %s\n", s->paths[i]); recurse_dir(s, s->paths[i], 0); } // Scan all files found progress_start_phase(s->progress, "Scanning"); while (!SIMPLEQ_EMPTY(dir_head)) { dir_entry = SIMPLEQ_FIRST(dir_head); file_head = dir_entry->files; while (!SIMPLEQ_EMPTY(file_head)) { // check if the scan has been aborted if (s->_want_abort) { LOG_DEBUG("Aborting scan\n"); goto aborted; } file_entry = SIMPLEQ_FIRST(file_head); // Construct full path strcpy(tmp_full_path, dir_entry->dir); #ifdef WIN32 strcat(tmp_full_path, "\\"); #else strcat(tmp_full_path, "/"); #endif strcat(tmp_full_path, file_entry->file); ms_scan_file(s, tmp_full_path, file_entry->type); // Send progress update if necessary if (s->on_progress) { s->progress->done++; if (progress_update(s->progress, tmp_full_path)) send_progress(s); } SIMPLEQ_REMOVE_HEAD(file_head, entries); free(file_entry->file); free(file_entry); } SIMPLEQ_REMOVE_HEAD(dir_head, entries); free(dir_entry->dir); free(dir_entry->files); free(dir_entry); } // Send final progress callback if (s->on_progress) { progress_update(s->progress, NULL); send_progress(s); } LOG_DEBUG("Finished scanning\n"); out: if (s->on_finish) send_finish(s); aborted: if (s->async) { LOG_MEM("destroy thread_data @ %p\n", userdata); free(userdata); } return NULL; }
static int recurse_dir(int srcrootlen, astring &srcdir) { static const osd_dir_entry_type typelist[] = { ENTTYPE_DIR, ENTTYPE_FILE }; int result = 0; // iterate first over directories, then over files for (int entindex = 0; entindex < ARRAY_LENGTH(typelist) && result == 0; entindex++) { osd_dir_entry_type entry_type = typelist[entindex]; // open the directory and iterate through it osd_directory *dir = osd_opendir(srcdir); if (dir == NULL) { result = 1; goto error; } // build up the list of files const osd_directory_entry *entry; list_entry *list = NULL; int found = 0; while ((entry = osd_readdir(dir)) != NULL) if (entry->type == entry_type && entry->name[0] != '.') { list_entry *lentry = new list_entry; lentry->name.cpy(entry->name); lentry->next = list; list = lentry; found++; } // close the directory osd_closedir(dir); // skip if nothing found if (found == 0) continue; // allocate memory for sorting list_entry **listarray = new list_entry *[found]; found = 0; for (list_entry *curlist = list; curlist != NULL; curlist = curlist->next) listarray[found++] = curlist; // sort the list qsort(listarray, found, sizeof(listarray[0]), compare_list_entries); // rebuild the list list = NULL; while (--found >= 0) { listarray[found]->next = list; list = listarray[found]; } delete[] listarray; // iterate through each file for (list_entry *curlist = list; curlist != NULL && result == 0; curlist = curlist->next) { astring srcfile; // build the source filename srcfile.printf("%s%c%s", srcdir.cstr(), PATH_SEPARATOR[0], curlist->name.cstr()); // if we have a file, output it if (entry_type == ENTTYPE_FILE) { // make sure we care, first if (core_filename_ends_with(curlist->name, ".c")) { dependency_map depend_map; // find dependencies file_entry &file = compute_dependencies(srcrootlen, srcfile); recurse_dependencies(file, depend_map); // convert the target from source to object (makes assumptions about rules) astring target(file.name); target.replace(0, "src/", "$(OBJ)/"); target.replace(0, ".c", ".o"); printf("\n%s : \\\n", target.cstr()); // iterate over the hashed dependencies and output them as well for (dependency_map::entry_t *entry = depend_map.first(); entry != NULL; entry = depend_map.next(entry)) printf("\t%s \\\n", entry->tag().cstr()); } } // if we have a directory, recurse else result = recurse_dir(srcrootlen, srcfile); } // free all the allocated entries while (list != NULL) { list_entry *next = list->next; delete list; list = next; } } error: return result; }
static int recurse_dir(int srcrootlen, const astring *srcdir) { static const osd_dir_entry_type typelist[] = { ENTTYPE_DIR, ENTTYPE_FILE }; int result = 0; int entindex; /* iterate first over directories, then over files */ for (entindex = 0; entindex < ARRAY_LENGTH(typelist) && result == 0; entindex++) { osd_dir_entry_type entry_type = typelist[entindex]; const osd_directory_entry *entry; list_entry **listarray = NULL; list_entry *list = NULL; list_entry *curlist; osd_directory *dir; int found = 0; /* open the directory and iterate through it */ dir = osd_opendir(astring_c(srcdir)); if (dir == NULL) { result = 1; goto error; } /* build up the list of files */ while ((entry = osd_readdir(dir)) != NULL) if (entry->type == entry_type && entry->name[0] != '.') { list_entry *lentry = (list_entry *)malloc(sizeof(*lentry)); lentry->name = astring_dupc(entry->name); lentry->next = list; list = lentry; found++; } /* close the directory */ osd_closedir(dir); /* skip if nothing found */ if (found == 0) continue; /* allocate memory for sorting */ listarray = (list_entry **)malloc(sizeof(list_entry *) * found); found = 0; for (curlist = list; curlist != NULL; curlist = curlist->next) listarray[found++] = curlist; /* sort the list */ qsort(listarray, found, sizeof(listarray[0]), compare_list_entries); /* rebuild the list */ list = NULL; while (--found >= 0) { listarray[found]->next = list; list = listarray[found]; } free(listarray); /* iterate through each file */ for (curlist = list; curlist != NULL && result == 0; curlist = curlist->next) { astring *srcfile; /* build the source filename */ srcfile = astring_alloc(); astring_printf(srcfile, "%s%c%s", astring_c(srcdir), PATH_SEPARATOR[0], astring_c(curlist->name)); /* if we have a file, output it */ if (entry_type == ENTTYPE_FILE) { /* make sure we care, first */ if (core_filename_ends_with(astring_c(curlist->name), ".c")) { tagmap *depend_map = tagmap_alloc(); tagmap_entry *map_entry; file_entry *file; astring *target; int taghash; /* find dependencies */ file = compute_dependencies(srcrootlen, srcfile); recurse_dependencies(file, depend_map); /* convert the target from source to object (makes assumptions about rules) */ target = astring_dup(file->name); astring_replacec(target, 0, "src/", "$(OBJ)/"); astring_replacec(target, 0, ".c", ".o"); printf("\n%s : \\\n", astring_c(target)); /* iterate over the hashed dependencies and output them as well */ for (taghash = 0; taghash < TAGMAP_HASH_SIZE; taghash++) for (map_entry = depend_map->table[taghash]; map_entry != NULL; map_entry = map_entry->next) printf("\t%s \\\n", astring_c((astring *)map_entry->object)); astring_free(target); tagmap_free(depend_map); } } /* if we have a directory, recurse */ else result = recurse_dir(srcrootlen, srcfile); /* free memory for the names */ astring_free(srcfile); } /* free all the allocated entries */ while (list != NULL) { list_entry *next = list->next; astring_free((astring *)list->name); free(list); list = next; } } error: return result; }
/* * Traverse through all files in a data directory, calling 'callback' * for each file. */ void traverse_datadir(const char *datadir, process_file_callback_t callback) { recurse_dir(datadir, NULL, callback); }
static int recurse_dir(int srcrootlen, int dstrootlen, std::string &srcdir, std::string &dstdir, std::string &tempheader, std::string &tempfooter) { static const osd::directory::entry::entry_type typelist[] = { osd::directory::entry::entry_type::DIR, osd::directory::entry::entry_type::FILE }; // extract a normalized subpath std::string srcdir_subpath; normalized_subpath(srcdir_subpath, srcdir, srcrootlen + 1); // create an index file std::string indexname; indexname = string_format("%s%c%s", dstdir.c_str(), PATH_SEPARATOR[0], "index.html"); util::core_file::ptr indexfile = create_file_and_output_header(indexname, tempheader, srcdir_subpath); // output the directory navigation indexfile->printf("<h3>Viewing Directory: "); output_path_as_links(*indexfile, srcdir_subpath, true, false); indexfile->printf("</h3>"); // iterate first over directories, then over files int result = 0; for (int entindex = 0; entindex < ARRAY_LENGTH(typelist) && result == 0; entindex++) { auto entry_type = typelist[entindex]; // open the directory and iterate through it auto dir = osd::directory::open(srcdir.c_str()); if (dir == nullptr) { result = 1; break; } // build up the list of files const osd::directory::entry *entry; int found = 0; list_entry *list = nullptr; while ((entry = dir->read()) != nullptr) if (entry->type == entry_type && entry->name[0] != '.') { auto lentry = new list_entry; lentry->name.assign(entry->name); lentry->next = list; list = lentry; found++; } // close the directory dir.reset(); // skip if nothing found if (found == 0) continue; // allocate memory for sorting auto listarray = new list_entry *[found]; found = 0; for (list_entry *curlist = list; curlist != nullptr; curlist = curlist->next) listarray[found++] = curlist; // sort the list qsort(listarray, found, sizeof(listarray[0]), compare_list_entries); // rebuild the list list = nullptr; while (--found >= 0) { listarray[found]->next = list; list = listarray[found]; } delete[] listarray; // iterate through each file for (list_entry *curlist = list; curlist != nullptr && result == 0; curlist = curlist->next) { // add a header if (curlist == list) indexfile->printf("\t<h2>%s</h2>\n\t<ul>\n", (entry_type == osd::directory::entry::entry_type::DIR) ? "Directories" : "Files"); // build the source filename std::string srcfile; srcfile = string_format("%s%c%s", srcdir.c_str(), PATH_SEPARATOR[0], curlist->name.c_str()); // if we have a file, output it std::string dstfile; if (entry_type == osd::directory::entry::entry_type::FILE) { // make sure we care, first file_type type = FILE_TYPE_INVALID; for (auto & elem : extension_lookup) if (core_filename_ends_with(curlist->name, elem.extension)) { type = elem.type; break; } // if we got a valid file, process it if (type != FILE_TYPE_INVALID) { dstfile = string_format("%s%c%s.html", dstdir.c_str(), PATH_SEPARATOR[0], curlist->name.c_str()); if (indexfile != nullptr) indexfile->printf("\t<li><a href=\"%s.html\">%s</a></li>\n", curlist->name.c_str(), curlist->name.c_str()); result = output_file(type, srcrootlen, dstrootlen, srcfile, dstfile, srcdir.compare(dstdir) == 0, tempheader, tempfooter); } } // if we have a directory, recurse else { dstfile = string_format("%s%c%s", dstdir.c_str(), PATH_SEPARATOR[0], curlist->name.c_str()); if (indexfile != nullptr) indexfile->printf("\t<li><a href=\"%s/index.html\">%s/</a></li>\n", curlist->name.c_str(), curlist->name.c_str()); result = recurse_dir(srcrootlen, dstrootlen, srcfile, dstfile, tempheader, tempfooter); } } // close the list if we found some stuff if (list != nullptr) indexfile->printf("\t</ul>\n"); // free all the allocated entries while (list != nullptr) { list_entry *next = list->next; delete list; list = next; } } if (indexfile != nullptr) output_footer_and_close_file(std::move(indexfile), tempfooter, srcdir_subpath); return result; }
void traverse_datadir(const char *datadir, process_file_callback_t callback) { /* should this copy config files or not? */ recurse_dir(datadir, NULL, callback); }
static int recurse_dir(int srcrootlen, int dstrootlen, const astring *srcdir, const astring *dstdir) { static const osd_dir_entry_type typelist[] = { ENTTYPE_DIR, ENTTYPE_FILE }; const astring *srcdir_subpath; core_file *indexfile = NULL; astring *indexname; int result = 0; int entindex; /* extract a normalized subpath */ srcdir_subpath = normalized_subpath(srcdir, srcrootlen + 1); if (srcdir_subpath == NULL) return 1; /* create an index file */ indexname = astring_alloc(); astring_printf(indexname, "%s%c%s", astring_c(dstdir), PATH_SEPARATOR[0], "index.html"); indexfile = create_file_and_output_header(indexname, "MAME Source Code", astring_c(srcdir_subpath)); astring_free(indexname); /* output the directory navigation */ core_fprintf(indexfile, "<h3>Viewing Directory: "); output_path_as_links(indexfile, srcdir_subpath, TRUE, FALSE); core_fprintf(indexfile, "</h3>"); astring_free((astring *)srcdir_subpath); /* iterate first over directories, then over files */ for (entindex = 0; entindex < ARRAY_LENGTH(typelist) && result == 0; entindex++) { osd_dir_entry_type entry_type = typelist[entindex]; const osd_directory_entry *entry; list_entry *list = NULL; list_entry **listarray; list_entry *curlist; osd_directory *dir; int found = 0; /* open the directory and iterate through it */ dir = osd_opendir(astring_c(srcdir)); if (dir == NULL) { result = 1; goto error; } /* build up the list of files */ while ((entry = osd_readdir(dir)) != NULL) if (entry->type == entry_type && entry->name[0] != '.') { list_entry *lentry = malloc(sizeof(*lentry)); lentry->name = astring_dupc(entry->name); lentry->next = list; list = lentry; found++; } /* close the directory */ osd_closedir(dir); /* skip if nothing found */ if (found == 0) continue; /* allocate memory for sorting */ listarray = malloc(sizeof(list_entry *) * found); found = 0; for (curlist = list; curlist != NULL; curlist = curlist->next) listarray[found++] = curlist; /* sort the list */ qsort(listarray, found, sizeof(listarray[0]), compare_list_entries); /* rebuild the list */ list = NULL; while (--found >= 0) { listarray[found]->next = list; list = listarray[found]; } /* iterate through each file */ for (curlist = list; curlist != NULL && result == 0; curlist = curlist->next) { astring *srcfile, *dstfile; /* add a header */ if (curlist == list) core_fprintf(indexfile, "\t<h2>%s</h2>\n\t<ul>\n", (entry_type == ENTTYPE_DIR) ? "Directories" : "Files"); /* build the source filename */ srcfile = astring_alloc(); astring_printf(srcfile, "%s%c%s", astring_c(srcdir), PATH_SEPARATOR[0], astring_c(curlist->name)); /* if we have a file, output it */ dstfile = astring_alloc(); if (entry_type == ENTTYPE_FILE) { file_type type = FILE_TYPE_INVALID; int extnum; /* make sure we care, first */ for (extnum = 0; extnum < ARRAY_LENGTH(extension_lookup); extnum++) if (core_filename_ends_with(astring_c(curlist->name), extension_lookup[extnum].extension)) { type = extension_lookup[extnum].type; break; } /* if we got a valid file, process it */ if (type != FILE_TYPE_INVALID) { astring_printf(dstfile, "%s%c%s.html", astring_c(dstdir), PATH_SEPARATOR[0], astring_c(curlist->name)); if (indexfile != NULL) core_fprintf(indexfile, "\t<li><a href=\"%s.html\">%s</a></li>\n", astring_c(curlist->name), astring_c(curlist->name)); result = output_file(type, srcrootlen, dstrootlen, srcfile, dstfile, astring_cmp(srcdir, dstdir) == 0); } } /* if we have a directory, recurse */ else { astring_printf(dstfile, "%s%c%s", astring_c(dstdir), PATH_SEPARATOR[0], astring_c(curlist->name)); if (indexfile != NULL) core_fprintf(indexfile, "\t<li><a href=\"%s/index.html\">%s/</a></li>\n", astring_c(curlist->name), astring_c(curlist->name)); result = recurse_dir(srcrootlen, dstrootlen, srcfile, dstfile); } /* free memory for the names */ astring_free(srcfile); astring_free(dstfile); } /* close the list if we found some stuff */ if (list != NULL) core_fprintf(indexfile, "\t</ul>\n"); /* free all the allocated entries */ while (list != NULL) { list_entry *next = list->next; astring_free((astring *)list->name); free(list); list = next; } } error: if (indexfile != NULL) output_footer_and_close_file(indexfile); return result; }
/* * recursive part of traverse_datadir * * parentpath is the current subdirectory's path relative to datadir, * or NULL at the top level. */ static void recurse_dir(const char *datadir, const char *parentpath, process_file_callback_t callback) { DIR *xldir; struct dirent *xlde; char fullparentpath[MAXPGPATH]; if (parentpath) snprintf(fullparentpath, MAXPGPATH, "%s/%s", datadir, parentpath); else snprintf(fullparentpath, MAXPGPATH, "%s", datadir); xldir = opendir(fullparentpath); if (xldir == NULL) pg_fatal("could not open directory \"%s\": %s\n", fullparentpath, strerror(errno)); while (errno = 0, (xlde = readdir(xldir)) != NULL) { struct stat fst; char fullpath[MAXPGPATH * 2]; char path[MAXPGPATH * 2]; if (strcmp(xlde->d_name, ".") == 0 || strcmp(xlde->d_name, "..") == 0) continue; snprintf(fullpath, sizeof(fullpath), "%s/%s", fullparentpath, xlde->d_name); if (lstat(fullpath, &fst) < 0) { if (errno == ENOENT) { /* * File doesn't exist anymore. This is ok, if the new master * is running and the file was just removed. If it was a data * file, there should be a WAL record of the removal. If it * was something else, it couldn't have been anyway. * * TODO: But complain if we're processing the target dir! */ } else pg_fatal("could not stat file \"%s\": %s\n", fullpath, strerror(errno)); } if (parentpath) snprintf(path, sizeof(path), "%s/%s", parentpath, xlde->d_name); else snprintf(path, sizeof(path), "%s", xlde->d_name); if (S_ISREG(fst.st_mode)) callback(path, FILE_TYPE_REGULAR, fst.st_size, NULL); else if (S_ISDIR(fst.st_mode)) { callback(path, FILE_TYPE_DIRECTORY, 0, NULL); /* recurse to handle subdirectories */ recurse_dir(datadir, path, callback); } #ifndef WIN32 else if (S_ISLNK(fst.st_mode)) #else else if (pgwin32_is_junction(fullpath)) #endif { #if defined(HAVE_READLINK) || defined(WIN32) char link_target[MAXPGPATH]; int len; len = readlink(fullpath, link_target, sizeof(link_target)); if (len < 0) pg_fatal("could not read symbolic link \"%s\": %s\n", fullpath, strerror(errno)); if (len >= sizeof(link_target)) pg_fatal("symbolic link \"%s\" target is too long\n", fullpath); link_target[len] = '\0'; callback(path, FILE_TYPE_SYMLINK, 0, link_target); /* * If it's a symlink within pg_tblspc, we need to recurse into it, * to process all the tablespaces. We also follow a symlink if * it's for pg_wal. Symlinks elsewhere are ignored. */ if ((parentpath && strcmp(parentpath, "pg_tblspc") == 0) || strcmp(path, "pg_wal") == 0) recurse_dir(datadir, path, callback); #else pg_fatal("\"%s\" is a symbolic link, but symbolic links are not supported on this platform\n", fullpath); #endif /* HAVE_READLINK */ } } if (errno) pg_fatal("could not read directory \"%s\": %s\n", fullparentpath, strerror(errno)); if (closedir(xldir)) pg_fatal("could not close directory \"%s\": %s\n", fullparentpath, strerror(errno)); }
static int recurse_dir(int srcrootlen, int dstrootlen, astring &srcdir, astring &dstdir, astring &tempheader, astring &tempfooter) { static const osd_dir_entry_type typelist[] = { ENTTYPE_DIR, ENTTYPE_FILE }; // extract a normalized subpath astring srcdir_subpath; normalized_subpath(srcdir_subpath, srcdir, srcrootlen + 1); // create an index file astring indexname; indexname.printf("%s%c%s", dstdir.cstr(), PATH_SEPARATOR[0], "index.html"); core_file *indexfile = create_file_and_output_header(indexname, tempheader, srcdir_subpath); // output the directory navigation core_fprintf(indexfile, "<h3>Viewing Directory: "); output_path_as_links(indexfile, srcdir_subpath, true, false); core_fprintf(indexfile, "</h3>"); // iterate first over directories, then over files int result = 0; for (int entindex = 0; entindex < ARRAY_LENGTH(typelist) && result == 0; entindex++) { osd_dir_entry_type entry_type = typelist[entindex]; // open the directory and iterate through it osd_directory *dir = osd_opendir(srcdir); if (dir == NULL) { result = 1; break; } // build up the list of files const osd_directory_entry *entry; int found = 0; list_entry *list = NULL; while ((entry = osd_readdir(dir)) != NULL) if (entry->type == entry_type && entry->name[0] != '.') { list_entry *lentry = new list_entry; lentry->name.cpy(entry->name); lentry->next = list; list = lentry; found++; } // close the directory osd_closedir(dir); // skip if nothing found if (found == 0) continue; // allocate memory for sorting list_entry **listarray = new list_entry *[found]; found = 0; for (list_entry *curlist = list; curlist != NULL; curlist = curlist->next) listarray[found++] = curlist; // sort the list qsort(listarray, found, sizeof(listarray[0]), compare_list_entries); // rebuild the list list = NULL; while (--found >= 0) { listarray[found]->next = list; list = listarray[found]; } delete[] listarray; // iterate through each file for (list_entry *curlist = list; curlist != NULL && result == 0; curlist = curlist->next) { // add a header if (curlist == list) core_fprintf(indexfile, "\t<h2>%s</h2>\n\t<ul>\n", (entry_type == ENTTYPE_DIR) ? "Directories" : "Files"); // build the source filename astring srcfile; srcfile.printf("%s%c%s", srcdir.cstr(), PATH_SEPARATOR[0], curlist->name.cstr()); // if we have a file, output it astring dstfile; if (entry_type == ENTTYPE_FILE) { // make sure we care, first file_type type = FILE_TYPE_INVALID; for (int extnum = 0; extnum < ARRAY_LENGTH(extension_lookup); extnum++) if (core_filename_ends_with(curlist->name, extension_lookup[extnum].extension)) { type = extension_lookup[extnum].type; break; } // if we got a valid file, process it if (type != FILE_TYPE_INVALID) { dstfile.printf("%s%c%s.html", dstdir.cstr(), PATH_SEPARATOR[0], curlist->name.cstr()); if (indexfile != NULL) core_fprintf(indexfile, "\t<li><a href=\"%s.html\">%s</a></li>\n", curlist->name.cstr(), curlist->name.cstr()); result = output_file(type, srcrootlen, dstrootlen, srcfile, dstfile, srcdir == dstdir, tempheader, tempfooter); } } // if we have a directory, recurse else { dstfile.printf("%s%c%s", dstdir.cstr(), PATH_SEPARATOR[0], curlist->name.cstr()); if (indexfile != NULL) core_fprintf(indexfile, "\t<li><a href=\"%s/index.html\">%s/</a></li>\n", curlist->name.cstr(), curlist->name.cstr()); result = recurse_dir(srcrootlen, dstrootlen, srcfile, dstfile, tempheader, tempfooter); } } // close the list if we found some stuff if (list != NULL) core_fprintf(indexfile, "\t</ul>\n"); // free all the allocated entries while (list != NULL) { list_entry *next = list->next; delete list; list = next; } } if (indexfile != NULL) output_footer_and_close_file(indexfile, tempfooter, srcdir_subpath); return result; }
/* * copydir: copy a directory */ static void recurse_dir(const char *datadir, const char *path, process_file_callback_t callback) { DIR *xldir; struct dirent *xlde; char fulldirpath[MAXPGPATH]; char filepath[MAXPGPATH]; if (path) snprintf(fulldirpath, MAXPGPATH, "%s/%s", datadir, path); else snprintf(fulldirpath, MAXPGPATH, "%s", datadir); xldir = opendir(fulldirpath); if (xldir == NULL) { fprintf(stderr, "could not open directory \"%s\": %s\n", fulldirpath, strerror(errno)); exit(1); } while ((xlde = readdir(xldir)) != NULL) { struct stat fst; if (strcmp(xlde->d_name, ".") == 0 || strcmp(xlde->d_name, "..") == 0) continue; snprintf(filepath, MAXPGPATH, "%s/%s", fulldirpath, xlde->d_name); if (lstat(filepath, &fst) < 0) { fprintf(stderr, "warning: could not stat file \"%s\": %s", filepath, strerror(errno)); /* * This is ok, if the new master is running and the file was * just removed. If it was a data file, there should be a WAL * record of the removal. If it was something else, it couldn't * have been critical anyway. * * TODO: But complain if we're processing the target dir! */ } if (path) snprintf(filepath, MAXPGPATH, "%s/%s", path, xlde->d_name); else snprintf(filepath, MAXPGPATH, "%s", xlde->d_name); if (S_ISDIR(fst.st_mode)) { callback(filepath, 0, true); /* recurse to handle subdirectories */ recurse_dir(datadir, filepath, callback); } else if (S_ISREG(fst.st_mode)) callback(filepath, fst.st_size, false); } closedir(xldir); }
int main(int argc, char *argv[]) { // loop over arguments include_path **incpathhead = &incpaths; std::string srcdir, dstdir, tempfilename, tempheader, tempfooter; int unadorned = 0; for (int argnum = 1; argnum < argc; argnum++) { char *arg = argv[argnum]; // include path? if (arg[0] == '-' && arg[1] == 'I') { *incpathhead = new include_path; if (*incpathhead != nullptr) { (*incpathhead)->next = nullptr; strreplacechr((*incpathhead)->path.assign(&arg[2]), '/', PATH_SEPARATOR[0]); incpathhead = &(*incpathhead)->next; } } // other parameter else if (arg[0] != '-' && unadorned == 0) { srcdir.assign(arg); unadorned++; } else if (arg[0] != '-' && unadorned == 1) { dstdir.assign(arg); unadorned++; } else if (arg[0] != '-' && unadorned == 2) { tempfilename.assign(arg); unadorned++; } else usage(argv[0]); } // make sure we got 3 parameters if (srcdir.length() == 0 || dstdir.length() == 0 || tempfilename.length() == 0) usage(argv[0]); // read the template file into an std::string uint32_t bufsize; void *buffer; if (util::core_file::load(tempfilename.c_str(), &buffer, bufsize) == osd_file::error::NONE) { tempheader.assign((const char *)buffer, bufsize); free(buffer); } // verify the template if (tempheader.length() == 0) { fprintf(stderr, "Unable to read template file\n"); return 1; } int result = tempheader.find("<!--CONTENT-->"); if (result == -1) { fprintf(stderr, "Template is missing a <!--CONTENT--> marker\n"); return 1; } tempfooter.assign(tempheader).substr(result + 14, -1); tempheader.substr(0, result); // recurse over subdirectories return recurse_dir(srcdir.length(), dstdir.length(), srcdir, dstdir, tempheader, tempfooter); }
int main(int argc, char *argv[]) { include_path **incpathhead = &incpaths; exclude_path **excpathhead = &excpaths; astring *srcdir = NULL; int unadorned = 0; int result; int argnum; /* loop over arguments */ for (argnum = 1; argnum < argc; argnum++) { char *arg = argv[argnum]; /* include path? */ if (arg[0] == '-' && arg[1] == 'I') { *incpathhead = (include_path *)malloc(sizeof(**incpathhead)); if (*incpathhead != NULL) { (*incpathhead)->next = NULL; (*incpathhead)->path = astring_replacechr(astring_dupc(&arg[2]), '/', PATH_SEPARATOR[0]); incpathhead = &(*incpathhead)->next; } } /* exclude path? */ else if (arg[0] == '-' && arg[1] == 'X') { *excpathhead = (exclude_path *)malloc(sizeof(**excpathhead)); if (*excpathhead != NULL) { astring *path; (*excpathhead)->next = NULL; path = astring_replacechr(astring_dupc(&arg[2]), PATH_SEPARATOR[0], '/'); (*excpathhead)->recursive = (astring_replacec(path, astring_len(path) - 4, "/...", "") != 0); (*excpathhead)->path = path; (*excpathhead)->pathlen = astring_len(path); excpathhead = &(*excpathhead)->next; } } /* ignore -include which is used by sdlmame to include sdlprefix.h before all other includes */ else if (strcmp(arg,"-include") == 0) { argnum++; } /* other parameter */ else if (arg[0] != '-' && unadorned == 0) { srcdir = astring_replacechr(astring_dupc(arg), '/', PATH_SEPARATOR[0]); unadorned++; } else goto usage; } /* make sure we got 1 parameter */ if (srcdir == NULL) goto usage; /* create a tagmap for tracking files we've visited */ file_map = tagmap_alloc(); /* recurse over subdirectories */ result = recurse_dir(astring_len(srcdir), srcdir); /* free source and destination directories */ tagmap_free(file_map); astring_free(srcdir); return result; usage: fprintf(stderr, "Usage:\n%s <srcroot> [-Iincpath [-Iincpath [...]]]\n", argv[0]); return 1; }
void recurse_dir(MediaScan *s, const char *path, int recurse_count) { char *dir, *p; char tmp_full_path[MAX_PATH_STR_LEN]; DIR *dirp; struct dirent *dp; struct dirq *subdirq; // list of subdirs of the current directory struct dirq_entry *parent_entry = NULL; // entry for current dir in s->_dirq char redirect_dir[MAX_PATH_STR_LEN]; if (recurse_count > RECURSE_LIMIT) { LOG_ERROR("Hit recurse limit of %d scanning path %s\n", RECURSE_LIMIT, path); return; } if (path[0] != '/') { // XXX Win32 // Get full path char *buf = (char *)malloc((size_t)MAX_PATH_STR_LEN); if (buf == NULL) { FATAL("Out of memory for directory scan\n"); return; } dir = getcwd(buf, (size_t)MAX_PATH_STR_LEN); strcat(dir, "/"); strcat(dir, path); } else { #ifdef USING_TCMALLOC // strdup will cause tcmalloc to crash on free dir = (char *)malloc((size_t)MAX_PATH_STR_LEN); strcpy(dir, path); #else dir = strdup(path); #endif } // Strip trailing slash if any p = &dir[0]; while (*p != 0) { if (p[1] == 0 && *p == '/') *p = 0; p++; } LOG_INFO("Recursed into %s\n", dir); #if defined(__APPLE__) if (isAlias(dir)) { if (CheckMacAlias(dir, redirect_dir)) { LOG_INFO("Resolving Alias %s to %s\n", dir, redirect_dir); strcpy(dir, redirect_dir); } else { LOG_ERROR("Failure to follow symlink or alias, skipping directory\n"); goto out; } } #elif defined(__linux__) if (isAlias(dir)) { FollowLink(dir, redirect_dir); LOG_INFO("Resolving symlink %s to %s\n", dir, redirect_dir); strcpy(dir, redirect_dir); } #endif if ((dirp = opendir(dir)) == NULL) { LOG_ERROR("Unable to open directory %s: %s\n", dir, strerror(errno)); goto out; } subdirq = malloc(sizeof(struct dirq)); SIMPLEQ_INIT(subdirq); while ((dp = readdir(dirp)) != NULL) { char *name = dp->d_name; // skip all dot files if (name[0] != '.') { // Check if scan should be aborted if (unlikely(s->_want_abort)) break; // XXX some platforms may be missing d_type/DT_DIR if (dp->d_type == DT_DIR) { // Add to list of subdirectories we need to recurse into struct dirq_entry *subdir_entry = malloc(sizeof(struct dirq_entry)); // Construct full path //*tmp_full_path = 0; strcpy(tmp_full_path, dir); strcat(tmp_full_path, "/"); strcat(tmp_full_path, name); if (_should_scan_dir(s, tmp_full_path)) { subdir_entry->dir = strdup(tmp_full_path); SIMPLEQ_INSERT_TAIL(subdirq, subdir_entry, entries); LOG_INFO(" subdir: %s\n", tmp_full_path); } else { LOG_INFO(" skipping subdir: %s\n", tmp_full_path); } } else { enum media_type type = _should_scan(s, name); LOG_INFO("name %s = type %d\n", name, type); if (type) { struct fileq_entry *entry; // Check if this file is a shortcut and if so resolve it #if defined(__APPLE__) if (isAlias(name)) { char full_name[MAX_PATH_STR_LEN]; LOG_INFO("Mac Alias detected\n"); strcpy(full_name, dir); strcat(full_name, "\\"); strcat(full_name, name); parse_lnk(full_name, redirect_dir, MAX_PATH_STR_LEN); if (PathIsDirectory(redirect_dir)) { struct dirq_entry *subdir_entry = malloc(sizeof(struct dirq_entry)); subdir_entry->dir = strdup(redirect_dir); SIMPLEQ_INSERT_TAIL(subdirq, subdir_entry, entries); LOG_INFO(" subdir: %s\n", tmp_full_path); type = 0; } } #elif defined(__linux__) if (isAlias(name)) { char full_name[MAX_PATH_STR_LEN]; printf("Linux Alias detected\n"); strcpy(full_name, dir); strcat(full_name, "\\"); strcat(full_name, name); FollowLink(full_name, redirect_dir); if (PathIsDirectory(redirect_dir)) { struct dirq_entry *subdir_entry = malloc(sizeof(struct dirq_entry)); subdir_entry->dir = strdup(redirect_dir); SIMPLEQ_INSERT_TAIL(subdirq, subdir_entry, entries); LOG_INFO(" subdir: %s\n", tmp_full_path); type = 0; } } #endif if (parent_entry == NULL) { // Add parent directory to list of dirs with files parent_entry = malloc(sizeof(struct dirq_entry)); parent_entry->dir = strdup(dir); parent_entry->files = malloc(sizeof(struct fileq)); SIMPLEQ_INIT(parent_entry->files); SIMPLEQ_INSERT_TAIL((struct dirq *)s->_dirq, parent_entry, entries); } // Add scannable file to this directory list entry = malloc(sizeof(struct fileq_entry)); entry->file = strdup(name); entry->type = type; SIMPLEQ_INSERT_TAIL(parent_entry->files, entry, entries); s->progress->total++; LOG_INFO(" [%5d] file: %s\n", s->progress->total, entry->file); } } } } closedir(dirp); // Send progress update if (s->on_progress && !s->_want_abort) if (progress_update(s->progress, dir)) send_progress(s); // process subdirs while (!SIMPLEQ_EMPTY(subdirq)) { struct dirq_entry *subdir_entry = SIMPLEQ_FIRST(subdirq); SIMPLEQ_REMOVE_HEAD(subdirq, entries); if (!s->_want_abort) recurse_dir(s, subdir_entry->dir, recurse_count); free(subdir_entry); } free(subdirq); out: free(dir); }
int main(int argc, char *argv[]) { include_path **incpathhead = &incpaths; exclude_path **excpathhead = &excpaths; astring srcdir; int unadorned = 0; librarylist = NULL; last_libraryitem = NULL; last_sourceitem = NULL; // extract arguments const char *srcfile = argv[1]; if (parse_file(srcfile)) return 1; // loop over arguments for (int argnum = 2; argnum < argc; argnum++) { char *arg = argv[argnum]; // include path? if (arg[0] == '-' && arg[1] == 'I') { *incpathhead = new include_path; (*incpathhead)->next = NULL; (*incpathhead)->path.cpy(&arg[2]).replacechr('/', PATH_SEPARATOR[0]); incpathhead = &(*incpathhead)->next; } // exclude path? else if (arg[0] == '-' && arg[1] == 'X') { *excpathhead = new exclude_path; (*excpathhead)->next = NULL; (*excpathhead)->path.cpy(&arg[2]).replacechr(PATH_SEPARATOR[0], '/'); (*excpathhead)->recursive = ((*excpathhead)->path.replace((*excpathhead)->path.len() - 4, "/...", "") != 0); (*excpathhead)->pathlen = (*excpathhead)->path.len(); excpathhead = &(*excpathhead)->next; } // ignore -include which is used by sdlmame to include sdlprefix.h before all other includes else if (strcmp(arg,"-include") == 0) { argnum++; } // other parameter else if (arg[0] != '-' && unadorned == 0) { srcdir.cpy(arg).replacechr('/', PATH_SEPARATOR[0]); unadorned++; } else usage(argv[0]); } // generate list of drivers if (srcdir.len() == 0) { for (librarylist_entry *lib = librarylist; lib != NULL; lib = lib->next) { for (list_entry *src = lib->sourcefiles; src != NULL; src = src->next) { printf("// Drivers from %s.c\n",src->name.cstr()); astring srcfile; // build the source filename srcfile.printf("%s%c%s.c", "src", PATH_SEPARATOR[0], src->name.cstr()); parse_for_drivers(srcfile); astring srcfile_inc; // build the source filename srcfile_inc.printf("%s%c%s.inc", "src", PATH_SEPARATOR[0], src->name.cstr()); if(check_file(srcfile_inc)) parse_for_drivers(srcfile_inc); } } return 0; } else { include_mapping("src/emu/cpu/cpu.mak"); include_mapping("src/emu/video/video.mak"); include_mapping("src/emu/sound/sound.mak"); include_mapping("src/emu/machine/machine.mak"); if (librarylist!=NULL) { printf("OBJDIRS += \\\n"); printf("\t$(OBJ)/target \\\n"); printf("\t$(OBJ)/mame/audio \\\n"); printf("\t$(OBJ)/mame/drivers \\\n"); printf("\t$(OBJ)/mame/layout \\\n"); printf("\t$(OBJ)/mame/machine \\\n"); printf("\t$(OBJ)/mame/video \\\n"); printf("\t$(OBJ)/mess/audio \\\n"); printf("\t$(OBJ)/mess/drivers \\\n"); printf("\t$(OBJ)/mess/layout \\\n"); printf("\t$(OBJ)/mess/machine \\\n"); printf("\t$(OBJ)/mess/video \\\n"); printf("\n\n"); printf("DRVLIBS += \\\n"); for (librarylist_entry *lib = librarylist; lib != NULL; lib = lib->next) { printf("\t$(OBJ)/target/%s.a \\\n",lib->name.cstr()); } printf("\n"); } // recurse over subdirectories return recurse_dir(srcdir); } }