bool CStdInStream::Open(LPCTSTR fileName) throw() { Close(); // _stream = _tfopen(fileName, kFileOpenMode); #ifdef _UNICODE AString aStr = UnicodeStringToMultiByte(fileName, CP_ACP); // FIXME const char * name = nameWindowToUnix(aStr); #else const char * name = nameWindowToUnix(fileName); #endif _stream = fopen(name, "r"); _streamIsOpen = (_stream != 0); return _streamIsOpen; }
bool CFindFile::FindFirst(CFSTR cfWildcard, CFileInfo &fi, bool ignoreLink) { if (!Close()) return false; AString Awildcard = UnicodeStringToMultiByte(cfWildcard, CP_ACP); const char * wildcard = (const char *)Awildcard; if ((!wildcard) || (wildcard[0]==0)) { SetLastError(ERROR_PATH_NOT_FOUND); return false; } my_windows_split_path(nameWindowToUnix(wildcard),_directory,_pattern); TRACEN((printf("CFindFile::FindFirst : %s (dirname=%s,pattern=%s)\n",wildcard,(const char *)_directory,(const char *)_pattern))) _dirp = ::opendir((const char *)_directory); TRACEN((printf("CFindFile::FindFirst : opendir=%p\n",_dirp))) if ((_dirp == 0) && (global_use_utf16_conversion)) { // Try to recover the original filename UString ustr = MultiByteToUnicodeString(_directory, 0); AString resultString; bool is_good = originalFilename(ustr, resultString); if (is_good) { _dirp = ::opendir((const char *)resultString); _directory = resultString; } } if (_dirp == 0) return false; struct dirent *dp; while ((dp = readdir(_dirp)) != NULL) { if (filter_pattern(dp->d_name,(const char *)_pattern,0) == 1) { int retf = fillin_CFileInfo(fi,(const char *)_directory,dp->d_name,ignoreLink); if (retf) { TRACEN((printf("CFindFile::FindFirst : closedir-1(dirp=%p)\n",_dirp))) closedir(_dirp); _dirp = 0; SetLastError( ERROR_NO_MORE_FILES ); return false; } TRACEN((printf("CFindFile::FindFirst -%s- true\n",dp->d_name))) return true; } }
bool CLibrary::Load(LPCTSTR lpLibFileName) { if(!Free()) return false; void *handler = 0; char name[MAX_PATHNAME_LEN+1]; #ifdef _UNICODE AString name2 = UnicodeStringToMultiByte(lpLibFileName); strcpy(name,nameWindowToUnix((const char *)name2)); #else strcpy(name,nameWindowToUnix(lpLibFileName)); #endif // replace ".dll" with ".so" size_t len = strlen(name); if ((len >=4) && (strcmp(name+len-4,".dll") == 0)) { strcpy(name+len-4,".so"); } #ifdef __ANDROID__ char tmp[MAX_PATHNAME_LEN+1]; if (strncmp(name, "./", 2) == 0) { strcpy(tmp, name+2); sprintf(name, "lib%s", tmp); } #endif TRACEN((printf("CLibrary::Load(this=%p,%ls) => %s\n",(void *)this,lpLibFileName,name))) #ifdef __APPLE_CC__ NSObjectFileImage image; NSObjectFileImageReturnCode nsret; nsret = NSCreateObjectFileImageFromFile (name, &image); if (nsret == NSObjectFileImageSuccess) { TRACEN((printf("NSCreateObjectFileImageFromFile(%s) : OK\n",name))) handler = (HMODULE)NSLinkModule(image,name,NSLINKMODULE_OPTION_RETURN_ON_ERROR | NSLINKMODULE_OPTION_PRIVATE | NSLINKMODULE_OPTION_BINDNOW); } else { TRACEN((printf("NSCreateObjectFileImageFromFile(%s) : ERROR\n",name))) } #elif ENV_BEOS // normalize path (remove things like "./", "..", etc..), otherwise it won't work BPath p(name, NULL, true); status_t err = B_OK; image_id image = load_add_on(p.Path()); TRACEN((printf("load_add_on(%s)=%d\n",p.Path(),(int)image))) if (image < 0) { err = (image_id)handler; handler = 0; } else { err = 0; handler = (HMODULE)image; } #else int options_dlopen = 0; #ifdef RTLD_LOCAL options_dlopen |= RTLD_LOCAL; #endif #ifdef RTLD_NOW options_dlopen |= RTLD_NOW; #endif #ifdef RTLD_GROUP #if ! (defined(hpux) || defined(__hpux)) options_dlopen |= RTLD_GROUP; // mainly for solaris but not for HPUX #endif #endif TRACEN((printf("CLibrary::Load - dlopen(%s,0x%d)\n",name,options_dlopen))) handler = dlopen(name,options_dlopen); #endif // __APPLE_CC__ TRACEN((printf("CLibrary::Load(%s) => %p\n",name,handler))) if (handler) { // Call DllMain() like in Windows : useless now // Propagate the value of global_use_utf16_conversion into the plugins int *tmp = (int *)local_GetProcAddress(handler,"global_use_utf16_conversion"); if (tmp) *tmp = global_use_utf16_conversion; #ifdef ENV_HAVE_LSTAT tmp = (int *)local_GetProcAddress(handler,"global_use_lstat"); if (tmp) *tmp = global_use_lstat; #endif // test construtors calls void (*fctTest)(void) = (void (*)(void))local_GetProcAddress(handler,"sync_TestConstructor"); if (fctTest) fctTest(); } else { #ifdef __APPLE_CC__ NSLinkEditErrors c; int num_err; const char *file,*err; NSLinkEditError(&c,&num_err,&file,&err); printf("Can't load '%ls' (%s)\n", lpLibFileName,err); #elif ENV_BEOS printf("Can't load '%ls' (%s)\n", lpLibFileName,strerror(err)); #else printf("Can't load '%ls' (%s)\n", lpLibFileName,dlerror()); #endif } _module = handler; TRACEN((printf("CLibrary::Load(this=%p,%ls) => _module=%p\n",(void *)this,lpLibFileName,_module))) return true; }
bool CFileBase::Create(LPCTSTR filename, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,bool ignoreSymbolicLink) { Close(); const char * name = nameWindowToUnix(filename); #ifdef O_BINARY int flags = O_BINARY; #else int flags = 0; #endif #ifdef O_LARGEFILE flags |= O_LARGEFILE; #endif int mode = 0666; if (dwDesiredAccess & GENERIC_WRITE) flags |= O_WRONLY; if (dwDesiredAccess & GENERIC_READ) flags |= O_RDONLY; switch (dwCreationDisposition) { case CREATE_NEW : flags |= O_CREAT | O_EXCL; break; case CREATE_ALWAYS : flags |= O_CREAT; break; case OPEN_EXISTING : break; case OPEN_ALWAYS : flags |= O_CREAT; break; // case TRUNCATE_EXISTING : flags |= O_TRUNC; break; } /* size_t len = strlen(name); if (len >= 4) { if ( (tolower((unsigned char)name[len-1]) == 'e') && (tolower((unsigned char)name[len-2]) == 'x') && (tolower((unsigned char)name[len-3]) == 'e') && (name[len-4] == '.') ) { mode = 0777; } } */ _fd = -1; #ifdef HAVE_LSTAT if ((global_use_lstat) && (ignoreSymbolicLink == false)) { _size = readlink(name, _buffer, sizeof(_buffer)-1); if (_size > 0) { if (dwDesiredAccess & GENERIC_READ) { _fd = FD_LINK; _offset = 0; _buffer[_size]=0; } else if (dwDesiredAccess & GENERIC_WRITE) { // does not overwrite the file pointed by symbolic link if (!unlink(name)) return false; } } } #endif if (_fd == -1) { _fd = open(name,flags, mode); } if ((_fd == -1) && (global_use_utf16_conversion)) { // bug #1204993 - Try to recover the original filename UString ustr = MultiByteToUnicodeString(AString(name), 0); AString resultString; int is_good = 1; for (int i = 0; i < ustr.Length(); i++) { if (ustr[i] >= 256) { is_good = 0; break; } else { resultString += char(ustr[i]); } } if (is_good) { _fd = open((const char *)resultString,flags, mode); } } if (_fd == -1) { /* !HAVE_LSTAT : an invalid symbolic link => errno == ENOENT */ return false; } else { _unix_filename = name; } return true; }
void myAddExeFlag(LPCTSTR filename) { const char * name = nameWindowToUnix(filename); // printf("myAddExeFlag(%s)\n",name); chmod(name,0700); }