C - Ядро Linux - Помощь с current_uid()

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

Кстати, правильно ли я назвал старые версии системного вызова?


person Smreks    schedule 15.09.2015    source источник


Ответы (1)


из здесь, uid_t — это просто определение типа __kernel_uid32_t, что unsigned int согласно здесь

person Xiaotian Pei    schedule 16.09.2015
comment
мой компилятор говорит следующее: недопустимые операнды для двоичного ›= (имеют ‘kuid_t’ и ‘unsigned int’) if (current_uid() ›= reg_users) { ^ - person Smreks; 16.09.2015
comment
вы должны использовать current_uid().val >= reg_users - person Xiaotian Pei; 16.09.2015
comment
Хаха получилось! Большое спасибо! Просто быстрый вопрос, правильно ли мой вызов исходной функции sys open? Я могу легко смешивать указатели и хотел бы, чтобы вы перепроверили - person Smreks; 16.09.2015
comment
Да. это правильно. вы также можете вызвать ref_sys_open напрямую, не разыменовывая его. - person Xiaotian Pei; 16.09.2015