Beispiel #1
0
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;
}
Beispiel #2
0
	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;
	}
Beispiel #3
0
	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;

	}