[PATCH v3 1/4] staging: usbip: add "-P" / "--pid" option to save usbipd process id

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Introduce option "-P" / "--pid" to request that usbipd save its PID to
a file while running.

Signed-off-by: Anthony Foiani <anthony.foiani@xxxxxxxxx>
---
 drivers/staging/usbip/userspace/src/usbipd.c | 40 +++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/usbip/userspace/src/usbipd.c b/drivers/staging/usbip/userspace/src/usbipd.c
index 1ecca9d..f31b8b4 100644
--- a/drivers/staging/usbip/userspace/src/usbipd.c
+++ b/drivers/staging/usbip/userspace/src/usbipd.c
@@ -50,6 +50,8 @@
 
 #define MAIN_LOOP_TIMEOUT 10
 
+#define DEFAULT_PID_FILE "/var/run/" PROGNAME ".pid"
+
 static const char usbip_version_string[] = PACKAGE_STRING;
 
 static const char usbipd_help_string[] =
@@ -60,6 +62,10 @@ static const char usbipd_help_string[] =
 	"	-d, --debug\n"
 	"		Print debugging information.\n"
 	"\n"
+	"	-PFILE, --pid FILE\n"
+	"		Write process id to FILE.\n"
+	"		If no FILE specified, use " DEFAULT_PID_FILE "\n"
+	"\n"
 	"	-h, --help\n"
 	"		Print this help.\n"
 	"\n"
@@ -439,6 +445,31 @@ static void set_signal(void)
 	sigaction(SIGCLD, &act, NULL);
 }
 
+static const char *pid_file;
+
+static void write_pid_file()
+{
+	if (pid_file) {
+		dbg("creating pid file %s", pid_file);
+		FILE *fp = fopen(pid_file, "w");
+		if (!fp) {
+			err("pid_file: %s: %d (%s)",
+			    pid_file, errno, strerror(errno));
+			return;
+		}
+		fprintf(fp, "%d\n", getpid());
+		fclose(fp);
+	}
+}
+
+static void remove_pid_file()
+{
+	if (pid_file) {
+		dbg("removing pid file %s", pid_file);
+		unlink(pid_file);
+	}
+}
+
 static int do_standalone_mode(int daemonize)
 {
 	struct addrinfo *ai_head;
@@ -465,6 +496,7 @@ static int do_standalone_mode(int daemonize)
 		usbip_use_syslog = 1;
 	}
 	set_signal();
+	write_pid_file();
 
 	ai_head = do_getaddrinfo(NULL, PF_UNSPEC);
 	if (!ai_head) {
@@ -527,6 +559,7 @@ int main(int argc, char *argv[])
 	static const struct option longopts[] = {
 		{ "daemon",  no_argument, NULL, 'D' },
 		{ "debug",   no_argument, NULL, 'd' },
+		{ "pid",     optional_argument, NULL, 'P' },
 		{ "help",    no_argument, NULL, 'h' },
 		{ "version", no_argument, NULL, 'v' },
 		{ NULL,	     0,           NULL,  0  }
@@ -540,6 +573,7 @@ int main(int argc, char *argv[])
 
 	int daemonize = 0;
 	int opt, rc = -1;
+	pid_file = NULL;
 
 	usbip_use_stderr = 1;
 	usbip_use_syslog = 0;
@@ -549,7 +583,7 @@ int main(int argc, char *argv[])
 
 	cmd = cmd_standalone_mode;
 	for (;;) {
-		opt = getopt_long(argc, argv, "Ddhv", longopts, NULL);
+		opt = getopt_long(argc, argv, "DdP::hv", longopts, NULL);
 
 		if (opt == -1)
 			break;
@@ -564,6 +598,9 @@ int main(int argc, char *argv[])
 		case 'h':
 			cmd = cmd_help;
 			break;
+		case 'P':
+			pid_file = optarg ? optarg : DEFAULT_PID_FILE;
+			break;
 		case 'v':
 			cmd = cmd_version;
 			break;
@@ -577,6 +614,7 @@ int main(int argc, char *argv[])
 	switch (cmd) {
 	case cmd_standalone_mode:
 		rc = do_standalone_mode(daemonize);
+		remove_pid_file();
 		break;
 	case cmd_version:
 		printf(PROGNAME " (%s)\n", usbip_version_string);
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux