bool File::open(const String& filename_,int flag_) { String filename=fn_encode(filename_); int fd=::open(filename.c_str(),shm_fileflag(flag_),0777); if(fd<0) { if((flag_&FLAG_FILE_CR)!=0) { fd=::open(filename.c_str(),shm_fileflag(flag_)|O_CREAT,0777); } if(fd<0) { flags.add(FLAG_WRITER_FAILBIT|FLAG_READER_FAILBIT); System::CheckError("File::Open Error"); return false; } } flags.clr(0); impl.reset(fd); if(flag_&FLAG_FILE_APPEND) { seek(0,SEEKTYPE_END); } return true; }
static bool shm_create(impl_type& impl,const String& name_,size_t size_,int flag_) { KO_Handle<KO_Policy_handle> hfd; int fd=-1; int map_type=MAP_SHARED; if(!name_.empty()) { int oflag=shm_fileflag(flag_); if(flag_&FileAccess::FLAG_CR) { oflag|=O_CREAT; } fd=shm_open(name_.c_str(),oflag,0777); if(fd<0) { System::CheckError("shm_open"); return false; } hfd.reset(fd); if(flag_&FileAccess::FLAG_CR) { ftruncate(fd,size_); } else { struct stat statbuf; if(fstat(fd,&statbuf)<0) { return false; } if((size_t)statbuf.st_size!=size_) { return false; } } } else { map_type=MAP_PRIVATE|MAP_ANONYMOUS; } void* _mem=mmap(0,size_,FileAccess::makeflag(flag_,PROT_READ,PROT_WRITE),map_type,fd,0); if(_mem==MAP_FAILED) { System::CheckError("mmap"); return false; } impl.m_pAddr=(char*)_mem; impl.m_nSize=size_; impl.m_sName=name_; return true; }
static bool shm_openfile(impl_type& impl,const String& name_,size_t size_,int flag_) { KO_Handle<KO_Policy_handle> hfd; int fd=::open(name_.c_str(),shm_fileflag(flag_),0777); if(fd<0) { if((flag_&FileAccess::FLAG_CR)==0||size_==0) { return false; } fd=::open(name_.c_str(),shm_fileflag(flag_)|O_CREAT,0777); if(fd<0) { System::CheckError("open"); return false; } } hfd.reset(fd); if(size_!=0) { ftruncate(fd,size_); } struct stat statbuf; if(fstat(fd,&statbuf)<0) { return false; } size_=statbuf.st_size; void* _mem=mmap(0,size_,FileAccess::makeflag(flag_,PROT_READ,PROT_WRITE),MAP_SHARED,fd,0); if(_mem==MAP_FAILED) { System::CheckError("mmap"); return false; } impl.m_pAddr=(char*)_mem; impl.m_nSize=size_; impl.m_sName=name_; return true; }