Мой сценарий следующий: у меня есть приложение C ++, которое получает доступ к радиоприемнику, чтобы получить от него сигнал времени, а затем обновляет системное время в соответствии с временем из радиосигнала. В целях безопасности приложение не должно запускаться с правами root. Прочитав этот совет из ветки форума, Я попробовал фрагмент кода, как это:
tm current_time;
struct timeval *epoch = new timeval;
// current_time is filled with time data from the radio tuner here.
epoch -> tv_sec = mktime (¤t_time);
epoch -> tv_usec = 0;
if (difftime (epoch -> tv_sec, mktime (&this -> last_system_time_update)) > (time_t) receiver::SYSTEM_TIME_UPDATE_INTERVAL) {
retval += setgid ((uid_t) 0);
retval += setuid ((uid_t) 0);
retval += prctl (PR_SET_KEEPCAPS, 1L, 0L, 0L, 0L);
retval += setgid (group_id);
retval += setuid (user_id);
retval += settimeofday (epoch, NULL);
}
Вопреки совету, этот фрагмент не будет работать, когда я не запускаю его как root. Я всегда получаю errno = 1.
Что здесь не так? И есть ли обходной путь?
Вы все еще пытаетесь получить права root. Если у вас есть возможность CAP_SYS_TIME, все, что вам нужно, это settimeofday ().
if (difftime (epoch -> tv_sec, mktime (&this -> last_system_time_update)) >
(time_t) receiver::SYSTEM_TIME_UPDATE_INTERVAL) {
retval += settimeofday (epoch, NULL);
}
Других решений пока нет …