ptlib.cxx

来自「pwlib源码库」· CXX 代码 · 共 1,293 行 · 第 1/3 页

CXX
1,293
字号
      info.type = PFileInfo::SubDirectory;      info.permissions |= PFileInfo::UserExecute|PFileInfo::GroupExecute|PFileInfo::WorldExecute;    }    else    {      info.type = PFileInfo::RegularFile;    }    info.hidden = (FInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)!=0;    res=true;  }    CloseHandle(hFile);  return res;}#else // !_WIN32_WCE#if defined(_WIN32)static void TwiddleBits(int newPermissions,                        int & oldPermissions,                        int permission,                        DWORD & mask,                        DWORD access){  if (newPermissions < 0) {    if ((mask&access) == access)      oldPermissions |= permission;  }  else {    if ((newPermissions&permission) != 0)      mask |= access;    else      mask &= ~access;  }}static int FileSecurityPermissions(const PFilePath & filename, int newPermissions){  // All of the following is to support cygwin style permissions  PBYTEArray storage(sizeof(SECURITY_DESCRIPTOR));  SECURITY_DESCRIPTOR * descriptor = (SECURITY_DESCRIPTOR *)storage.GetPointer();  DWORD lengthNeeded = 0;  if (!GetFileSecurity(filename,                       DACL_SECURITY_INFORMATION,                       descriptor,                       storage.GetSize(),                       &lengthNeeded)) {    if (GetLastError() != ERROR_INSUFFICIENT_BUFFER || lengthNeeded == 0)      return -1;    descriptor = (SECURITY_DESCRIPTOR *)storage.GetPointer(lengthNeeded);    if (!GetFileSecurity(filename,                         DACL_SECURITY_INFORMATION,                         descriptor,                         storage.GetSize(),                         &lengthNeeded))      return -1;  }  BOOL daclPresent, daclDefaulted;  PACL dacl;  if (!GetSecurityDescriptorDacl(descriptor, &daclPresent, &dacl, &daclDefaulted))    return -1;  if (!daclPresent || daclDefaulted || dacl == NULL)    return -1;  ACL_SIZE_INFORMATION aclSize;  if (!GetAclInformation(dacl, &aclSize, sizeof(aclSize), AclSizeInformation))    return -1;  int oldPermissions = 0;  int cygwinMask = 0;  for (DWORD aceIndex = 0; aceIndex< aclSize.AceCount; aceIndex++) {    LPVOID acePtr;    GetAce(dacl, aceIndex, &acePtr);    ACE_HEADER * aceHdr = (ACE_HEADER *)acePtr;    if (aceHdr->AceType == ACCESS_ALLOWED_ACE_TYPE) {      ACCESS_ALLOWED_ACE * ace = (ACCESS_ALLOWED_ACE *)acePtr;      PString account, domain;      DWORD accountLen = 1000;      DWORD domainLen = 1000;      SID_NAME_USE usage;      if (LookupAccountSid(NULL, &ace->SidStart,                           account.GetPointer(1000), &accountLen,                           domain.GetPointer(1000), &domainLen,                           &usage)) {        if (account *= "None") {          cygwinMask |= 2;          TwiddleBits(newPermissions, oldPermissions, PFileInfo::WorldRead,                      ace->Mask, FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA);          TwiddleBits(newPermissions, oldPermissions, PFileInfo::WorldWrite,                      ace->Mask, FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA);          TwiddleBits(newPermissions, oldPermissions, PFileInfo::WorldExecute,                      ace->Mask, FILE_EXECUTE);        }        else if (account *= "EVERYONE") {          cygwinMask |= 1;          TwiddleBits(newPermissions, oldPermissions, PFileInfo::GroupRead,                      ace->Mask, FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA);          TwiddleBits(newPermissions, oldPermissions, PFileInfo::GroupWrite,                      ace->Mask, FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA);          TwiddleBits(newPermissions, oldPermissions, PFileInfo::GroupExecute,                      ace->Mask, FILE_EXECUTE);        }        else if (account == PProcess::Current().GetUserName()) {          cygwinMask |= 4;          TwiddleBits(newPermissions, oldPermissions, PFileInfo::UserRead,                      ace->Mask, FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA);          TwiddleBits(newPermissions, oldPermissions, PFileInfo::UserWrite,                      ace->Mask, FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA);          TwiddleBits(newPermissions, oldPermissions, PFileInfo::UserExecute,                      ace->Mask, FILE_EXECUTE);        }      }    }  }  // Only do it if have the three ACE entries as per cygwin  if (cygwinMask != 7)    return -1;  if (newPermissions != -1)    SetFileSecurity(filename, DACL_SECURITY_INFORMATION, descriptor);  return oldPermissions;}#endifBOOL PFile::GetInfo(const PFilePath & name, PFileInfo & info){  if (name.IsEmpty())    return FALSE;  PString fn = name;  PINDEX pos = fn.GetLength()-1;  while (PDirectory::IsSeparator(fn[pos]))    pos--;  fn.Delete(pos+1, P_MAX_INDEX);  struct stat s;  if (stat(fn, &s) != 0)    return FALSE;  info.created =  (s.st_ctime < 0) ? 0 : s.st_ctime;  info.modified = (s.st_mtime < 0) ? 0 : s.st_mtime;  info.accessed = (s.st_atime < 0) ? 0 : s.st_atime;  info.size = s.st_size;#if defined(_WIN32)  info.permissions = FileSecurityPermissions(name, -1);  if (info.permissions < 0)#endif  {    info.permissions = 0;    if ((s.st_mode&S_IREAD) != 0)      info.permissions |= PFileInfo::UserRead|PFileInfo::GroupRead|PFileInfo::WorldRead;    if ((s.st_mode&S_IWRITE) != 0)      info.permissions |= PFileInfo::UserWrite|PFileInfo::GroupWrite|PFileInfo::WorldWrite;    if ((s.st_mode&S_IEXEC) != 0)      info.permissions |= PFileInfo::UserExecute|PFileInfo::GroupExecute|PFileInfo::WorldExecute;  }  switch (s.st_mode & S_IFMT) {    case S_IFREG :      info.type = PFileInfo::RegularFile;      break;    case S_IFDIR :      info.type = PFileInfo::SubDirectory;      break;    default:      info.type = PFileInfo::UnknownFileType;      break;  }#if defined(_WIN32)  info.hidden = (GetFileAttributes(name) & FILE_ATTRIBUTE_HIDDEN) != 0;#else  unsigned int attr;  _dos_getfileattr(name, &attr);  info.hidden = (attr & _A_HIDDEN) != 0;#endif  return TRUE;}#endif // _WIN32_WCEBOOL PFile::SetPermissions(const PFilePath & name, int permissions){#if defined(_WIN32) && !defined(_WIN32_WCE)  FileSecurityPermissions(name, permissions);#endif  return _chmod(name, permissions&(_S_IWRITE|_S_IREAD)) == 0;}BOOL PFile::IsTextFile() const{  return FALSE;}BOOL PFile::Open(OpenMode mode, int opts){  Close();  clear();  if (path.IsEmpty())    path = PFilePath("PWL", NULL);  int oflags = IsTextFile() ? _O_TEXT : _O_BINARY;  switch (mode) {    case ReadOnly :      oflags |= O_RDONLY;      if (opts == ModeDefault)        opts = MustExist;      break;    case WriteOnly :      oflags |= O_WRONLY;      if (opts == ModeDefault)        opts = Create|Truncate;      break;    case ReadWrite :      oflags |= O_RDWR;      if (opts == ModeDefault)        opts = Create;      break;    default :      PAssertAlways(PInvalidParameter);  }  if ((opts&Create) != 0)    oflags |= O_CREAT;  if ((opts&Exclusive) != 0)    oflags |= O_EXCL;  if ((opts&Truncate) != 0)    oflags |= O_TRUNC;  if ((opts&Temporary) != 0)    removeOnClose = TRUE;  int sflags = _SH_DENYNO;  if ((opts&DenySharedRead) == DenySharedRead)    sflags = _SH_DENYRD;  else if ((opts&DenySharedWrite) == DenySharedWrite)    sflags = _SH_DENYWR;  else if ((opts&(DenySharedRead|DenySharedWrite)) != 0)    sflags = _SH_DENYWR;  os_handle = _sopen(path, oflags, sflags, S_IREAD|S_IWRITE);  // As ConvertOSError tests for < 0 and some return values _sopen may be  // negative, only pass -1 through.  return ConvertOSError(os_handle == -1 ? -1 : 0);}BOOL PFile::SetLength(off_t len){  return ConvertOSError(_chsize(GetHandle(), len));}///////////////////////////////////////////////////////////////////////////////// PTextFileBOOL PTextFile::IsTextFile() const{  return TRUE;}BOOL PTextFile::ReadLine(PString & str){  char * ptr = str.GetPointer(100);  PINDEX len = 0;  int c;  while ((c = ReadChar()) >= 0 && c != '\n') {    *ptr++ = (char)c;    if (++len >= str.GetSize())      ptr = str.GetPointer(len + 100) + len;  }  *ptr = '\0';  PAssert(str.MakeMinimumSize(), POutOfMemory);  return c >= 0 || len > 0;}BOOL PTextFile::WriteLine(const PString & str){  return WriteString(str) && WriteChar('\n');}///////////////////////////////////////////////////////////////////////////////// PConsoleChannelPConsoleChannel::PConsoleChannel(){}PConsoleChannel::PConsoleChannel(ConsoleType type){  Open(type);}BOOL PConsoleChannel::Open(ConsoleType type){  switch (type) {    case StandardInput :      os_handle = 0;      return TRUE;    case StandardOutput :      os_handle = 1;      return TRUE;    case StandardError :      os_handle = 2;      return TRUE;  }  return FALSE;}PString PConsoleChannel::GetName() const{  return "\\\\.\\Console";}BOOL PConsoleChannel::Read(void * buffer, PINDEX length){  flush();  lastReadCount = _read(os_handle, buffer, length);  return ConvertOSError(lastReadCount, LastReadError) && lastReadCount > 0;}BOOL PConsoleChannel::Write(const void * buffer, PINDEX length){  flush();  lastWriteCount = _write(os_handle, buffer, length);  return ConvertOSError(lastWriteCount, LastWriteError) && lastWriteCount >= length;}BOOL PConsoleChannel::Close(){  os_handle = -1;  return TRUE;}///////////////////////////////////////////////////////////////////////////////// PProcessvoid PProcess::Construct(){  PSetErrorStream(&cerr);#if !defined(_WIN32) && defined(_MSC_VER) && defined(_WINDOWS)  _wsetscreenbuf(1, _WINBUFINF);  _wsizeinfo ws;  ws._version = _QWINVER;  ws._type = _WINSIZEMAX;  _wsetsize(1, &ws);#endif  houseKeeper = NULL;}BOOL PProcess::SetMaxHandles(int /*newLimit*/){  // Not applicable  return TRUE;}//////////////////////////////////////////////////////////////////////////////#define INCLUDE_STUFF1(cls) \  cls i##cls; \  i##cls = i##cls#define INCLUDE_STUFF2(cls) \  INCLUDE_STUFF1(cls); \  i##cls.GetPointer(); \  i##cls.Attach(0, 0); \  i##cls.SetAt(0, 0); \  i##cls.GetAt(0); \  i##cls[0]void PDummyFunctionToMakeSureSymbolsAreInDEFFile(){  INCLUDE_STUFF2(PCharArray);  INCLUDE_STUFF2(PShortArray);  INCLUDE_STUFF2(PIntArray);  INCLUDE_STUFF2(PLongArray);  INCLUDE_STUFF2(PBYTEArray);  INCLUDE_STUFF2(PWORDArray);  INCLUDE_STUFF2(PUnsignedArray);  INCLUDE_STUFF2(PDWORDArray);  INCLUDE_STUFF1(PStringSet);  INCLUDE_STUFF1(POrdinalToString);  INCLUDE_STUFF1(PStringToOrdinal);  INCLUDE_STUFF1(PStringToString);}// End Of File ///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?