#define OP_BINDSOCKET 1027
#define OP_NAME2IPADDRESS 1028
#define OP_RELOADDNS 1029
+#define OP_ADJUSTFREQ 1030
#define OP_QUIT 1099
union sockaddr_in46 {
char name[256];
} ReqName2IPAddress;
+#ifdef PRIVOPS_ADJUSTFREQ
+typedef struct {
+ int64_t freq;
+ int is_read_adj;
+} ReqAdjustFreq;
+#endif
+
typedef struct {
int op;
union {
ReqBindSocket bind_socket;
#ifdef PRIVOPS_NAME2IPADDRESS
ReqName2IPAddress name_to_ipaddress;
+#endif
+#ifdef PRIVOPS_ADJUSTFREQ
+ ReqAdjustFreq adjust_freq;
#endif
} data;
} PrvRequest;
IPAddr addresses[DNS_MAX_ADDRESSES];
} ResName2IPAddress;
+typedef struct {
+ int64_t oldfreq;
+} ResAdjustFreq;
+
typedef struct {
char msg[256];
} ResFatalMsg;
#endif
#ifdef PRIVOPS_NAME2IPADDRESS
ResName2IPAddress name_to_ipaddress;
+#endif
+#ifdef PRIVOPS_ADJUSTFREQ
+ ResAdjustFreq adjust_freq;
#endif
} data;
} PrvResponse;
}
#endif
+
+/* ======================================================================= */
+
+/* HELPER - perform adjustfreq() */
+
+#ifdef PRIVOPS_ADJUSTFREQ
+static void
+do_adjust_freq(const ReqAdjustFreq *req, PrvResponse *res)
+{
+ res->rc = adjfreq(req->is_read_adj ? NULL : &req->freq,
+ &res->data.adjust_freq.oldfreq);
+ if (res->rc)
+ res->res_errno = errno;
+}
+#endif
+
/* ======================================================================= */
/* HELPER - main loop - action requests from the daemon */
case OP_RELOADDNS:
do_reload_dns(&res);
break;
+#endif
+#ifdef PRIVOPS_ADJUSTFREQ
+ case OP_ADJUSTFREQ:
+ do_adjust_freq(&req.data.adjust_freq, &res);
+ break;
#endif
case OP_QUIT:
quit = 1;
/* ======================================================================= */
+/* DAEMON - request adjfreq() */
+
+#ifdef PRIVOPS_ADJUSTFREQ
+int
+PRV_AdjustFreq(const int64_t *freq, int64_t *oldfreq)
+{
+ PrvRequest req;
+ PrvResponse res;
+
+ if (!have_helper())
+ /* helper is not running */
+ return adjfreq(freq, oldfreq);
+
+ memset(&req, 0, sizeof (req));
+ req.op = OP_ADJUSTFREQ;
+
+ if (freq == NULL)
+ req.data.adjust_freq.is_read_adj = 1;
+ else
+ req.data.adjust_freq.freq = *freq;
+
+ submit_request(&req, &res);
+
+ if (oldfreq)
+ *oldfreq = res.data.adjust_freq.oldfreq;
+
+ return res.rc;
+}
+#endif
+
+/* ======================================================================= */
+
void
PRV_Initialise(int level)
{