privops: switch from settimeofday() to clock_settime()

Following the removal of gettimeofday() calls, change PRV_SetTime() to
use clock_settime() instead of settimeofday(). Only CLOCK_REALTIME is
supported for now.
This commit is contained in:
Miroslav Lichvar
2026-01-29 09:29:30 +01:00
parent c51c7f5a81
commit e313f5abf7
5 changed files with 16 additions and 19 deletions

View File

@@ -65,7 +65,7 @@ typedef struct {
#endif
typedef struct {
struct timeval tv;
struct timespec ts;
} ReqSetTime;
typedef struct {
@@ -225,13 +225,13 @@ do_adjust_timex(const ReqAdjustTimex *req, PrvResponse *res)
/* ======================================================================= */
/* HELPER - perform settimeofday() */
/* HELPER - perform clock_settime() */
#ifdef PRIVOPS_SETTIME
static void
do_set_time(const ReqSetTime *req, PrvResponse *res)
{
res->rc = settimeofday(&req->tv, NULL);
res->rc = clock_settime(CLOCK_REALTIME, &req->ts);
if (res->rc)
res->res_errno = errno;
}
@@ -508,25 +508,24 @@ PRV_AdjustTimex(struct timex *tmx)
/* ======================================================================= */
/* DAEMON - request settimeofday() */
/* DAEMON - request clock_settime() */
#ifdef PRIVOPS_SETTIME
int
PRV_SetTime(const struct timeval *tp, const struct timezone *tzp)
PRV_SetTime(clockid_t clockid, const struct timespec *tp)
{
PrvRequest req;
PrvResponse res;
/* only support setting the time */
assert(tp != NULL);
assert(tzp == NULL);
if (clockid != CLOCK_REALTIME)
return -1;
if (!have_helper())
return settimeofday(tp, NULL);
return clock_settime(clockid, tp);
memset(&req, 0, sizeof (req));
req.op = OP_SETTIME;
req.data.set_time.tv = *tp;
req.data.set_time.ts = *tp;
submit_request(&req, &res);

View File

@@ -41,9 +41,9 @@ int PRV_AdjustTimex(struct timex *txc);
#endif
#ifdef PRIVOPS_SETTIME
int PRV_SetTime(const struct timeval *tp, const struct timezone *tzp);
int PRV_SetTime(clockid_t clockid, const struct timespec *tp);
#else
#define PRV_SetTime settimeofday
#define PRV_SetTime clock_settime
#endif
#ifdef PRIVOPS_BINDSOCKET

View File

@@ -349,15 +349,13 @@ static int
apply_step_offset(double offset)
{
struct timespec old_time, new_time;
struct timeval new_time_tv;
double err;
LCL_ReadRawTime(&old_time);
UTI_AddDoubleToTimespec(&old_time, -offset, &new_time);
UTI_TimespecToTimeval(&new_time, &new_time_tv);
if (PRV_SetTime(&new_time_tv, NULL) < 0) {
DEBUG_LOG("settimeofday() failed");
if (PRV_SetTime(CLOCK_REALTIME, &new_time) < 0) {
DEBUG_LOG("clock_settime() failed");
return 0;
}

View File

@@ -427,7 +427,7 @@ SYS_Linux_EnableSystemCallFilter(int level, SYS_ProcessContext context)
SCMP_SYS(clock_gettime64),
#endif
SCMP_SYS(gettimeofday),
SCMP_SYS(settimeofday),
SCMP_SYS(clock_settime),
SCMP_SYS(time),
/* Process */

View File

@@ -245,8 +245,8 @@ apply_step_offset(double offset)
UTI_AddDoubleToTimespec(&old_time, -offset, &new_time);
UTI_TimespecToTimeval(&new_time, &new_time_tv);
if (PRV_SetTime(&new_time_tv, NULL) < 0) {
DEBUG_LOG("settimeofday() failed");
if (PRV_SetTime(CLOCK_REALTIME, &new_time_tv) < 0) {
DEBUG_LOG("clock_settime() failed");
return 0;
}