模拟Linux修改实际、有效和保存设置标识

就是模拟setuid seteuid setreuid setresuid,感觉代码比书上大段的文字好记,就写成代码形式了。
// setuid.cc: 模拟中的设置用户id的方法的作用
#include
#include
int real = 0;          // 实际用户id
int effective = 0;     // 有效用户id
int saved = 0;         // 保存的设置用户id
void showid();  // 打印所有id
inline bool hasprivilege() { return effective == 0; }
#define einval_return { errno = einval; return -1; }
#define eperm_return { errno = eperm; return -1; }
int setuid(int uid)  // 修改所有用户id
{
    if (uid < 0)
        einval_return;
    if (!hasprivilege() && uid != real && uid != saved)
        eperm_return;
    if (hasprivilege())
        real = effective = saved = uid;
    else
        effective = uid;
    return 0;
}
int seteuid(int euid)  // 修改有效用户id
{
    if (euid < 0)
        einval_return;
    if (!hasprivilege() && euid != real && euid != saved)
        eperm_return;
    effective = euid;
    return 0;
}
int setreuid(int ruid, int euid)  // 修改实际/有效用户id
{
    if (ruid < -1 || euid < -1)
        einval_return;
    if (!hasprivilege())
    {
        if (ruid != -1 && ruid != real && ruid != effective)
            eperm_return;
        if (euid != -1 && euid != real && euid != effective && euid != saved)
            eperm_return;
    }
    real = (ruid != -1) ? ruid : real;
    effective = (euid != -1) ? euid : effective;
    if (ruid != -1 || effective != real)
        saved = effective;
    return 0;
}
// 非susv3规范, 其他unix实现对其也鲜有支持
int setresuid(int ruid, int euid, int suid)  // 修改实际/有效/保存用户id
{
    if (ruid < -1 || euid < -1 || suid < -1)
        einval_return;
    if (!hasprivilege())
    {
        if (ruid != -1 && ruid != real && ruid != effective && ruid != saved)
            eperm_return;
        if (euid != -1 && euid != real && euid != effective && euid != saved)
            eperm_return;
        if (suid != -1 && suid != real && suid != effective && suid != saved)
            eperm_return;
    }
    real = (ruid != -1) ? ruid : real;
    effective = (euid != -1) ? euid : effective;
    saved = (suid != -1) ? suid : saved;
    return 0;
}
int main()
{
    real = 1000;
    // 下面4句只能执行其中1句
    //    setuid(2000);
    setreuid(-1, 2000);
    //    seteuid(2000);
    //    setresuid(-1, 2000, 3000);
    showid();
    return 0;
}
void showid()
{
    printf(实际用户id:       %4d\n, real);
    printf(有效用户id:       %4d\n, effective);
    printf(保存的设置用户id: %4d\n, saved);
}
main函数是tlpi第9章习题第1道的运行结果,然后模拟了一遍功能,后面几道也很简单就能做出来了。以后忘记的话看遍代码就能很快记起来了。

曝三星GalaxyS11将搭载全新潜望式镜头 将提供更高倍率的数码变焦
点阵数码管驱动LED控制器原厂数显恒流驱动IC芯片VK16D33
达科电子宣布已参与XDC的A轮投资 将支持XDC在Micro LED制造能力及应用方面的进一步发展
XKB推出1.27毫米排针 高耐热性、介电功能的排针排母连接器
国内外自动化及智能装备龙头亮相智博会
模拟Linux修改实际、有效和保存设置标识
楼宇能耗管理平台,打造绿色节能建筑
差分信号的优缺点有哪些
干电池和锂电池的区别 锂电池电压为0如何激活?
解决软件开发四大痛点,飞算全自动软件工程平台带来新解法
常用的CBB电容有哪些?聚丙烯薄膜电容的作用介绍
一文详解半导体封装测试工艺流程
如何通过LoRa技术让智慧社区真正“智慧”
比亚迪首个正式宣布停止燃油车整车生产
MEMC是什么黑科技 智能手机是否需要MEMC的问题
Nexperia推低电流稳压器二极管 LG Display发布电视面板“OLED.EX”
蓝魔M7评测 复古的风格适合怀旧的人
什么是ArcoWork
关于MDT推Z轴TMR传感器的性能分析和应用介绍
东芝开发出SoC省电技术,工作中也能深度休眠