コード例 #1
0
ファイル: mmap_peer.c プロジェクト: andreimironenko/syslink
int
mem_offset64_peer(pid_t pid, const uintptr_t addr, size_t len,
				off64_t *offset, size_t *contig_len) {
	struct _peer_mem_off {
		struct _mem_peer peer;
		struct _mem_offset msg;
	};
	typedef union {
		struct _peer_mem_off i;
		struct _mem_offset_reply o;
	} memoffset_peer_t;
	memoffset_peer_t msg;

	msg.i.peer.type = _MEM_PEER;
	msg.i.peer.peer_msg_len = sizeof(msg.i.peer);
	msg.i.peer.pid = pid;
	msg.i.peer.reserved1 = 0;

	msg.i.msg.type = _MEM_OFFSET;
	msg.i.msg.subtype = _MEM_OFFSET_PHYS;
	msg.i.msg.addr = addr;
	msg.i.msg.reserved = -1;
	msg.i.msg.len = len;
	if(MsgSendnc(MEMMGR_COID, &msg.i, sizeof msg.i, &msg.o, sizeof msg.o) == -1) {
		return -1;
	}
	*offset = msg.o.offset;
	*contig_len = msg.o.size;
	return(0);
}
コード例 #2
0
ファイル: fork.c プロジェクト: vocho/openqnx
pid_t _fork(unsigned flags, uintptr_t frame) {
	struct _pthread_atfork_func	*f;
	proc_fork_t					msg;
	pid_t						pid;

	if(flags & _FORK_ASPACE) {
		pthread_mutex_lock(&pthread_atfork_mutex);
		for(f = _pthread_atfork_prepare; f; f = f->next) {
			f->func();
		}
	}
	msg.i.type = _PROC_FORK;
	msg.i.zero = 0;
	msg.i.flags = flags;
	msg.i.frame = frame;
	pid = MsgSendnc(PROCMGR_COID, &msg.i, sizeof msg.i, 0, 0);
	if(flags & _FORK_ASPACE) {
		if(pid) {
			for(f = _pthread_atfork_parent; f; f = f->next) {
				f->func();
			}
			pthread_mutex_unlock(&pthread_atfork_mutex);
		} else {
			static const pthread_mutex_t				mutex = PTHREAD_MUTEX_INITIALIZER;
   	
			for(f = _pthread_atfork_child; f; f = f->next) {
				f->func();
			}
			pthread_atfork_mutex = mutex;
		}
	}
	return pid;
}
コード例 #3
0
ファイル: fsync.c プロジェクト: vocho/openqnx
int fsync(int fd) {
	io_sync_t				msg;

	msg.i.type = _IO_SYNC;
	msg.i.combine_len = sizeof msg.i;
	msg.i.flag = O_SYNC;
	return MsgSendnc(fd, &msg.i, sizeof msg.i, 0, 0);
}
コード例 #4
0
ファイル: procmgr_event_notify.c プロジェクト: vocho/openqnx
int procmgr_event_notify_delete(int id) {
	proc_event_del_t		msg;

	msg.i.type = _PROC_EVENT;
	msg.i.subtype = _PROC_EVENT_NOTIFY_DEL;
	msg.i.id = id;

	return MsgSendnc(PROCMGR_COID, &msg.i, sizeof msg.i, 0, 0);
}
コード例 #5
0
ファイル: sysmgr_cpumode.c プロジェクト: vocho/openqnx
int
sysmgr_cpumode(int cpumode) {
	sys_cmd_t					msg;

	msg.i.type = _SYS_CMD;
	msg.i.cmd = _SYS_CMD_CPUMODE;
	msg.i.mode = cpumode;
	
	return MsgSendnc(SYSMGR_COID, &msg.i, sizeof msg.i, 0, 0);
}
コード例 #6
0
ファイル: mprotect.c プロジェクト: vocho/openqnx
int mprotect(void *addr, size_t len, int prot) {
	mem_ctrl_t						msg;

	msg.i.type = _MEM_CTRL;
	msg.i.subtype = _MEM_CTRL_PROTECT;
	msg.i.addr = (uintptr_t)addr;
	msg.i.len = len;
	msg.i.flags = prot;
	return MsgSendnc(MEMMGR_COID, &msg.i, sizeof msg.i, 0, 0);
}
コード例 #7
0
ファイル: mlock.c プロジェクト: vocho/openqnx
int mlock(const void *addr, size_t len) {
	mem_ctrl_t						msg;

	msg.i.type = _MEM_CTRL;
	msg.i.subtype = _MEM_CTRL_LOCK;
	msg.i.addr = (uintptr_t)addr;
	msg.i.len = len;
	msg.i.flags = 0;
	return MsgSendnc(MEMMGR_COID, &msg.i, sizeof msg.i, 0, 0);
}
コード例 #8
0
ファイル: procmgr_event_notify.c プロジェクト: vocho/openqnx
int _procmgr_event_notify(unsigned short subtype, unsigned flags, const struct sigevent *event) {
	proc_event_t			msg;

	msg.i.type = _PROC_EVENT;
	msg.i.subtype = subtype;
	msg.i.flags = flags;
	msg.i.event = *event;

	return MsgSendnc(PROCMGR_COID, &msg.i, sizeof msg.i, 0, 0);
}
コード例 #9
0
ファイル: getpgrp.c プロジェクト: vocho/openqnx
pid_t getpgrp(void) {
	proc_getsetid_t				msg;

	msg.i.type = _PROC_GETSETID;
	msg.i.subtype = _PROC_ID_GETID;
	msg.i.pid = 0;
	if(MsgSendnc(PROCMGR_COID, &msg.i, sizeof msg.i, &msg.o, sizeof msg.o) == -1) {
		return -1;
	}
	return msg.o.pgrp;
}
コード例 #10
0
ファイル: fcntl.c プロジェクト: vocho/openqnx
int _vfcntl(int fd, int cmd, va_list ap) {
	union {
		io_dup_t						dup;
		io_space_t						space;
		io_lock_t						lock;
	}								msg;
	iov_t							iov[4];
	int								arg;
	pid_t	pid;

	switch(cmd) {
	case F_DUPFD: {
		struct _server_info				info;
		int								fd2;
		if(fd == -1 || (fd & _NTO_SIDE_CHANNEL) || ConnectServerInfo(0, fd, &info) != fd) {
			errno = EBADF;
			return -1;
		}
		if((fd2 = va_arg(ap, int)) < 0 || (fd2 & _NTO_SIDE_CHANNEL)) {
			errno = EINVAL;
			return -1;
		}		
		if((fd2 = ConnectAttach(info.nd, info.pid, info.chid, fd2, _NTO_COF_CLOEXEC)) == -1) {
			return -1;
		}
		msg.dup.i.type = _IO_DUP;
		msg.dup.i.combine_len = sizeof msg.dup;
		msg.dup.i.info.nd = netmgr_remote_nd(info.nd, ND_LOCAL_NODE);
		msg.dup.i.info.pid = getpid();
		msg.dup.i.info.chid = info.chid;
		msg.dup.i.info.scoid = info.scoid;
		msg.dup.i.info.coid = fd;
		if(MsgSendnc(fd2, &msg.dup.i, sizeof msg.dup.i, 0, 0) == -1) {
			ConnectDetach_r(fd2);
			return -1;
		}
		ConnectFlags_r(0, fd2, FD_CLOEXEC, 0);
		return fd2;
	}

	case F_GETFD:
		return ConnectFlags(0, fd, 0, 0);

	case F_SETFD:
		return ConnectFlags(0, fd, ~0, va_arg(ap, int));
		
	case F_GETFL:
		if(_devctl(fd, DCMD_ALL_GETFLAGS, &arg, sizeof arg, 0) == -1) {
			return -1;
		}
		return arg;

	case F_SETFL:
		arg = va_arg(ap, int);
		return _devctl(fd, DCMD_ALL_SETFLAGS, &arg, sizeof arg, _DEVCTL_FLAG_NORETVAL);

	case F_GETOWN:
		if(_devctl(fd, DCMD_ALL_GETOWN, &pid, sizeof pid, 0) == -1) {
			return -1;
		}
		return pid;
		
	case F_SETOWN:
		pid = va_arg(ap, pid_t);
		return _devctl(fd, DCMD_ALL_SETOWN, &pid, sizeof pid, _DEVCTL_FLAG_NORETVAL);
		
	case F_ALLOCSP64:
	case F_FREESP64: {
		flock64_t				*area = va_arg(ap, flock64_t *);

		msg.space.i.start = area->l_start;
		msg.space.i.len = area->l_len;
		msg.space.i.whence = area->l_whence;
		goto common;
	}
	case F_ALLOCSP:
		cmd = F_ALLOCSP64;	/* Always pass the 64 bit values */
		goto stuff;
	case F_FREESP:
		cmd = F_FREESP64;	/* Always pass the 64 bit values */
stuff: {
		flock_t					*area = va_arg(ap, flock_t *);

		msg.space.i.start = area->l_start;
		msg.space.i.len = area->l_len;
		msg.space.i.whence = area->l_whence;
	}
common:
		msg.space.i.type = _IO_SPACE;
		msg.space.i.combine_len = sizeof msg.space.i;
		msg.space.i.subtype = cmd;
		return MsgSend(fd, &msg.space.i, sizeof msg.space.i, 0, 0);

	case F_GETLK:
	case F_SETLK:
	case F_SETLKW:
	case F_GETLK64:
	case F_SETLK64:
	case F_SETLKW64:
		msg.lock.i.type = _IO_LOCK;
		msg.lock.i.combine_len = sizeof msg.lock.i;
		msg.lock.i.subtype = cmd;
		SETIOV(iov + 0, &msg.lock.i, sizeof msg.lock.i);
		SETIOV(iov + 1, va_arg(ap, flock_t *), sizeof(flock_t));
		iov[3] = iov[1];
		SETIOV(iov + 2, &msg.lock.o, sizeof msg.lock.o);
		return MsgSendv(fd, iov + 0, 2, iov + 2, (cmd == F_GETLK || cmd == F_GETLK64) ? 2 : 1);
		
	default:
		break;
	}

	errno = EINVAL;
	return -1;
}