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

Re: LSB-ize daemon without pidfile handling



On 2007-11-14, Marc Haber <mh+debian-devel@zugschlus.de> wrote:
> On Sun, 11 Nov 2007 11:47:49 +0000, Stephen Gran <sgran@debian.org>
> wrote:
>>This one time, at band camp, Marc Haber said:
>>> How many seconds until the "please make pidfile location configurable"
>>> wishlist bug?
>>
>>Which is another, what, 5-10 lines of code?
>
> I do not feel able to write C code for string operations without
> introducing a truckload of buffer overflows and off-by-one-errors.

Have you tried asking the author of ser2net if he is willing to add the
functionality...?

Anyway, here's a (compile-tested only) patch:

--- ser2net-2.3/ser2net.c	2005-03-10 10:59:53.000000000 -0500
+++ ser2net-2.3.pidfile/ser2net.c	2007-11-14 12:56:07.885930455 -0500
@@ -41,6 +41,7 @@
 
 static char *config_file = "/etc/ser2net.conf";
 static char *config_port = NULL;
+static char *pid_file = NULL;
 static int detach = 1;
 static int debug = 0;
 #ifdef USE_UUCP_LOCKING
@@ -59,6 +60,7 @@ static char *help_string =
 "     you must specify a -c after the last -C to have it read a config\n"
 "     file, too."
 "  -p <controller port> - Start a controller session on the given TCP port\n"
+"  -P <file> - set location of pid file\n"
 "  -n - Don't detach from the controlling terminal\n"
 "  -d - Don't detach and send debug I/O to standard output\n"
 #ifdef USE_UUCP_LOCKING
@@ -83,6 +85,16 @@ arg_error(char *name)
     exit(1);
 }
 
+void
+make_pidfile(char *pidfile)
+{
+    FILE *fpidfile;
+    if (pidfile && (fpidfile = fopen(pidfile, "w"))) {
+	fprintf(fpidfile, "%d\n", getpid());
+	fclose(fpidfile);
+    }
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -147,6 +159,15 @@ main(int argc, char *argv[])
 	    }
 	    config_port = argv[i];
 	    break;
+	
+	case 'P':
+	    i++;
+	    if (i == argc) {
+		fprintf(stderr, "No pid file specified with -P\n");
+		arg_error(argv[0]);
+	    }
+	    pid_file = argv[i];
+	    break;
 
 #ifdef USE_UUCP_LOCKING
 	case 'u':
@@ -206,6 +227,10 @@ main(int argc, char *argv[])
 	close(0);
 	close(1);
 	close(2);
+
+	/* write pid file */
+	make_pidfile(pid_file);
+
     } else if (debug) {
 	openlog("ser2net", LOG_PID | LOG_CONS | LOG_PERROR, LOG_DAEMON);
     }

-- 
Robert Edmonds
edmonds@debian.org



Reply to: