Как я могу изменить системное время Linux без прав root? - PullRequest
0 голосов
/ 23 ноября 2018

Мой сценарий следующий: у меня есть приложение 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 (&current_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.

Что здесь не так?И: Есть ли обходной путь?

1 Ответ

0 голосов
/ 23 ноября 2018

Вы все еще пытаетесь получить привилегии 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);
}
...