📄 getset.c
字号:
/* This file handles the 4 system calls that get and set uids and gids. * It also handles getpid(), setsid(), and getpgrp(). The code for each * one is so tiny that it hardly seemed worthwhile to make each a separate * function. */#include "pm.h"#include <minix/callnr.h>#include <signal.h>#include "mproc.h"#include "param.h"/*===========================================================================* * do_getset * *===========================================================================*/PUBLIC int do_getset(){/* Handle GETUID, GETGID, GETPID, GETPGRP, SETUID, SETGID, SETSID. The four * GETs and SETSID return their primary results in 'r'. GETUID, GETGID, and * GETPID also return secondary results (the effective IDs, or the parent * process ID) in 'reply_res2', which is returned to the user. */ register struct mproc *rmp = mp; register int r; switch(call_nr) { case GETUID: r = rmp->mp_realuid; rmp->mp_reply.reply_res2 = rmp->mp_effuid; break; case GETGID: r = rmp->mp_realgid; rmp->mp_reply.reply_res2 = rmp->mp_effgid; break; case GETPID: r = mproc[who].mp_pid; rmp->mp_reply.reply_res2 = mproc[rmp->mp_parent].mp_pid; if (m_in.procnr >= 0 && m_in.procnr < NR_PROCS) rmp->mp_reply.reply_res3 = mproc[m_in.procnr].mp_pid; break; case SETUID: if (rmp->mp_realuid != (uid_t) m_in.usr_id && rmp->mp_effuid != SUPER_USER) return(EPERM); rmp->mp_realuid = (uid_t) m_in.usr_id; rmp->mp_effuid = (uid_t) m_in.usr_id; tell_fs(SETUID, who, rmp->mp_realuid, rmp->mp_effuid); r = OK; break; case SETGID: if (rmp->mp_realgid != (gid_t) m_in.grp_id && rmp->mp_effuid != SUPER_USER) return(EPERM); rmp->mp_realgid = (gid_t) m_in.grp_id; rmp->mp_effgid = (gid_t) m_in.grp_id; tell_fs(SETGID, who, rmp->mp_realgid, rmp->mp_effgid); r = OK; break; case SETSID: if (rmp->mp_procgrp == rmp->mp_pid) return(EPERM); rmp->mp_procgrp = rmp->mp_pid; tell_fs(SETSID, who, 0, 0); /* fall through */ case GETPGRP: r = rmp->mp_procgrp; break; default: r = EINVAL; break; } return(r);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -