static int DIR_isSymLink(dvoid *opaque, const char *name, int *fileExists) { char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL); int retval = 0; BAIL_IF_MACRO(f == NULL, NULL, 0); *fileExists = __PHYSFS_platformExists(f); if (*fileExists) retval = __PHYSFS_platformIsSymLink(f); allocator.Free(f); return(retval); } /* DIR_isSymLink */
static int DIR_isSymLink(DirHandle *h, const char *name, int *fileExists) { char *f = __PHYSFS_platformCvtToDependent((char *)(h->opaque), name, NULL); int retval = 0; BAIL_IF_MACRO(f == NULL, NULL, 0); *fileExists = __PHYSFS_platformExists(f); if (*fileExists) retval = __PHYSFS_platformIsSymLink(f); free(f); return(retval); } /* DIR_isSymLink */
LinkedStringList *__PHYSFS_platformEnumerateFiles(const char *dirname, int omitSymLinks) { LinkedStringList *retval = NULL, *p = NULL; DIR *dir; struct dirent *ent; int bufsize = 0; char *buf = NULL; int dlen = 0; if (omitSymLinks) { dlen = strlen(dirname); bufsize = dlen + 256; buf = (char *) malloc(bufsize); BAIL_IF_MACRO(buf == NULL, ERR_OUT_OF_MEMORY, NULL); strcpy(buf, dirname); if (buf[dlen - 1] != '/') { buf[dlen++] = '/'; buf[dlen] = '\0'; } /* if */ } /* if */ errno = 0; dir = opendir(dirname); if (dir == NULL) { if (buf != NULL) free(buf); BAIL_IF_MACRO(1, strerror(errno), NULL); } /* if */ while ((ent = readdir(dir)) != NULL) { if (strcmp(ent->d_name, ".") == 0) continue; if (strcmp(ent->d_name, "..") == 0) continue; if (omitSymLinks) { char *p; int len = strlen(ent->d_name) + dlen + 1; if (len > bufsize) { p = realloc(buf, len); if (p == NULL) continue; buf = p; bufsize = len; } /* if */ strcpy(buf + dlen, ent->d_name); if (__PHYSFS_platformIsSymLink(buf)) continue; } /* if */ retval = __PHYSFS_addToLinkedStringList(retval, &p, ent->d_name, -1); } /* while */ if (buf != NULL) free(buf); closedir(dir); return(retval); } /* __PHYSFS_platformEnumerateFiles */
bool ex_os_isfile ( const char *_path ) { if ( __PHYSFS_platformExists(_path) == false ) { return false; } return (__PHYSFS_platformIsSymLink(_path) || __PHYSFS_platformIsDirectory(_path)) ? false : true; }
bool ex_os_issymlink ( const char *_path ) { return __PHYSFS_platformIsSymLink(_path); }
void __PHYSFS_platformEnumerateFiles(const char *dirname, int omitSymLinks, PHYSFS_EnumFilesCallback callback, const char *origdir, void *callbackdata) { DIR *dir; struct dirent *ent; int bufsize = 0; char *buf = NULL; int dlen = 0; if (omitSymLinks) /* !!! FIXME: this malloc sucks. */ { dlen = strlen(dirname); bufsize = dlen + 256; buf = (char *) allocator.Malloc(bufsize); if (buf == NULL) return; strcpy(buf, dirname); if (buf[dlen - 1] != '/') { buf[dlen++] = '/'; buf[dlen] = '\0'; } /* if */ } /* if */ errno = 0; dir = opendir(dirname); if (dir == NULL) { allocator.Free(buf); return; } /* if */ while ((ent = readdir(dir)) != NULL) { if (strcmp(ent->d_name, ".") == 0) continue; if (strcmp(ent->d_name, "..") == 0) continue; if (omitSymLinks) { char *p; int len = strlen(ent->d_name) + dlen + 1; if (len > bufsize) { p = (char *) allocator.Realloc(buf, len); if (p == NULL) continue; buf = p; bufsize = len; } /* if */ strcpy(buf + dlen, ent->d_name); if (__PHYSFS_platformIsSymLink(buf)) continue; } /* if */ callback(callbackdata, origdir, ent->d_name); } /* while */ allocator.Free(buf); closedir(dir); } /* __PHYSFS_platformEnumerateFiles */