就是模拟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省电技术,工作中也能深度休眠