Blob Blame History Raw
commit 28865f91df96e83b28bb40565f12e62bd86e451f
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date:   Tue Jul 8 16:14:18 2014 +0200

    phc2sys: Add option to set path to ptp4l UDS.
    
    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>

diff --git a/phc2sys.8 b/phc2sys.8
index a906fb3..c4fb6f6 100644
--- a/phc2sys.8
+++ b/phc2sys.8
@@ -194,6 +194,10 @@ clock frequency (unless the
 .B \-S
 option is used).
 .TP
+.BI \-z " uds-address"
+Specifies the address of the server's UNIX domain socket.
+The default is /var/run/ptp4l.
+.TP
 .BI \-l " print-level"
 Set the maximum syslog level of messages which should be printed or sent to
 the system logger. The default is 6 (LOG_INFO).
diff --git a/phc2sys.c b/phc2sys.c
index 7815a8e..418f4ac 100644
--- a/phc2sys.c
+++ b/phc2sys.c
@@ -53,6 +53,7 @@
 #include "stats.h"
 #include "sysoff.h"
 #include "tlv.h"
+#include "uds.h"
 #include "util.h"
 #include "version.h"
 
@@ -1158,6 +1159,7 @@ static void usage(char *progname)
 		" -u [num]       number of clock updates in summary stats (0)\n"
 		" -n [num]       domain number (0)\n"
 		" -x             apply leap seconds by servo instead of kernel\n"
+		" -z [path]      server address for UDS (/var/run/ptp4l)\n"
 		" -l [num]       set the logging level to 'num' (6)\n"
 		" -m             print messages to stdout\n"
 		" -q             do not print messages to the syslog\n"
@@ -1192,7 +1194,7 @@ int main(int argc, char *argv[])
 	progname = strrchr(argv[0], '/');
 	progname = progname ? 1+progname : argv[0];
 	while (EOF != (c = getopt(argc, argv,
-				  "arc:d:s:E:P:I:S:F:R:N:O:L:i:u:wn:xl:mqvh"))) {
+				  "arc:d:s:E:P:I:S:F:R:N:O:L:i:u:wn:xz:l:mqvh"))) {
 		switch (c) {
 		case 'a':
 			autocfg = 1;
@@ -1285,6 +1287,14 @@ int main(int argc, char *argv[])
 		case 'x':
 			node.kernel_leap = 0;
 			break;
+		case 'z':
+			if (strlen(optarg) > MAX_IFNAME_SIZE) {
+				fprintf(stderr, "path %s too long, max is %d\n",
+					optarg, MAX_IFNAME_SIZE);
+				return -1;
+			}
+			strncpy(uds_path, optarg, MAX_IFNAME_SIZE);
+			break;
 		case 'l':
 			if (get_arg_val_i(c, optarg, &print_level,
 					  PRINT_LEVEL_MIN, PRINT_LEVEL_MAX))

commit 2423357754ae7d64d844fc064c72b8d27adf40c4
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date:   Tue Jul 8 16:14:19 2014 +0200

    Remove socket when closing UDS transport.
    
    [RC: added cast to sockaddr to avoid compiler warning. ]
    
    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>

diff --git a/uds.c b/uds.c
index e98e32c..97edb97 100644
--- a/uds.c
+++ b/uds.c
@@ -42,6 +42,14 @@ struct uds {
 
 static int uds_close(struct transport *t, struct fdarray *fda)
 {
+	struct sockaddr_un sa;
+	socklen_t len = sizeof(sa);
+
+	if (!getsockname(fda->fd[FD_GENERAL], (struct sockaddr *) &sa, &len) &&
+	    sa.sun_family == AF_LOCAL) {
+		unlink(sa.sun_path);
+	}
+
 	close(fda->fd[FD_GENERAL]);
 	return 0;
 }

commit ca637b2067ae78c9830c38bb5e9a659255b1a4a2
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date:   Tue Jul 8 16:14:20 2014 +0200

    Move signal handling to util.c.
    
    This will be useful in phc2sys and pmc.
    
    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>

diff --git a/ptp4l.c b/ptp4l.c
index 25270c6..5080a79 100644
--- a/ptp4l.c
+++ b/ptp4l.c
@@ -18,7 +18,6 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 #include <limits.h>
-#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -40,8 +39,6 @@
 
 int assume_two_step = 0;
 
-static int running = 1;
-
 static struct config cfg_settings = {
 	.dds = {
 		.dds = {
@@ -131,12 +128,6 @@ static struct config cfg_settings = {
 	.cfg_ignore = 0,
 };
 
-static void handle_int_quit_term(int s)
-{
-	pr_notice("caught signal %d", s);
-	running = 0;
-}
-
 static void usage(char *progname)
 {
 	fprintf(stderr,
@@ -184,18 +175,8 @@ int main(int argc, char *argv[])
 	struct defaultDS *ds = &cfg_settings.dds.dds;
 	int phc_index = -1, required_modes = 0;
 
-	if (SIG_ERR == signal(SIGINT, handle_int_quit_term)) {
-		fprintf(stderr, "cannot handle SIGINT\n");
+	if (handle_term_signals())
 		return -1;
-	}
-	if (SIG_ERR == signal(SIGQUIT, handle_int_quit_term)) {
-		fprintf(stderr, "cannot handle SIGQUIT\n");
-		return -1;
-	}
-	if (SIG_ERR == signal(SIGTERM, handle_int_quit_term)) {
-		fprintf(stderr, "cannot handle SIGTERM\n");
-		return -1;
-	}
 
 	/* Set fault timeouts to a default value */
 	for (i = 0; i < FT_CNT; i++) {
@@ -404,7 +385,7 @@ int main(int argc, char *argv[])
 		return -1;
 	}
 
-	while (running) {
+	while (is_running()) {
 		if (clock_poll(clock))
 			break;
 	}
diff --git a/util.c b/util.c
index 1e86040..ae66bb1 100644
--- a/util.c
+++ b/util.c
@@ -17,11 +17,13 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 #include <errno.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "address.h"
+#include "print.h"
 #include "sk.h"
 #include "util.h"
 
@@ -29,6 +31,8 @@
 #define NS_PER_HOUR (3600 * NS_PER_SEC)
 #define NS_PER_DAY (24 * NS_PER_HOUR)
 
+static int running = 1;
+
 const char *ps_str[] = {
 	"NONE",
 	"INITIALIZING",
@@ -311,3 +315,31 @@ int get_arg_val_d(int op, const char *optarg, double *val,
 	}
 	return 0;
 }
+
+static void handle_int_quit_term(int s)
+{
+	pr_notice("caught signal %d", s);
+	running = 0;
+}
+
+int handle_term_signals(void)
+{
+	if (SIG_ERR == signal(SIGINT, handle_int_quit_term)) {
+		fprintf(stderr, "cannot handle SIGINT\n");
+		return -1;
+	}
+	if (SIG_ERR == signal(SIGQUIT, handle_int_quit_term)) {
+		fprintf(stderr, "cannot handle SIGQUIT\n");
+		return -1;
+	}
+	if (SIG_ERR == signal(SIGTERM, handle_int_quit_term)) {
+		fprintf(stderr, "cannot handle SIGTERM\n");
+		return -1;
+	}
+	return 0;
+}
+
+int is_running(void)
+{
+	return running;
+}
diff --git a/util.h b/util.h
index 3fae51c..cf05e49 100644
--- a/util.h
+++ b/util.h
@@ -212,4 +212,18 @@ int get_arg_val_ui(int op, const char *optarg, unsigned int *val,
 int get_arg_val_d(int op, const char *optarg, double *val,
 		  double min, double max);
 
+/**
+ * Setup a handler for terminating signals (SIGINT, SIGQUIT, SIGTERM).
+ *
+ * @return       0 on success, -1 on error.
+ */
+int handle_term_signals(void);
+
+/**
+ * Check if a terminating signal was received.
+ *
+ * @return       1 if no terminating signal was received, 0 otherwise.
+ */
+int is_running(void);
+
 #endif

commit 30841a68495b5e9ba11ff4b056c4a79b0b73d14a
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date:   Tue Jul 8 16:14:21 2014 +0200

    Close client UDS transport before exit.
    
    In pmc and phc2sys handle terminating signals and close the UDS
    transport before exit to remove the sockets in /var/run.
    
    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>

diff --git a/phc2sys.c b/phc2sys.c
index 418f4ac..3039e51 100644
--- a/phc2sys.c
+++ b/phc2sys.c
@@ -526,7 +526,7 @@ static int do_pps_loop(struct node *node, struct clock *clock, int fd)
 		enable_pps_output(node->master->clkid);
 	}
 
-	while (1) {
+	while (is_running()) {
 		if (!read_pps(fd, &pps_offset, &pps_ts)) {
 			continue;
 		}
@@ -570,7 +570,7 @@ static int do_loop(struct node *node, int subscriptions)
 	interval.tv_sec = node->phc_interval;
 	interval.tv_nsec = (node->phc_interval - interval.tv_sec) * 1e9;
 
-	while (1) {
+	while (is_running()) {
 		clock_nanosleep(CLOCK_MONOTONIC, 0, &interval, NULL);
 		if (update_pmc(node, subscriptions) < 0)
 			continue;
@@ -611,7 +611,7 @@ static int do_loop(struct node *node, int subscriptions)
 			update_clock(node, clock, offset, ts, delay);
 		}
 	}
-	return 0; /* unreachable */
+	return 0;
 }
 
 static int check_clock_identity(struct node *node, struct ptp_message *msg)
@@ -1187,6 +1187,8 @@ int main(int argc, char *argv[])
 		.kernel_leap = 1,
 	};
 
+	handle_term_signals();
+
 	configured_pi_kp = KP;
 	configured_pi_ki = KI;
 
@@ -1349,7 +1351,8 @@ int main(int argc, char *argv[])
 			return -1;
 		if (auto_init_ports(&node, rt) < 0)
 			return -1;
-		return do_loop(&node, 1);
+		r = do_loop(&node, 1);
+		goto end;
 	}
 
 	src = clock_add(&node, src_name);
@@ -1377,14 +1380,16 @@ int main(int argc, char *argv[])
 		goto bad_usage;
 	}
 
+	r = -1;
+
 	if (wait_sync) {
 		if (init_pmc(&node, domain_number))
-			return -1;
+			goto end;
 
-		while (1) {
+		while (is_running()) {
 			r = run_pmc_wait_sync(&node, 1000);
 			if (r < 0)
-				return -1;
+				goto end;
 			if (r > 0)
 				break;
 			else
@@ -1395,7 +1400,7 @@ int main(int argc, char *argv[])
 			r = run_pmc_get_utc_offset(&node, 1000);
 			if (r <= 0) {
 				pr_err("failed to get UTC offset");
-				return -1;
+				goto end;
 			}
 		}
 
@@ -1409,11 +1414,16 @@ int main(int argc, char *argv[])
 		/* only one destination clock allowed with PPS until we
 		 * implement a mean to specify PTP port to PPS mapping */
 		servo_sync_interval(dst->servo, 1.0);
-		return do_pps_loop(&node, dst, pps_fd);
+		r = do_pps_loop(&node, dst, pps_fd);
+	} else {
+		r = do_loop(&node, 0);
 	}
 
-	return do_loop(&node, 0);
+end:
+	if (node.pmc)
+		close_pmc(&node);
 
+	return r;
 bad_usage:
 	usage(progname);
 	return -1;
diff --git a/pmc.c b/pmc.c
index ba06293..8cfae92 100644
--- a/pmc.c
+++ b/pmc.c
@@ -714,6 +714,7 @@ int main(int argc, char *argv[])
 	const char *iface_name = NULL;
 	char *progname;
 	int c, cnt, length, tmo = -1, batch_mode = 0, zero_datalen = 0;
+	int ret = 0;
 	char line[1024], *command = NULL;
 	enum transport_type transport_type = TRANS_UDP_IPV4;
 	UInteger8 boundary_hops = 1, domain_number = 0, transport_specific = 0;
@@ -721,6 +722,8 @@ int main(int argc, char *argv[])
 #define N_FD 2
 	struct pollfd pollfd[N_FD];
 
+	handle_term_signals();
+
 	/* Process the command line arguments. */
 	progname = strrchr(argv[0], '/');
 	progname = progname ? 1+progname : argv[0];
@@ -798,7 +801,7 @@ int main(int argc, char *argv[])
 	pollfd[0].fd = batch_mode ? -1 : STDIN_FILENO;
 	pollfd[1].fd = pmc_get_transport_fd(pmc);
 
-	while (1) {
+	while (is_running()) {
 		if (batch_mode && !command) {
 			if (optind < argc) {
 				command = argv[optind++];
@@ -823,7 +826,8 @@ int main(int argc, char *argv[])
 				continue;
 			} else {
 				pr_emerg("poll failed");
-				return -1;
+				ret = -1;
+				break;
 			}
 		} else if (!cnt) {
 			break;
@@ -866,5 +870,5 @@ int main(int argc, char *argv[])
 
 	pmc_destroy(pmc);
 	msg_cleanup();
-	return 0;
+	return ret;
 }

commit 1773d21f26eb1aa2da0645af116d6ce27591a9cc
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date:   Tue Jul 8 16:14:22 2014 +0200

    Append PID to client UDS paths.
    
    This allows running multiple phc2sys and pmc instances at the same time.
    
    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>

diff --git a/phc2sys.c b/phc2sys.c
index 3039e51..391ae62 100644
--- a/phc2sys.c
+++ b/phc2sys.c
@@ -738,8 +738,11 @@ static void send_subscription(struct node *node)
 
 static int init_pmc(struct node *node, int domain_number)
 {
-	node->pmc = pmc_create(TRANS_UDS, "/var/run/phc2sys", 0,
-				domain_number, 0, 1);
+	char uds_local[MAX_IFNAME_SIZE + 1];
+
+	snprintf(uds_local, sizeof(uds_local), "/var/run/phc2sys.%d",
+		 getpid());
+	node->pmc = pmc_create(TRANS_UDS, uds_local, 0, domain_number, 0, 1);
 	if (!node->pmc) {
 		pr_err("failed to create pmc");
 		return -1;
diff --git a/pmc.8 b/pmc.8
index 0d36354..b113c78 100644
--- a/pmc.8
+++ b/pmc.8
@@ -73,7 +73,7 @@ Specify the boundary hops value in sent messages. The default is 1.
 Specify the domain number in sent messages. The default is 0.
 .TP
 .BI \-i " interface"
-Specify the network interface. The default is /var/run/pmc for the Unix Domain
+Specify the network interface. The default is /var/run/pmc.$pid for the Unix Domain
 Socket transport and eth0 for the other transports.
 .TP
 .BI \-s " uds-address"
diff --git a/pmc.c b/pmc.c
index 8cfae92..d58e190 100644
--- a/pmc.c
+++ b/pmc.c
@@ -700,7 +700,7 @@ static void usage(char *progname)
 		" -d [num]  domain number, default 0\n"
 		" -h        prints this message and exits\n"
 		" -i [dev]  interface device to use, default 'eth0'\n"
-		"           for network and '/var/run/pmc' for UDS.\n"
+		"           for network and '/var/run/pmc.$pid' for UDS.\n"
 		" -s [path] server address for UDS, default '/var/run/ptp4l'.\n"
 		" -t [hex]  transport specific field, default 0x0\n"
 		" -v        prints the software version and exits\n"
@@ -715,7 +715,7 @@ int main(int argc, char *argv[])
 	char *progname;
 	int c, cnt, length, tmo = -1, batch_mode = 0, zero_datalen = 0;
 	int ret = 0;
-	char line[1024], *command = NULL;
+	char line[1024], *command = NULL, uds_local[MAX_IFNAME_SIZE + 1];
 	enum transport_type transport_type = TRANS_UDP_IPV4;
 	UInteger8 boundary_hops = 1, domain_number = 0, transport_specific = 0;
 	struct ptp_message *msg;
@@ -781,7 +781,13 @@ int main(int argc, char *argv[])
 	}
 
 	if (!iface_name) {
-		iface_name = transport_type == TRANS_UDS ? "/var/run/pmc" : "eth0";
+		if (transport_type == TRANS_UDS) {
+			snprintf(uds_local, sizeof(uds_local),
+				 "/var/run/pmc.%d", getpid());
+			iface_name = uds_local;
+		} else {
+			iface_name = "eth0";
+		}
 	}
 	if (optind < argc) {
 		batch_mode = 1;
commit aa24ba58e1901f9397624665c1f19a2432e426d0
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date:   Fri Oct 3 14:13:49 2014 +0200

    Don't print messages in signal handler.
    
    Only reentrant functions should be called here.
    
    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>

diff --git a/util.c b/util.c
index ae66bb1..cb428b1 100644
--- a/util.c
+++ b/util.c
@@ -318,7 +318,6 @@ int get_arg_val_d(int op, const char *optarg, double *val,
 
 static void handle_int_quit_term(int s)
 {
-	pr_notice("caught signal %d", s);
 	running = 0;
 }