C - Linux 内核 - 协助 current_uid()
C - Linux Kernel - Assistance with current_uid()
我一直在处理我无法修复的部分作业。要求是拦截系统调用 open 并将其替换为仅针对普通用户的新系统 open 调用,并在系统日志中打印出用户 ID 和文件名。否则它只会执行标准系统公开调用。这是困扰我的部分内容:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/syscalls.h>
unsigned long **sys_call_table;
asmlinkage long (*ref_sys_open)(const char *filename, int flags, umode_t mode);
asmlinkage long (*ref_sys_close)(unsigned int fd);
asmlinkage long new_sys_open(const char *filename, int flags, umode_t mode) {
if (current_uid() >= 1000) {
printk(KERN_INFO "User %d is opening file: %s\n", current_uid(), filename);
} else {
(*ref_sys_open)(filename, flags, mode);
}
return 0;
}
我遇到的问题是 current_uid() 的返回值是类型为 kuid_t 的结构。我进一步调查,发现该结构如下所示:
typedef struct {
uid_t val;
} kuid_t;
我想知道如何将 int 1000 与类型 uid_t val 进行比较?
附带说明一下,我是否正确调用了旧版本的系统调用?
我一直在处理我无法修复的部分作业。要求是拦截系统调用 open 并将其替换为仅针对普通用户的新系统 open 调用,并在系统日志中打印出用户 ID 和文件名。否则它只会执行标准系统公开调用。这是困扰我的部分内容:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/syscalls.h>
unsigned long **sys_call_table;
asmlinkage long (*ref_sys_open)(const char *filename, int flags, umode_t mode);
asmlinkage long (*ref_sys_close)(unsigned int fd);
asmlinkage long new_sys_open(const char *filename, int flags, umode_t mode) {
if (current_uid() >= 1000) {
printk(KERN_INFO "User %d is opening file: %s\n", current_uid(), filename);
} else {
(*ref_sys_open)(filename, flags, mode);
}
return 0;
}
我遇到的问题是 current_uid() 的返回值是类型为 kuid_t 的结构。我进一步调查,发现该结构如下所示:
typedef struct {
uid_t val;
} kuid_t;
我想知道如何将 int 1000 与类型 uid_t val 进行比较?
附带说明一下,我是否正确调用了旧版本的系统调用?