minix/kernel/system/do_svrctl.c
Jorrit Herder 42ab148155 Reorganized system call library; uses separate file per call now.
New configuration header file to include/ exclude functionality.
Extracted privileged features from struct proc and create new struct priv.
Renamed various system calls for readability.
2005-07-14 15:12:12 +00:00

73 lines
2 KiB
C

/* The system call implemented in this file:
* m_type: SYS_SVRCTL
*
* The parameters for this system call are:
* m2_i1: CTL_PROC_NR (process number of caller)
* m2_i2: CTL_REQUEST (request type)
* m2_i3: CTL_MM_PRIV (privilege)
* m2_l1: CTL_SEND_MASK (new send mask to be installed)
* m2_l2: CTL_PROC_TYPE (new process type)
* m2_p1: CTL_ARG_PTR (argument pointer)
*/
#include "../system.h"
#include "../ipc.h"
#include <sys/svrctl.h>
#if USE_SVRCTL
/* NOTE: this call will radically change! */
/*===========================================================================*
* do_svrctl *
*===========================================================================*/
PUBLIC int do_svrctl(m_ptr)
message *m_ptr; /* pointer to request message */
{
register struct proc *rp;
register struct priv *sp;
int proc_nr, rights;
int request;
vir_bytes argp;
/* Extract message parameters. */
proc_nr = m_ptr->CTL_PROC_NR;
if (proc_nr == SELF) proc_nr = m_ptr->m_source;
if (! isokprocn(proc_nr)) return(EINVAL);
request = m_ptr->CTL_REQUEST;
rights = m_ptr->CTL_MM_PRIV;
argp = (vir_bytes) m_ptr->CTL_ARG_PTR;
rp = proc_addr(proc_nr);
/* Check if the PM privileges are super user. */
if (!rights || !isuserp(rp))
return(EPERM);
/* See what is requested and handle the request. */
switch (request) {
case SYSSIGNON: {
/* Make this process a server. The system processes should be able
* to communicate with this new server, so update their send masks
* as well.
*/
/* Find a new system privileges structure for this process. */
for (sp=BEG_PRIV_ADDR; sp< END_PRIV_ADDR; sp++)
if (sp->s_proc_nr == NONE) break;
if (sp->s_proc_nr != NONE) return(ENOSPC);
/* Now update the process' privileges as requested. */
rp->p_priv = sp; /* assign to process */
rp->p_priv->s_proc_nr = proc_nr(rp); /* set association */
rp->p_priv->s_call_mask = SYSTEM_CALL_MASK;
return(OK);
}
default:
return(EINVAL);
}
}
#endif /* USE_SVRCTL */