пишу puntoswitcher под KDE и хочу сделать его минималистичным, чтобы резидентно работал один демон, никакие процессы там не вызывались.
И проблема в том, что слушать клавиатуру может только рут, а доступ к буферу обмена есть только у пользователя.
Ну есть же SUID, и я хочу чтобы программа переключалась между этими пользователями при помощи setreuid():
int main() {
uid_t user = getuid();
uid_t root = geteuid();
printf("start: %d %d\n",getuid(),geteuid());
if(0!=setreuid(-1, user)){ // временно стать пользователем
perror("setreuid(-1, user)");
exit(1);
}
printf("user mode: %d %d\n",getuid(),geteuid());
DBusError err;
DBusConnection* conn;
DBusMessage* msg;
DBusMessage* reply;
char* result;
// Инициализация ошибок
dbus_error_init(&err);
// Подключение к сессионной шине D-Bus
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Ошибка подключения к D-Bus: %s\n", err.message);
dbus_error_free(&err);
return 1;
}
...
и оно пишет
start: 1000 0
user mode: 1000 1000
Ошибка подключения к D-Bus: Unable to autolaunch when setuid
как DBUS сказать от имени программы что я юзер 1000?
Перемещено Zhbert из desktop