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); }
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; }
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); }
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); }
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); }
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); }
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); }
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); }
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; }
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; }