ppr/src/base/stat.c
2026-05-15 02:23:18 +09:00

54 lines
1.1 KiB
C

#include <ppr.h>
#include <ppr_int.h>
int ppr_stat(const char* path, struct ppr_stat* s) {
#if defined(PPR_IS_WIN32)
DWORD attr;
ULARGE_INTEGER mtime;
PPR_FILE* f;
FILETIME ft;
if((attr = GetFileAttributes(path)) == INVALID_FILE_ATTRIBUTES) return -1;
f = ppr_fopen(path, "r"); /* :))))))) */
GetFileTime((HANDLE)f, NULL, NULL, &ft);
memcpy(&mtime, &ft, sizeof(mtime));
s->st_size = 0;
s->st_modtime = (mtime.QuadPart / 10000000) / 11644473600;
s->st_mode = 0;
s->st_mode |= PPR_S_IFREG;
if(attr & FILE_ATTRIBUTE_DIRECTORY) {
s->st_mode &= ~PPR_S_IFREG;
s->st_mode |= PPR_S_IFDIR;
}
if(PPR_S_ISREG(s->st_mode)) {
s->st_size = GetFileSize((HANDLE)f, NULL);
}
ppr_fclose(f);
return 0;
#elif defined(PPR_IS_UNIX) || defined(PPR_IS_NETWARE)
struct stat st;
int sc;
sc = stat(path, &st);
if(sc != 0) return sc;
s->st_size = st.st_size;
s->st_modtime = st.st_mtime;
s->st_mode = 0;
if(S_ISREG(st.st_mode)) s->st_mode |= PPR_S_IFREG;
if(S_ISDIR(st.st_mode)) s->st_mode |= PPR_S_IFDIR;
return sc;
#else
return -1;
#endif
}