koh_stat.c

939 B · raw

1#include "koh_stat.h"23#include <sys/stat.h>45#if defined(__APPLE__)6#define KOH_SEC_NS(tv) ((long long)(tv).tv_sec * 1000000000LL + (long long)(tv).tv_nsec)7#define KOH_MTIME_NS(st) KOH_SEC_NS((st).st_mtimespec)8#define KOH_CTIME_NS(st) KOH_SEC_NS((st).st_ctimespec)9#else10#define KOH_SEC_NS(tv) ((long long)(tv).tv_sec * 1000000000LL + (long long)(tv).tv_nsec)11#define KOH_MTIME_NS(st) KOH_SEC_NS((st).st_mtim)12#define KOH_CTIME_NS(st) KOH_SEC_NS((st).st_ctim)13#endif1415int koh_lstat(const char *path, koh_stat *out) {16	struct stat st;17	if (lstat(path, &st) != 0) {18		out->kind = 0;19		return 0;20	}21	out->size = (long long)st.st_size;22	out->mtime_ns = KOH_MTIME_NS(st);23	out->ctime_ns = KOH_CTIME_NS(st);24	out->mode = (unsigned int)st.st_mode;25	switch (st.st_mode & S_IFMT) {26		case S_IFREG: out->kind = 1; break;27		case S_IFDIR: out->kind = 2; break;28		case S_IFLNK: out->kind = 3; break;29		default: out->kind = 4; break;30	}31	return 1;32}