Linux-FD-Mem

 view release on metacpan or  search on metacpan

lib/Linux/FD/Mem.xs  view on Meta::CPAN

#define get_mem_flag(name) S_get_mem_flag(aTHX_ name)

static const map seal_flags = {
	{ STR_WITH_LEN("seal"), F_SEAL_SEAL },
	{ STR_WITH_LEN("shrink"), F_SEAL_SHRINK },
	{ STR_WITH_LEN("grow"), F_SEAL_GROW },
	{ STR_WITH_LEN("write"), F_SEAL_WRITE },
#ifdef F_SEAL_FUTURE_WRITE
	{ STR_WITH_LEN("future-write"), F_SEAL_FUTURE_WRITE },
#endif
};

static UV S_get_seal_flag(pTHX_ SV* flag_name) {
	int i;
	for (i = 0; i < sizeof seal_flags / sizeof *seal_flags; ++i)
		if (strEQ(SvPV_nolen(flag_name), seal_flags[i].key))
			return seal_flags[i].value;
	Perl_croak(aTHX_ "No such seal '%s' known", SvPV_nolen(flag_name));
}
#define get_seal_flag(name) S_get_seal_flag(aTHX_ name)

#define get_fd(self) PerlIO_fileno(IoOFP(sv_2io(SvRV(self))))

MODULE = Linux::FD::Mem				PACKAGE = Linux::FD::Mem

SV*
new(classname, name, ...)
	const char* classname;
	const char* name;
	PREINIT:
	int memfd;
	int i, flags = MFD_CLOEXEC;
	CODE:
	for (i = 2; i < items; i++)
		flags |= get_mem_flag(ST(i));
	memfd = syscall(__NR_memfd_create, name, flags);
	if (memfd < 0)
		die_sys("Couldn't open memfd: %s");
	RETVAL = io_fdopen(memfd, classname, '+');
	OUTPUT:
		RETVAL

void
seal(file_handle, ...)
	SV* file_handle;
	PREINIT:
		int fd, seals = 0, i, ret;
	CODE:
	fd = get_fd(file_handle);
	for (i = 1; i < items; i++)
		seals |= get_seal_flag(ST(i));
	ret = fcntl(fd, F_ADD_SEALS, seals);
	if (ret < 0)
		die_sys("Couldn't add seal: %s");

void
get_seals(file_handle)
	SV* file_handle;
	PREINIT:
	int seals, fd, i;
	PPCODE:
	fd = get_fd(file_handle);
	seals = fcntl(fd, F_GET_SEALS, 0);
	for (i = 0; i < sizeof seal_flags / sizeof *seal_flags; ++i) {
		if (seal_flags[i].value & seals)
			mXPUSHp(seal_flags[i].key, seal_flags[i].length);
	}



( run in 0.698 second using v1.01-cache-2.11-cpan-71847e10f99 )