Я регистрация новых setsockopts() команда с nf_register_sockopt()
:Передача возвращаемого значения вызывающему абоненту setsockopts(), если copy_to_user() не работает?
static struct nf_sockopt_ops my_sockopts = {
list: {NULL, NULL},
pf: PF_INET,
set_optmin: MY_OPT_MIN,
set_optmax: MY_OPT_MAX,
set: my_set_so,
get_optmin: 0,
get_optmax: 0,
get: NULL
};
nf_register_sockopt(&my_sockopts);
Я хочу вернуть код ошибки из (пространства ядра) функции my_set_so()
обратно в пространство пользователя. Итак, я скопировать этот код с copy_to_user()
:
int my_set_so(struct sock *sk, int cmd, void *param, unsigned int len) {
struct my_so_param user_data;
user_data.return_value = do_my_kernelspace_work();
if (copy_to_user(param, &user_data, sizeof(user_data)))
HOW TO INDICATE THE FAILURE HERE?
}
Я понимаю, что setsockopt()
, согласно странице руководства, возвратит код ошибки системы в случае, если происходит ошибка сокета уровня. Если в коде обработки команд появляется ошибка, setsockopt()
все равно возвращает 0, а возвращаемое значение должно быть проверено с помощью параметра void*
.
Правильно ли это понимание? Если да, то как должен (userpace) вызывающий быть проинформирован о сбое copy_to_user()
?
К сожалению, я не вижу, как этот ответ согласуется с ручными страниц. Последние инструктируют вернуть -1 на ошибку, а не -EFAULT (и, кроме возврата -1, также установить errno в соответствующее значение). – user3608247
Мы говорим о пространстве пользователя или пространстве ядра? FYI: в пространстве ядра нет 'errno'. – 0andriy
Интересно прочитать также: http://yarchive.net/comp/linux/errno.html – 0andriy