Index: hclnfsd.c
--- hclnfsd.c.orig	2005-04-26 21:23:57 +0200
+++ hclnfsd.c	2005-05-22 10:15:55 +0200
@@ -223,6 +223,7 @@
 static time_t GidCacheTimeoutTime=0;
 int debugmode, DontDoPrinting;
 char *debuglog;
+char *pidfile;
 
 struct queueentry {
 	int jobid;
@@ -2933,6 +2934,7 @@
 	prog = argv[0];
 	debugmode = 0;
 	debuglog = NULL;
+	pidfile = NULL;
 	DontDoPrinting = 0;
 	if (sizeof(_uint32) != 4)
 		ErrAndDie("Integral size mismatch.  Try defining INT32_LONG and recompiling\n", NULL, NULL, NULL, NULL);
@@ -3009,6 +3011,19 @@
 		argv++;
 		goto another;
 	}
+	if ((argc > 0) && (strcmp(*argv, "-P") == 0)) {
+		argc--;
+		argv++;
+		if (argc < 1)
+			ErrAndDie(USAGE, prog, NULL, NULL, NULL);
+		if (**argv)
+			pidfile = my_strdup(*argv);
+		if (pidfile == NULL)
+			ErrAndDie("Out of Memory", NULL, NULL, NULL, NULL);
+		argc--;
+		argv++;
+		goto another;
+	}
 
 	if ((argc != 1) && (!DontDoPrinting))
 		ErrAndDie(USAGE, prog, NULL, NULL, NULL);
@@ -3093,6 +3108,18 @@
 			fprintf(stdout,"%s: [main] real group %d, effective group %d\n", PROGNAME, getgid(), getegid());
 			debugmode++;
 		}
+        /* write pid file */
+        {
+            pid_t pid;
+            FILE *fp;
+            pid = getpid();
+            if ((fp = fopen(pidfile, "w")) == NULL) {
+                fprintf(stderr, "%s: [main] cannot write pidfile '%s'", PROGNAME, pidfile);
+                exit(1);
+            }
+            fprintf(fp, "%ld\n", (long)pid);
+            fclose(fp);
+        }
 	}
 
 	if (!DontDoPrinting) {
