]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
privops: add support for privileged ntp_adjtime()
authorMiroslav Lichvar <mlichvar@redhat.com>
Wed, 9 Dec 2015 17:11:09 +0000 (18:11 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Thu, 10 Dec 2015 15:30:38 +0000 (16:30 +0100)
privops.c
privops.h

index c084ac5e2858ae1233910e896f06f896959904d7..d7ac1fc619be074a09fdf439010e72d017ba8bc6 100644 (file)
--- a/privops.c
+++ b/privops.c
@@ -34,8 +34,9 @@
 #include "util.h"
 
 #define OP_ADJUSTTIME     1024
-#define OP_SETTIME        1025
-#define OP_BINDSOCKET     1026
+#define OP_ADJUSTTIMEX    1025
+#define OP_SETTIME        1026
+#define OP_BINDSOCKET     1027
 #define OP_QUIT           1099
 
 union sockaddr_in46 {
@@ -52,6 +53,12 @@ typedef struct {
   struct timeval tv;
 } ReqAdjustTime;
 
+#ifdef PRIVOPS_ADJUSTTIMEX
+typedef struct {
+  struct timex tmx;
+} ReqAdjustTimex;
+#endif
+
 typedef struct {
   struct timeval tv;
 } ReqSetTime;
@@ -66,6 +73,9 @@ typedef struct {
   int op;
   union {
     ReqAdjustTime adjust_time;
+#ifdef PRIVOPS_ADJUSTTIMEX
+    ReqAdjustTimex adjust_timex;
+#endif
     ReqSetTime set_time;
     ReqBindSocket bind_socket;
   } data;
@@ -77,6 +87,12 @@ typedef struct {
   struct timeval tv;
 } ResAdjustTime;
 
+#ifdef PRIVOPS_ADJUSTTIMEX
+typedef struct {
+  struct timex tmx;
+} ResAdjustTimex;
+#endif
+
 typedef struct {
   char msg[256];
 } ResFatalMsg;
@@ -88,6 +104,9 @@ typedef struct {
   union {
     ResFatalMsg fatal_msg;
     ResAdjustTime adjust_time;
+#ifdef PRIVOPS_ADJUSTTIMEX
+    ResAdjustTimex adjust_timex;
+#endif
   } data;
 } PrvResponse;
 
@@ -185,6 +204,21 @@ do_adjust_time(const ReqAdjustTime *req, PrvResponse *res)
 
 /* ======================================================================= */
 
+/* HELPER - perform ntp_adjtime() */
+
+#ifdef PRIVOPS_ADJUSTTIMEX
+static void
+do_adjust_timex(const ReqAdjustTimex *req, PrvResponse *res)
+{
+  res->data.adjust_timex.tmx = req->tmx;
+  res->rc = ntp_adjtime(&res->data.adjust_timex.tmx);
+  if (res->rc < 0)
+    res->res_errno = errno;
+}
+#endif
+
+/* ======================================================================= */
+
 /* HELPER - perform settimeofday() */
 
 #ifdef PRIVOPS_SETTIME
@@ -255,6 +289,11 @@ helper_main(int fd)
         do_adjust_time(&req.data.adjust_time, &res);
         break;
 #endif
+#ifdef PRIVOPS_ADJUSTTIMEX
+      case OP_ADJUSTTIMEX:
+        do_adjust_timex(&req.data.adjust_timex, &res);
+        break;
+#endif
 #ifdef PRIVOPS_SETTIME
       case OP_SETTIME:
         do_set_time(&req.data.set_time, &res);
@@ -417,6 +456,32 @@ PRV_AdjustTime(const struct timeval *delta, struct timeval *olddelta)
 
 /* ======================================================================= */
 
+/* DAEMON - request ntp_adjtime() */
+
+#ifdef PRIVOPS_ADJUSTTIMEX
+int
+PRV_AdjustTimex(struct timex *tmx)
+{
+  PrvRequest req;
+  PrvResponse res;
+
+  if (!have_helper())
+    return ntp_adjtime(tmx);
+
+  memset(&req, 0, sizeof (req));
+  req.op = OP_ADJUSTTIMEX;
+  req.data.adjust_timex.tmx = *tmx;
+
+  submit_request(&req, &res);
+
+  *tmx = res.data.adjust_timex.tmx;
+
+  return res.rc;
+}
+#endif
+
+/* ======================================================================= */
+
 /* DAEMON - request settimeofday() */
 
 #ifdef PRIVOPS_SETTIME
index a513ee99f0a5e07a40aa2f6c7ef32420a0829a36..ee0cb8f390427a99c35b31d12034e5dd0fc6eaad 100644 (file)
--- a/privops.h
+++ b/privops.h
@@ -34,6 +34,12 @@ int PRV_AdjustTime(const struct timeval *delta, struct timeval *olddelta);
 #define PRV_AdjustTime adjtime
 #endif
 
+#ifdef PRIVOPS_ADJUSTTIMEX
+int PRV_AdjustTimex(struct timex *txc);
+#else
+#define PRV_AdjustTimex ntp_adjtime
+#endif
+
 #ifdef PRIVOPS_SETTIME
 int PRV_SetTime(const struct timeval *tp, const struct timezone *tzp);
 #else