static unsigned char GetModsDirNames(GtkListStore *list) { char *homedir; char pdir[BMAX_PATH]; unsigned char iternumb = 0; CACHE1D_FIND_REC *dirs = NULL; GtkTreeIter iter; pathsearchmode = 1; if ((homedir = Bgethomedir())) { Bsnprintf(pdir, sizeof(pdir), "%s/" ".eduke32", homedir); dirs = klistpath(pdir, "*", CACHE1D_FIND_DIR); for (dirs=dirs; dirs != NULL; dirs=dirs->next) { if ((Bstrcmp(dirs->name, "autoload") == 0) || (Bstrcmp(dirs->name, "..") == 0) || (Bstrcmp(dirs->name, ".") == 0)) continue; else { gtk_list_store_append(list, &iter); gtk_list_store_set(list, &iter, 0,dirs->name, -1); iternumb++; } } } klistfree(dirs); dirs = NULL; return iternumb; }
char *Bgetappdir(void) { char *dir = NULL; #ifdef _WIN32 TCHAR appdir[MAX_PATH]; if (GetModuleFileName(NULL, appdir, MAX_PATH) > 0) { // trim off the filename char *slash = Bstrrchr(appdir, '\\'); if (slash) slash[0] = 0; dir = Bstrdup(appdir); } #elif defined EDUKE32_OSX dir = osx_getappdir(); #elif defined __FreeBSD__ // the sysctl should also work when /proc/ is not mounted (which seems to // be common on FreeBSD), so use it.. char buf[PATH_MAX] = {0}; int name[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; size_t len = sizeof(buf)-1; int ret = sysctl(name, sizeof(name)/sizeof(name[0]), buf, &len, NULL, 0); if(ret == 0 && buf[0] != '\0') { // again, remove executable name with dirname() // on FreeBSD dirname() seems to use some internal buffer dir = strdup(dirname(buf)); } #elif defined __linux || defined EDUKE32_BSD char buf[PATH_MAX] = {0}; char buf2[PATH_MAX] = {0}; # ifdef __linux Bsnprintf(buf, sizeof(buf), "/proc/%d/exe", getpid()); # else // the BSDs.. except for FreeBSD which has a sysctl Bsnprintf(buf, sizeof(buf), "/proc/%d/file", getpid()); # endif int len = readlink(buf, buf2, sizeof(buf2)); if (len != -1) { // remove executable name with dirname(3) // on Linux, dirname() will modify buf2 (cutting off executable name) and return it // on FreeBSD it seems to use some internal buffer instead.. anyway, just strdup() dir = Bstrdup(dirname(buf2)); } #endif return dir; }
// Copy FN to WBUF and append an extension if it's not there, which is checked // case-insensitively. // Returns: 1 if not all characters could be written to WBUF, 0 else. int32_t maybe_append_ext(char *wbuf, int32_t wbufsiz, const char *fn, const char *ext) { const int32_t slen=Bstrlen(fn), extslen=Bstrlen(ext); const int32_t haveext = (slen>=extslen && Bstrcasecmp(&fn[slen-extslen], ext)==0); Bassert((intptr_t)wbuf != (intptr_t)fn); // no aliasing // If 'fn' has no extension suffixed, append one. return (Bsnprintf(wbuf, wbufsiz, "%s%s", fn, haveext ? "" : ext) >= wbufsiz); }