Do not call clock_open to open a clock device but let clock_add do that and
return the newly created struct. Also, store the device (interface) name in
struct clock.

Signed-off-by: Jiri Benc <jb...@redhat.com>
---
 phc2sys.c |   81 ++++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 46 insertions(+), 35 deletions(-)

diff --git a/phc2sys.c b/phc2sys.c
index 3f086496ee76..cbbc583b01ac 100644
--- a/phc2sys.c
+++ b/phc2sys.c
@@ -67,6 +67,7 @@ struct clock {
        int is_utc;
        struct servo *servo;
        enum servo_state servo_state;
+       char *device;
        const char *source_label;
        struct stats *offset_stats;
        struct stats *freq_stats;
@@ -129,19 +130,27 @@ static clockid_t clock_open(char *device)
        return clkid;
 }
 
-static int clock_add(struct node *node, clockid_t clkid)
+static struct clock *clock_add(struct node *node, char *device)
 {
        struct clock *c;
+       clockid_t clkid = CLOCK_INVALID;
        int max_ppb;
        double ppb;
 
+       if (device) {
+               clkid = clock_open(device);
+               if (clkid == CLOCK_INVALID)
+                       return NULL;
+       }
+
        c = calloc(1, sizeof(*c));
        if (!c) {
                pr_err("failed to allocate memory for a clock");
-               return -1;
+               return NULL;
        }
        c->clkid = clkid;
        c->servo_state = SERVO_UNLOCKED;
+       c->device = strdup(device);
 
        if (c->clkid == CLOCK_REALTIME) {
                c->source_label = "sys";
@@ -158,14 +167,14 @@ static int clock_add(struct node *node, clockid_t clkid)
                    !c->freq_stats ||
                    !c->delay_stats) {
                        pr_err("failed to create stats");
-                       return -1;
+                       return NULL;
                }
        }
        if (node->sanity_freq_limit) {
                c->sanity_check = clockcheck_create(node->sanity_freq_limit);
                if (!c->sanity_check) {
                        pr_err("failed to create clock check");
-                       return -1;
+                       return NULL;
                }
        }
 
@@ -181,7 +190,7 @@ static int clock_add(struct node *node, clockid_t clkid)
                max_ppb = phc_max_adj(c->clkid);
                if (!max_ppb) {
                        pr_err("clock is not adjustable");
-                       return -1;
+                       return NULL;
                }
        }
 
@@ -194,7 +203,7 @@ static int clock_add(struct node *node, clockid_t clkid)
                                                    node->phc_readings));
 
        LIST_INSERT_HEAD(&node->clocks, c, list);
-       return 0;
+       return c;
 }
 
 static int read_phc(clockid_t clkid, clockid_t sysclk, int readings,
@@ -699,8 +708,8 @@ static void usage(char *progname)
 int main(int argc, char *argv[])
 {
        char *progname;
-       clockid_t src = CLOCK_INVALID;
-       clockid_t dst = CLOCK_REALTIME;
+       char *src_name = NULL, *dst_name = NULL;
+       struct clock *src, *dst;
        int c, domain_number = 0, pps_fd = -1;
        int r, wait_sync = 0;
        int print_level = LOG_INFO, use_syslog = 1, verbose = 0;
@@ -723,7 +732,7 @@ int main(int argc, char *argv[])
                                  "c:d:s:E:P:I:S:F:R:N:O:L:i:u:wn:xl:mqvh"))) {
                switch (c) {
                case 'c':
-                       dst = clock_open(optarg);
+                       dst_name = strdup(optarg);
                        break;
                case 'd':
                        pps_fd = open(optarg, O_RDONLY);
@@ -737,7 +746,7 @@ int main(int argc, char *argv[])
                        fprintf(stderr,
                                "'-i' has been deprecated. please use '-s' 
instead.\n");
                case 's':
-                       src = clock_open(optarg);
+                       src_name = strdup(optarg);
                        break;
                case 'E':
                        if (!strcasecmp(optarg, "pi")) {
@@ -826,38 +835,46 @@ int main(int argc, char *argv[])
                }
        }
 
-       if (pps_fd < 0 && src == CLOCK_INVALID) {
+       if (pps_fd < 0 && !src_name) {
                fprintf(stderr,
                        "valid source clock must be selected.\n");
                goto bad_usage;
        }
 
-       if (dst == CLOCK_INVALID) {
+       if (!wait_sync && !node.forced_sync_offset) {
                fprintf(stderr,
-                       "valid destination clock must be selected.\n");
+                       "time offset must be specified using -w or -O\n");
                goto bad_usage;
        }
 
-       if (pps_fd >= 0 && dst != CLOCK_REALTIME) {
+       print_set_progname(progname);
+       print_set_verbose(verbose);
+       print_set_syslog(use_syslog);
+       print_set_level(print_level);
+
+       src = clock_add(&node, src_name);
+       free(src_name);
+       node.master = src;
+       dst = clock_add(&node, dst_name ? dst_name : "CLOCK_REALTIME");
+       free(dst_name);
+
+       if (!dst) {
                fprintf(stderr,
-                       "cannot use a pps device unless destination is 
CLOCK_REALTIME\n");
+                       "valid destination clock must be selected.\n");
                goto bad_usage;
        }
 
-       if (!wait_sync && !node.forced_sync_offset) {
+       if (!src) {
                fprintf(stderr,
-                       "time offset must be specified using -w or -O\n");
+                       "valid source clock must be selected.\n");
                goto bad_usage;
        }
 
-       print_set_progname(progname);
-       print_set_verbose(verbose);
-       print_set_syslog(use_syslog);
-       print_set_level(print_level);
-
-       clock_add(&node, src);
-       node.master = LIST_FIRST(&node.clocks);
-       clock_add(&node, dst);
+       if (pps_fd >= 0 && dst->clkid != CLOCK_REALTIME) {
+               fprintf(stderr,
+                       "cannot use a pps device unless destination is 
CLOCK_REALTIME\n");
+               goto bad_usage;
+       }
 
        if (wait_sync) {
                if (init_pmc(&node, domain_number))
@@ -882,22 +899,16 @@ int main(int argc, char *argv[])
                }
 
                if (node.forced_sync_offset ||
-                   (src != CLOCK_REALTIME && dst != CLOCK_REALTIME) ||
-                   src == CLOCK_INVALID)
+                   (src->clkid != CLOCK_REALTIME && dst->clkid != 
CLOCK_REALTIME) ||
+                   src->clkid == CLOCK_INVALID)
                        close_pmc(&node);
        }
 
        if (pps_fd >= 0) {
                /* only one destination clock allowed with PPS until we
                 * implement a mean to specify PTP port to PPS mapping */
-               struct clock *dst_clock;
-
-               LIST_FOREACH(dst_clock, &node.clocks, list) {
-                       if (dst_clock != node.master)
-                               break;
-               }
-               servo_sync_interval(dst_clock->servo, 1.0);
-               return do_pps_loop(&node, dst_clock, pps_fd);
+               servo_sync_interval(dst->servo, 1.0);
+               return do_pps_loop(&node, dst, pps_fd);
        }
 
        return do_loop(&node);
-- 
1.7.6.5


------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to