24 #define _XOPEN_SOURCE 600 27 #include <ucommon-config.h> 32 #define u_int unsigned int 33 #define u_short unsigned short 34 #define u_long unsigned long 35 #define u_char unsigned char 49 #ifdef HAVE_LINUX_VERSION_H 50 #include <linux/version.h> 51 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) 52 #ifdef HAVE_POSIX_FADVISE 53 #undef HAVE_POSIX_FADVISE 64 #ifdef HAVE_POSIX_FADVISE 65 #ifndef POSIX_FADV_RANDOM 66 #undef HAVE_POSIX_FADVISE 80 #ifdef HAVE_SYS_INOTIFY_H 81 #include <sys/inotify.h> 84 #ifdef HAVE_SYS_EVENT_H 85 #include <sys/event.h> 95 struct LOCAL_REPARSE_DATA_BUFFER
98 WORD ReparseDataLength;
102 WORD SubstituteNameOffset;
103 WORD SubstituteNameLength;
104 WORD PrintNameOffset;
105 WORD PrintNameLength;
111 DWORD
err = GetLastError();
115 case ERROR_FILE_NOT_FOUND:
116 case ERROR_PATH_NOT_FOUND:
117 case ERROR_INVALID_NAME:
118 case ERROR_BAD_PATHNAME:
120 case ERROR_TOO_MANY_OPEN_FILES:
122 case ERROR_ACCESS_DENIED:
123 case ERROR_WRITE_PROTECT:
124 case ERROR_SHARING_VIOLATION:
125 case ERROR_LOCK_VIOLATION:
127 case ERROR_INVALID_HANDLE:
129 case ERROR_NOT_ENOUGH_MEMORY:
130 case ERROR_OUTOFMEMORY:
132 case ERROR_INVALID_DRIVE:
134 case ERROR_BAD_DEVICE:
136 case ERROR_NOT_SAME_DEVICE:
138 case ERROR_NOT_SUPPORTED:
139 case ERROR_CALL_NOT_IMPLEMENTED:
141 case ERROR_END_OF_MEDIA:
142 case ERROR_EOM_OVERFLOW:
143 case ERROR_HANDLE_DISK_FULL:
144 case ERROR_DISK_FULL:
146 case ERROR_BAD_NETPATH:
147 case ERROR_BAD_NET_NAME:
149 case ERROR_FILE_EXISTS:
150 case ERROR_ALREADY_EXISTS:
152 case ERROR_CANNOT_MAKE:
153 case ERROR_NOT_OWNER:
155 case ERROR_NO_PROC_SLOTS:
157 case ERROR_BROKEN_PIPE:
160 case ERROR_OPEN_FAILED:
164 case ERROR_IO_DEVICE:
166 case ERROR_NO_SIGNAL_SENT:
168 case ERROR_CHILD_NOT_COMPLETE:
169 case ERROR_SIGNAL_PENDING:
172 case ERROR_DIR_NOT_EMPTY:
174 case ERROR_DIRECTORY:
183 if(!CreateDirectory(path, NULL))
193 return mode(path, perms);
198 SECURITY_ATTRIBUTES sattr;
200 sattr.nLength =
sizeof(SECURITY_ATTRIBUTES);
201 sattr.bInheritHandle = TRUE;
202 sattr.lpSecurityDescriptor = NULL;
204 return CreateFile(
"nul", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, &sattr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
210 SECURITY_ATTRIBUTES sattr;
212 sattr.nLength =
sizeof(SECURITY_ATTRIBUTES);
213 sattr.bInheritHandle = TRUE;
214 sattr.lpSecurityDescriptor = NULL;
216 if(!CreatePipe(&
input, &
output, &sattr, (DWORD)size))
222 int fsys::info(
const char *path,
struct stat *buf)
224 if(_stat(path, (
struct _stat *)(buf)))
242 int fn = _open_osfhandle((intptr_t)(
fd), O_RDONLY);
244 int rtn = _fstat(fn, (
struct _stat *)(buf));
265 int fsys::mode(
const char *path,
unsigned value)
267 if(_chmod(path, value))
274 if(_access(path, F_OK))
281 if(_access(path, R_OK))
288 if(_access(path, W_OK))
295 path = strrchr(path,
'.');
322 DWORD type = GetFileType(
fd);
323 if(type == FILE_TYPE_CHAR)
333 DWORD type = GetFileType(
fd);
336 if(type == FILE_TYPE_CHAR)
346 if(::FindClose(
fd)) {
365 if(::CloseHandle(
fd))
376 snprintf((
char *)buf, len,
ptr->cFileName);
377 rtn = (ssize_t)strlen(
ptr->cFileName);
378 if(!FindNextFile(
fd,
ptr))
390 if(ReadFile(
fd, (LPVOID) buf, (DWORD)len, &count, NULL))
403 if(WriteFile(
fd, (LPVOID) buf, (DWORD)len, &count, NULL))
418 SECURITY_ATTRIBUTES sattr;
420 sattr.nLength =
sizeof(SECURITY_ATTRIBUTES);
421 sattr.bInheritHandle = TRUE;
422 sattr.lpSecurityDescriptor = NULL;
424 return CreateFile(path, GENERIC_READ, FILE_SHARE_READ, &sattr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
429 SECURITY_ATTRIBUTES sattr;
431 sattr.nLength =
sizeof(SECURITY_ATTRIBUTES);
432 sattr.bInheritHandle = TRUE;
433 sattr.lpSecurityDescriptor = NULL;
435 return CreateFile(path, GENERIC_WRITE, 0, &sattr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
440 SECURITY_ATTRIBUTES sattr;
442 sattr.nLength =
sizeof(SECURITY_ATTRIBUTES);
443 sattr.bInheritHandle = TRUE;
444 sattr.lpSecurityDescriptor = NULL;
446 fd_t fd = CreateFile(path, GENERIC_WRITE, 0, &sattr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
449 SetFilePointer(
fd, 0, NULL, FILE_END);
465 DWORD attr = GetFileAttributes(path);
467 if((attr == (DWORD)~0l) || !(attr & FILE_ATTRIBUTE_DIRECTORY)) {
472 snprintf(tpath,
sizeof(tpath),
"%s%s", path,
"\\*");
473 ptr =
new WIN32_FIND_DATA;
474 fd = FindFirstFile(tpath,
ptr);
483 void fsys::open(
const char *path, access_t access)
488 DWORD attr = FILE_ATTRIBUTE_NORMAL;
496 if(isalpha(path[0]) && path[1] ==
':') {
497 if(!QueryDosDevice(path, buf,
sizeof(buf))) {
504 if(!strchr(path,
'/')) {
505 if(path[0] ==
'S' && isdigit(path[1]))
506 snprintf(buf,
sizeof(buf)
"/dev/tty%s", path);
507 else if(strncmp(path,
"USB", 3))
508 snprintf(buf,
sizeof(buf),
"/dev/tty%s", path);
510 snprintf(buf,
sizeof(buf),
"/dev/%s", path);
512 char *cp = strchr(buf,
':');
527 #ifdef FILE_FLAG_SEQUENTIAL_SCAN 528 attr |= FILE_FLAG_SEQUENTIAL_SCAN;
531 amode = GENERIC_READ;
532 smode = FILE_SHARE_READ;
535 amode = GENERIC_WRITE;
538 smode = FILE_SHARE_READ;
539 attr |= FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING;
541 amode = GENERIC_READ | GENERIC_WRITE;
544 attr |= FILE_FLAG_RANDOM_ACCESS;
546 amode = GENERIC_READ | GENERIC_WRITE;
547 smode = FILE_SHARE_READ;
550 amode = GENERIC_WRITE;
554 amode = GENERIC_READ | GENERIC_WRITE;
555 smode = FILE_SHARE_READ | FILE_SHARE_WRITE;
559 fd = CreateFile(path, amode, smode, NULL, OPEN_EXISTING, attr, NULL);
566 void fsys::open(
const char *path,
unsigned fmode, access_t access)
572 DWORD attr = FILE_ATTRIBUTE_NORMAL;
579 const char *cp = strrchr(path,
'\\');
580 const char *cp2 = strrchr(path,
'/');
590 attr = FILE_ATTRIBUTE_HIDDEN;
599 amode = GENERIC_READ;
601 smode = FILE_SHARE_READ;
605 amode = GENERIC_WRITE;
606 cmode = CREATE_ALWAYS;
609 amode = GENERIC_READ | GENERIC_WRITE;
613 attr |= FILE_FLAG_RANDOM_ACCESS;
615 amode = GENERIC_READ | GENERIC_WRITE;
617 smode = FILE_SHARE_READ;
620 amode = GENERIC_WRITE;
625 amode = GENERIC_READ | GENERIC_WRITE;
627 smode = FILE_SHARE_READ | FILE_SHARE_WRITE;
630 fd = CreateFile(path, amode, smode, NULL, cmode, attr, NULL);
647 HANDLE pHandle = GetCurrentProcess();
648 if(!DuplicateHandle(pHandle,
copy.fd, pHandle, &
fd, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
656 HANDLE pHandle = GetCurrentProcess();
659 if(!SetHandleInformation(from, HANDLE_FLAG_INHERIT, 0))
665 if(DuplicateHandle(pHandle, from, pHandle, &
fd, 0, TRUE, DUPLICATE_SAME_ACCESS)) {
676 HANDLE pHandle = GetCurrentProcess();
679 if(!CloseHandle(
fd)) {
684 if(DuplicateHandle(pHandle, from, pHandle, &
fd, 0, FALSE, DUPLICATE_SAME_ACCESS))
695 HANDLE pHandle = GetCurrentProcess();
698 if(!CloseHandle(
fd)) {
703 if(DuplicateHandle(pHandle, from.fd, pHandle, &
fd, 0, FALSE, DUPLICATE_SAME_ACCESS))
721 int mode = FILE_BEGIN;
723 if(rpos == (DWORD)
end) {
727 if(SetFilePointer(
fd, rpos, NULL,
mode) == INVALID_SET_FILE_POINTER) {
739 dirent *entry = ::readdir((DIR *)
ptr);
745 return strlen(entry->d_name);
761 int rtn = ::fsync(
fd);
780 return ::open(
"/dev/null", O_RDWR);
812 if(::closedir((DIR *)
ptr))
836 return ::open(path, O_RDONLY);
841 return ::open(path, O_WRONLY | O_CREAT | O_TRUNC,
EVERYONE);
846 return ::open(path, O_WRONLY | O_CREAT | O_APPEND,
EVERYONE);
868 flags = O_RDONLY | O_CREAT;
872 flags = O_WRONLY | O_CREAT | O_TRUNC;
878 flags = O_RDWR | O_CREAT;
881 flags = O_RDWR | O_APPEND | O_CREAT;
887 #ifdef HAVE_POSIX_FADVISE 890 posix_fadvise(
fd, (off_t)0, (off_t)0, POSIX_FADV_RANDOM);
904 if(::mkdir(path, perms))
929 #if defined(O_STREAMING) 930 flags = O_RDONLY | O_STREAMING;
947 flags = O_RDWR | O_APPEND;
955 #ifdef HAVE_POSIX_FADVISE 958 posix_fadvise(
fd, (off_t)0, (off_t)0, POSIX_FADV_SEQUENTIAL);
960 posix_fadvise(
fd, (off_t)0, (off_t)0, POSIX_FADV_RANDOM);
963 flags = fcntl(
fd, F_GETFL);
965 fcntl(
fd, F_SETFL, flags);
969 int fsys::info(
const char *path,
struct stat *ino)
971 if(::stat(path, ino))
976 #ifdef HAVE_FTRUNCATE 982 if(::ftruncate(
fd, offset) == 0)
998 if(::fstat(
fd, ino)) {
1014 if(NULL == ::getcwd(path, len))
1021 if(::chmod(path, value))
1028 if(::access(path, F_OK))
1036 if(::access(path, R_OK))
1044 if(::access(path, W_OK))
1055 if(::access(path, X_OK))
1075 unsigned long flags;
1077 flags = fcntl(
fd, F_GETFL);
1079 flags &= ~FD_CLOEXEC;
1081 flags |= FD_CLOEXEC;
1082 if(fcntl(
fd, F_SETFL, flags))
1112 #ifdef HAVE_POSIX_FADVISE 1113 if(posix_fadvise(
fd, (off_t)0, size, POSIX_FADV_DONTNEED)) {
1126 unsigned long rpos = pos;
1127 int mode = SEEK_SET;
1129 if(rpos == (
unsigned long)
end) {
1133 if(lseek(
fd, rpos,
mode) == ~0l) {
1193 open(path, fmode, access);
1212 #if defined(_MSWINDOWS_) 1215 char *reparse = (
char *)_malloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
1222 h = CreateFile(path, GENERIC_READ, 0, 0, OPEN_EXISTING,
1223 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0);
1228 memset(reparse, 0, MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
1229 LOCAL_REPARSE_DATA_BUFFER *rb = (LOCAL_REPARSE_DATA_BUFFER*)&reparse;
1231 if(!DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0, (LPVOID *)rb, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &rsize, 0)) {
1239 WideCharToMultiByte(CP_THREAD_ACP, 0, rb->PathBuffer, rb->SubstituteNameLength /
sizeof(WCHAR) + 1,
buffer, (
int)size,
"", FALSE);
1243 #elif defined(HAVE_READLINK) 1244 if(::readlink(path,
buffer, size))
1255 if(!CreateHardLink(target, path, NULL))
1259 if(::
link(path, target))
1267 #if defined(_MSWINDOWS_) 1273 char *reparse = (
char *)_malloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
1277 lstrcpy(dest,
"\\??\\");
1279 if(!GetFullPathName(path,
sizeof(dest) - (4 *
sizeof(TCHAR)), &dest[4], &part) || GetFileAttributes(&dest[4]) == INVALID_FILE_ATTRIBUTES)
1282 LOCAL_REPARSE_DATA_BUFFER *rb = (LOCAL_REPARSE_DATA_BUFFER*)&reparse;
1283 memset(rb, 0, MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
1285 if(!MultiByteToWideChar(CP_THREAD_ACP, MB_PRECOMPOSED, dest, lstrlenA(dest) + 1, rb->PathBuffer, lstrlenA(dest) + 1))
1288 len = lstrlenW(rb->PathBuffer) * 2;
1289 rb->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
1290 rb->ReparseDataLength = len + 12;
1291 rb->SubstituteNameLength = len;
1292 rb->PrintNameOffset = len + 2;
1293 h = CreateFile(target, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
1294 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0);
1297 if(!DeviceIoControl(h, FSCTL_SET_REPARSE_POINT, (LPVOID)rb, rb->ReparseDataLength + FIELD_OFFSET(LOCAL_REPARSE_DATA_BUFFER, SubstituteNameOffset), NULL, 0, &size, 0)) {
1303 #elif defined(HAVE_SYMLINK) 1304 if(::symlink(path, target))
1308 if(::
link(path, target))
1319 h = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
1320 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0);
1322 REPARSE_GUID_DATA_BUFFER rb;
1323 memset(&rb, 0,
sizeof(rb));
1325 rb.ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
1326 if(!DeviceIoControl(h, FSCTL_DELETE_REPARSE_POINT, &rb,
1327 REPARSE_GUID_DATA_BUFFER_HEADER_SIZE, NULL, 0, &size, 0)) {
1357 if(RemoveDirectory(path))
1360 if(
error == ENOTEMPTY)
1365 if(errno != ENOTDIR)
1374 int fsys::copy(
const char *oldpath,
const char *newpath,
size_t size)
1377 char *
buffer =
new char[size];
1379 ssize_t count = (ssize_t)size;
1428 if(::
rename(oldpath, newpath))
1449 return module.
error;
1456 DWORD attr = GetFileAttributes(path);
1457 if(attr == (DWORD)~0l)
1460 if(attr & FILE_ATTRIBUTE_DIRECTORY)
1468 if(::stat(path, &ino))
1480 #if defined(_MSWINDOWS_) 1481 DWORD attr = GetFileAttributes(path);
1482 if (attr == 0xffffffff || !(attr & FILE_ATTRIBUTE_REPARSE_POINT))
1485 #elif defined(HAVE_LSTAT) 1488 if(::lstat(path, &ino))
1503 DWORD attr = GetFileAttributes(path);
1504 if(attr == (DWORD)~0l)
1507 if(attr & FILE_ATTRIBUTE_DIRECTORY)
1515 if(::stat(path, &ino))
1518 if(S_ISDIR(ino.st_mode))
1530 ptr = LoadLibrary(path);
1547 return (
addr_t)GetProcAddress(
ptr, sym);
1550 #elif defined(HAVE_DLFCN_H) 1554 #define RTLD_GLOBAL 0 1560 ptr = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
1580 #elif HAVE_MACH_O_DYLD_H 1581 #include <mach-o/dyld.h> 1585 NSObjectFileImage oImage;
1586 NSSymbol sym = NULL;
1593 if(NSCreateObjectFileImageFromFile(path, &oImage) != NSObjectFileImageSuccess) {
1598 mod = NSLinkModule(oImage, path, NSLINKMODULE_OPTION_BINDNOW | NSLINKMODULE_OPTION_RETURN_ON_ERROR);
1599 NSDestroyObjectFileImage(oImage);
1605 sym = NSLookupSymbolInModule(mod,
"__init");
1607 init = (void (*)(void))NSAddressOfSymbol(sym);
1618 NSModule mod = (NSModule)
ptr;
1623 sym = NSLookupSymbolInModule(mod,
"__fini");
1625 fini = (void (*)(void))NSAddressOfSymbol(sym);
1628 NSUnlinkModule(mod, NSUNLINKMODULE_OPTION_NONE);
1636 NSModule mod = (NSModule)
ptr;
1639 sym = NSLookupSymbolInModule(mod, sym);
1652 ptr = (
void *)shl_load(path, BIND_IMMEDIATE, 0l);
1662 shl_t image = (shl_t)
ptr;
1664 if(shl_findsym(&image, sym, 0, &value) == 0)
1672 shl_t image = (shl_t)
ptr;
1680 void fsys::map(
const char *path)
1706 if(!strncmp(path,
"/dev/", 5))
1711 if(path[1] ==
':' && !path[2] && isalpha(*path))
1714 if(!strncmp(path,
"com", 3) || !strncmp(path,
"lpt", 3)) {
1716 while(isdigit(*path))
1718 if(!path || *path ==
':')
1723 if(!strcmp(path,
"aux") || !strcmp(path,
"prn")) {
1724 if(!path[3] || path[3] ==
':')
1729 if(!strncmp(path,
"\\\\.\\", 4))
1732 if(!
strnicmp(path,
"\\\\?\\Device\\", 12))
1743 DWORD attr = GetFileAttributes(path);
1744 if(attr == (DWORD)~0l)
1747 return ((attr & FILE_ATTRIBUTE_HIDDEN) != 0);
1749 const char *cp = strrchr(path,
'/');
1794 char *cp = _getcwd(NULL, 0);
1809 if(NULL != (getcwd(buf->get(), buf->max())))
1811 if(errno != ERANGE) {