struct fuse_session *cuse_lowlevel_new(struct fuse_args *args,
				       const struct cuse_info *ci,
				       const struct cuse_lowlevel_ops *clop,
				       void *userdata)
{
	struct fuse_lowlevel_ops lop;
	struct cuse_data *cd;
	struct fuse_session *se;
	struct fuse_ll *ll;

	cd = cuse_prep_data(ci, clop);
	if (!cd)
		return NULL;

	memset(&lop, 0, sizeof(lop));
	lop.init	= clop->init;
	lop.destroy	= clop->destroy;
	lop.open	= clop->open		? cuse_fll_open		: NULL;
	lop.read	= clop->read		? cuse_fll_read		: NULL;
	lop.write	= clop->write		? cuse_fll_write	: NULL;
	lop.flush	= clop->flush		? cuse_fll_flush	: NULL;
	lop.release	= clop->release		? cuse_fll_release	: NULL;
	lop.fsync	= clop->fsync		? cuse_fll_fsync	: NULL;
	lop.ioctl	= clop->ioctl		? cuse_fll_ioctl	: NULL;
	lop.poll	= clop->poll		? cuse_fll_poll		: NULL;

	se = fuse_lowlevel_new_common(args, &lop, sizeof(lop), userdata);
	if (!se) {
		free(cd);
		return NULL;
	}
	ll = se->data;
	ll->cuse_data = cd;

	return se;
}
struct fuse_session *fuse_lowlevel_new(struct fuse_args *args,
				       const struct fuse_lowlevel_ops *op,
				       size_t op_size, void *userdata)
{
	return fuse_lowlevel_new_common(args, op, op_size, userdata);
}