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 34f5f94ccb91..62e9b8c19e17 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 ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. Written by three acclaimed leaders in the field, this first edition is now available. Download your free book today! http://p.sf.net/sfu/13534_NeoTech _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel