stat.c
来自「俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)」· C语言 代码 · 共 273 行
C
273 行
#include <stdlib.h>#include <stddef.h>#include <stdio.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <sys/wcebase.h>#include <sys/wceerror.h>#include <sys/wcefile.h>#include <sys/wcetrace.h>#include <sys/io.h>int_fstat_r(struct _reent *reent, int fd, struct stat *st) { BY_HANDLE_FILE_INFORMATION fi; SYSTEMTIME systemTime; FILETIME localFileTime; HANDLE hnd; int permission = 0; WCETRACE(WCE_IO, "fstat(%d)", fd); FDCHECK(fd); memset(st, 0, sizeof(struct stat)); if (_fdtab[fd].type == IO_FILE_TYPE_CONSOLE || _fdtab[fd].type == IO_FILE_TYPE_FIFO) { st->st_size = 0; st->st_mode = S_IFCHR; permission = S_IREAD|S_IWRITE; st->st_mode |= permission | (permission >> 3) | (permission >> 6); return(0); } else if(_fdtab[fd].type == IO_FILE_TYPE_NULL) { st->st_size = 0; st->st_mode = S_IFREG; permission = S_IREAD|S_IWRITE; st->st_mode |= permission | (permission >> 3) | (permission >> 6); return(0); } else if(_fdtab[fd].type != IO_FILE_TYPE_FILE) { WCETRACE(WCE_IO, "fstat on invalid file type"); errno = EINVAL; return(-1); } hnd = _fdtab[fd].hnd; memset(&fi, 0, sizeof(BY_HANDLE_FILE_INFORMATION)); if(0==GetFileInformationByHandle(hnd, &fi)) { /* mamaich: fstat on RAR archive */ int Pos=lseek(fd,0,SEEK_CUR); st->st_mode = S_IFREG; st->st_size = lseek(fd,0,SEEK_END); lseek(fd,Pos,SEEK_SET); permission = S_IREAD|S_IWRITE; st->st_mode |= permission | (permission >> 3) | (permission >> 6); return 0; } st->st_size = fi.nFileSizeLow; st->st_mode = S_IFREG; if(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) st->st_mode = S_IFDIR; permission |= S_IREAD; if(!(fi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) permission |= S_IWRITE; if(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) permission |= S_IEXEC; st->st_mode |= permission | (permission >> 3) | (permission >> 6); FileTimeToLocalFileTime(&fi.ftLastWriteTime, &localFileTime); FileTimeToSystemTime(&localFileTime, &systemTime); st->st_mtime = _systotime_t(systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, -1); FileTimeToLocalFileTime(&fi.ftCreationTime, &localFileTime); FileTimeToSystemTime(&localFileTime, &systemTime); st->st_ctime = _systotime_t(systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, -1); FileTimeToLocalFileTime(&fi.ftLastAccessTime, &localFileTime); FileTimeToSystemTime(&localFileTime, &systemTime); st->st_atime = _systotime_t(systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, -1); if(st->st_atime == 0) st->st_atime = st->st_mtime; if (st->st_ctime == 0) st->st_ctime = st->st_mtime; if(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) st->st_nlink = 2; else st->st_nlink = fi.nNumberOfLinks; /* Only low seems to be used... */ /* printf("Low: %d High: %d\n", fi.nFileIndexLow, fi.nFileIndexHigh); */ st->st_rdev = 1; st->st_ino = fi.nFileIndexLow; return 0;}int_stat_r(struct _reent *reent, const char *path, struct stat *st){ WIN32_FIND_DATAW fdw; HANDLE hnd; SYSTEMTIME systemTime; FILETIME localFileTime; int permission = 0; char fpath[MAX_PATH]; wchar_t fpathw[MAX_PATH]; WCETRACE(WCE_IO, "stat(%s)", path); memset(st, 0, sizeof(struct stat)); fixpath(path, fpath); /* Handle root directory as a special case */ if (strcmp(fpath, "\\") == 0 || strcmp(fpath, "/") == 0) { st->st_size = 1024; st->st_mode = S_IFDIR; permission = S_IREAD|S_IWRITE|S_IEXEC; st->st_mode |= permission | (permission >> 3) | (permission >> 6); return(0); } mbstowcs(fpathw, fpath, MAX_PATH); if ((hnd = FindFirstFileW(fpathw, &fdw)) == INVALID_HANDLE_VALUE) { DWORD dwError = GetLastError(); if (dwError == ERROR_NO_MORE_FILES) { errno = ENOENT; } else { errno = _winerr2errno(GetLastError()); } WCETRACE(WCE_IO, "stat: FindFile(%s): errno = %d oserr = %d", fpath, errno, GetLastError()); return(-1); } if (fdw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { st->st_size = 1024; } else { st->st_size = fdw.nFileSizeLow; } if (fdw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { st->st_mode = S_IFDIR; } else { st->st_mode = S_IFREG; } permission |= S_IREAD; if (!(fdw.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) permission |= S_IWRITE; if (fdw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) permission |= S_IEXEC; st->st_mode |= permission | (permission >> 3) | (permission >> 6); FileTimeToLocalFileTime(&fdw.ftLastWriteTime, &localFileTime); FileTimeToSystemTime(&localFileTime, &systemTime); st->st_mtime = _systotime_t(systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, -1); FileTimeToLocalFileTime(&fdw.ftCreationTime, &localFileTime); FileTimeToSystemTime(&localFileTime, &systemTime); st->st_ctime = _systotime_t(systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, -1); FileTimeToLocalFileTime(&fdw.ftLastAccessTime, &localFileTime); FileTimeToSystemTime(&localFileTime, &systemTime); st->st_atime = _systotime_t(systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, -1); if(st->st_atime == 0) st->st_atime = st->st_mtime; if (st->st_ctime == 0) st->st_ctime = st->st_mtime; if(fdw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) st->st_nlink = 2; else st->st_nlink = 1; st->st_rdev = 1; st->st_ino = 0; FindClose(hnd); return(0);}intlstat(const char *path, struct stat *st){ return _stat_r(_impure_ptr, path, st);}intchmod(const char *fpath, mode_t mode){ int len; DWORD attr; wchar_t fpathw[MAX_PATH]; char pathbuf[MAX_PATH]; if (fpath == NULL || (len = strlen(fpath) == 0) || len > MAX_PATH-1) { errno = EINVAL; WCETRACE(WCE_IO, "chmod: called w/invalid path"); return(-1); } WCETRACE(WCE_IO, "chmod %s %o", fpath, mode); fixpath(fpath, pathbuf); mbstowcs(fpathw, pathbuf, MAX_PATH); if ((attr = GetFileAttributesW(fpathw)) == 0xFFFFFFFF) { errno =_winerr2errno(GetLastError()); WCETRACE(WCE_IO, "chmod: GetFileAttributesW errno %d winerr %d", errno, GetLastError()); return(-1); } if (mode & S_IWRITE) { attr &= ~(FILE_ATTRIBUTE_READONLY); } else { attr |= (FILE_ATTRIBUTE_READONLY); } WCETRACE(WCE_IO, "chmod: calling SetFileAttributesW, attr %u"); if (SetFileAttributesW(fpathw, attr) == FALSE) { errno =_winerr2errno(GetLastError()); WCETRACE(WCE_IO, "chmod: SetFileAttributesW errno %d winerr %d", errno, GetLastError()); return(-1); } return(0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?