]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
Switch refclock driver parameter to string
authorMiroslav Lichvar <mlichvar@redhat.com>
Wed, 19 Aug 2009 13:29:52 +0000 (15:29 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Wed, 19 Aug 2009 13:29:52 +0000 (15:29 +0200)
conf.c
refclock.c
refclock.h
refclock_shm.c

diff --git a/conf.c b/conf.c
index fdd9d9701b5353c59c6627e3a36ee0301a69ebbb..b5ef510fb22be61bfd3cfec6bbedd462718b6f55 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -428,10 +428,11 @@ parse_peer(const char *line)
 static void
 parse_refclock(const char *line)
 {
-  int i, n, param, poll, dpoll, filter_length;
+  int i, n, poll, dpoll, filter_length;
   unsigned long ref_id;
   double offset;
-  char name[5], cmd[10 + 1];
+  const char *tmp;
+  char name[5], cmd[10 + 1], *param;
   unsigned char ref[5];
 
   i = n_refclock_sources;
@@ -444,13 +445,27 @@ parse_refclock(const char *line)
   offset = 0.0;
   ref_id = 0;
 
-  if (sscanf(line, "%4s %d%n", name, &param, &n) != 2) {
-    LOG(LOGS_WARN, LOGF_Configure, "Could not read refclock driver name and parameter at line %d", line_number);
+  if (sscanf(line, "%4s%n", name, &n) != 1) {
+    LOG(LOGS_WARN, LOGF_Configure, "Could not read refclock driver name at line %d", line_number);
     return;
   }
-
   line += n;
 
+  while (isspace(line[0]))
+    line++;
+  tmp = line;
+  while (line[0] != '\0' && !isspace(line[0]))
+    line++;
+
+  if (line == tmp) {
+    LOG(LOGS_WARN, LOGF_Configure, "Could not read refclock parameter at line %d", line_number);
+    return;
+  }
+
+  param = MallocArray(char, 1 + line - tmp);
+  strncpy(param, tmp, line - tmp);
+  param[line - tmp + 1] = '\0';
+
   while (sscanf(line, "%10s%n", cmd, &n) == 1) {
     line += n;
     if (!strncasecmp(cmd, "refid", 5)) {
index 1d8a5b314f72f28dbc1b1b29664d8f73f0870b2d..8d0526a8660446ef609f5aee9135f71ade9c0b6d 100644 (file)
@@ -52,7 +52,7 @@ struct MedianFilter {
 struct RCL_Instance_Record {
   RefclockDriver *driver;
   void *data;
-  int driver_parameter;
+  char *driver_parameter;
   int driver_poll;
   int driver_polled;
   int poll;
@@ -99,6 +99,7 @@ RCL_Finalise(void)
       inst->driver->fini(inst);
 
     filter_fini(&inst->filter);
+    Free(inst->driver_parameter);
   }
 
   if (n_sources > 0)
@@ -139,7 +140,7 @@ RCL_AddRefclock(RefclockParameters *params)
   else {
     unsigned char ref[5] = { 0, 0, 0, 0, 0 };
 
-    snprintf((char *)ref, 5, "%s%d", params->driver_name, params->driver_parameter);
+    snprintf((char *)ref, 5, "%s%s", params->driver_name, params->driver_parameter);
     inst->ref_id = ref[0] << 24 | ref[1] << 16 | ref[2] << 8 | ref[3];
   }
 
@@ -206,7 +207,7 @@ RCL_GetDriverData(RCL_Instance instance)
   return instance->data;
 }
 
-int
+char *
 RCL_GetDriverParameter(RCL_Instance instance)
 {
   return instance->driver_parameter;
index 9e451b653260462fdcfac12cafedb0d42ff3849a..3c6f45a4464027d6e0b96c0d315325a8626372f1 100644 (file)
@@ -33,7 +33,7 @@
 
 typedef struct {
   char driver_name[4];
-  int driver_parameter;
+  char *driver_parameter;
   int driver_poll;
   int poll;
   int filter_length;
@@ -59,7 +59,7 @@ extern void RCL_ReportSource(RPT_SourceReport *report, struct timeval *now);
 /* functions used by drivers */
 extern void RCL_SetDriverData(RCL_Instance instance, void *data);
 extern void *RCL_GetDriverData(RCL_Instance instance);
-extern int RCL_GetDriverParameter(RCL_Instance instance);
+extern char *RCL_GetDriverParameter(RCL_Instance instance);
 extern int RCL_AddSample(RCL_Instance instance, struct timeval *sample_time, double offset, NTP_Leap leap_status);
 
 #endif
index 116c8d007bda3baadce9466f400ed1673b9bb78b..27dece21e2a04059fba73f27811009a8c5e1077c 100644 (file)
@@ -59,7 +59,7 @@ static int shm_initialise(RCL_Instance instance) {
   int id, param;
   struct shmTime *shm;
 
-  param = RCL_GetDriverParameter(instance);
+  param = atoi(RCL_GetDriverParameter(instance));
 
   id = shmget(SHMKEY + param, sizeof (struct shmTime), IPC_CREAT | 0700);
   if (id == -1) {