8#include "string/string.h"
14#define CU_INVALID_HANDLE -1
18typedef HANDLE cu_Handle;
19#define CU_INVALID_HANDLE INVALID_HANDLE_VALUE
23#define CU_FILE_MAX_PATH_LENGTH 4096
25#define CU_FILE_MAX_PATH_LENGTH 260
29#define CU_PATH_SEPARATOR '\\'
31#define CU_PATH_SEPARATOR '/'
37 CU_FILE_TYPE_DIRECTORY,
39 CU_FILE_TYPE_NAMED_PIPE,
40 CU_FILE_TYPE_BLOCK_DEVICE,
41 CU_FILE_TYPE_CHAR_DEVICE,
44 CU_FILE_TYPE_EVENT_PORT,
49 unsigned long long size;
57static inline void cu_File_Stat_destroy(
cu_File_Stat *stat) {
58 cu_String_destroy(&stat->path);
59 cu_Memory_memset(stat, 0,
sizeof(*stat));
65static inline cu_File_Stat cu_File_Stat_from_handle(cu_Handle handle) {
67 cu_Memory_memset(&st, 0,
sizeof(st));
69 cu_Memory_memset(&out, 0,
sizeof(out));
70 if (fstat(handle, &st) != 0) {
74 out.size = (
unsigned long long)st.st_size;
75 out.mode = (
unsigned int)st.st_mode;
77 if (S_ISREG(st.st_mode)) {
78 out.kind = CU_FILE_TYPE_FILE;
79 }
else if (S_ISDIR(st.st_mode)) {
80 out.kind = CU_FILE_TYPE_DIRECTORY;
81 }
else if (S_ISCHR(st.st_mode)) {
82 out.kind = CU_FILE_TYPE_CHAR_DEVICE;
83 }
else if (S_ISBLK(st.st_mode)) {
84 out.kind = CU_FILE_TYPE_BLOCK_DEVICE;
85 }
else if (S_ISFIFO(st.st_mode)) {
86 out.kind = CU_FILE_TYPE_NAMED_PIPE;
87 }
else if (S_ISLNK(st.st_mode)) {
88 out.kind = CU_FILE_TYPE_SYMLINK;
90 }
else if (S_ISSOCK(st.st_mode)) {
91 out.kind = CU_FILE_TYPE_SOCKET;
94 }
else if ((st.st_mode & S_IFMT) == S_IFDOOR) {
95 out.kind = CU_FILE_TYPE_DOOR;
98 }
else if ((st.st_mode & S_IFMT) == S_IFPORT) {
99 out.kind = CU_FILE_TYPE_EVENT_PORT;
102 out.kind = CU_FILE_TYPE_UNKNOWN;
106 out.atime = (
long long)st.st_atimespec.tv_sec * CU_TIME_NS_PER_SEC +
107 st.st_atimespec.tv_nsec;
108 out.mtime = (
long long)st.st_mtimespec.tv_sec * CU_TIME_NS_PER_SEC +
109 st.st_mtimespec.tv_nsec;
110 out.ctime = (
long long)st.st_ctimespec.tv_sec * CU_TIME_NS_PER_SEC +
111 st.st_ctimespec.tv_nsec;
112#elif defined(_STATBUF_ST_NSEC) && defined(st_atim)
114 (
long long)st.st_atim.tv_sec * CU_TIME_NS_PER_SEC + st.st_atim.tv_nsec;
116 (
long long)st.st_mtim.tv_sec * CU_TIME_NS_PER_SEC + st.st_mtim.tv_nsec;
118 (
long long)st.st_ctim.tv_sec * CU_TIME_NS_PER_SEC + st.st_ctim.tv_nsec;
119#elif defined(_STATBUF_ST_NSEC)
120 out.atime = (
long long)st.st_atime * CU_TIME_NS_PER_SEC + st.st_atimensec;
121 out.mtime = (
long long)st.st_mtime * CU_TIME_NS_PER_SEC + st.st_mtimensec;
122 out.ctime = (
long long)st.st_ctime * CU_TIME_NS_PER_SEC + st.st_ctimensec;
124 out.atime = (
long long)st.st_atime * CU_TIME_NS_PER_SEC;
125 out.mtime = (
long long)st.st_mtime * CU_TIME_NS_PER_SEC;
126 out.ctime = (
long long)st.st_ctime * CU_TIME_NS_PER_SEC;
133static inline cu_File_Stat cu_File_Stat_from_handle(cu_Handle handle) {
134 BY_HANDLE_FILE_INFORMATION info;
136 cu_Memory_memset(&out, 0,
sizeof(out));
137 if (!GetFileInformationByHandle(handle, &info)) {
141 size.HighPart = info.nFileSizeHigh;
142 size.LowPart = info.nFileSizeLow;
144 out.size = (
unsigned long long)size.QuadPart;
145 out.mode = info.dwFileAttributes;
146 if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
147 out.kind = CU_FILE_TYPE_DIRECTORY;
148 }
else if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
149 out.kind = CU_FILE_TYPE_SYMLINK;
151 out.kind = CU_FILE_TYPE_FILE;
154 out.mtime = cu_Time_filetime_to_unix(info.ftLastWriteTime);
155 out.ctime = cu_Time_filetime_to_unix(info.ftCreationTime);
156 out.atime = cu_Time_filetime_to_unix(info.ftLastAccessTime);
162static inline cu_IoSize_Result cu_Fd_tell(cu_Handle handle) {
164 off_t pos = lseek(handle, 0, SEEK_CUR);
165 if (pos == (off_t)-1) {
166 return cu_IoSize_Result_error(cu_Io_Error_from_errno(errno));
168 return cu_IoSize_Result_ok((
size_t)pos);
170 long long pos = _lseeki64(handle, 0, SEEK_CUR);
172 return cu_IoSize_Result_error(cu_Io_Error_from_win32(GetLastError()));
174 return cu_IoSize_Result_ok((
size_t)pos);
Dynamically allocated UTF-8 string.
Definition string.h:24