Я работаю над частью задания, которое у меня возникли проблемы с исправлением. Требование состояло в том, чтобы перехватить системный вызов open и заменить его новым системным вызовом open только для обычных пользователей и распечатать идентификатор пользователя и имя файла в системном журнале. В противном случае он просто выполнил бы стандартный системный вызов открытия. Вот часть того, что меня беспокоит:
#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?
Кстати, правильно ли я назвал старые версии системного вызова?