add -pid parameter
diff --git a/src/main.cpp b/src/main.cpp
index 6644c79..2b8a0aa 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2,6 +2,11 @@
 #include <utils/Log.h>
 
 #include <fcntl.h>
+#include <fstream>
+#include <signal.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
 
 #include "AndroidDesktop.h"
 
@@ -22,13 +27,22 @@
 
 static char* gProgramName;
 static bool gCaughtSignal = false;
-
+static std::string mPidFile;
 static rfb::IntParameter rfbport("rfbport", "TCP port to listen for RFB protocol", 5900);
 
 static void printVersion(FILE* fp) {
     fprintf(fp, "VNCFlinger 1.0");
 }
 
+static void CleanupSignalHandler(int)
+{
+    ALOGI("You killed me - cleaning up");
+    if (mPidFile.length() != 0) {
+        remove(mPidFile.c_str());
+    }
+    exit(1);
+}
+
 static void usage() {
     printVersion(stderr);
     fprintf(stderr, "\nUsage: %s [<parameters>]\n", gProgramName);
@@ -53,6 +67,12 @@
 
     rfb::Configuration::enableServerParams();
 
+#ifdef SIGHUP
+    signal(SIGHUP, CleanupSignalHandler);
+#endif
+    signal(SIGINT, CleanupSignalHandler);
+    signal(SIGTERM, CleanupSignalHandler);
+
     for (int i = 1; i < argc; i++) {
         if (rfb::Configuration::setParam(argv[i])) continue;
 
@@ -63,6 +83,13 @@
                     continue;
                 }
             }
+            if (strcmp(argv[i], "-pid") == 0) {
+                if (i + 1 < argc) {
+                    mPidFile = std::string(argv[i + 1]);
+                    i++;
+                    continue;
+                }
+            }
             if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "-version") == 0 ||
                 strcmp(argv[i], "--version") == 0) {
                 printVersion(stdout);
@@ -77,7 +104,7 @@
     self->startThreadPool();
 
     std::list<network::SocketListener*> listeners;
-
+    int ret = 0;
     try {
         sp<AndroidDesktop> desktop = new AndroidDesktop();
         rfb::VNCServerST server("vncflinger", desktop.get());
@@ -88,6 +115,15 @@
 
         ALOGI("Listening on port %d", (int)rfbport);
 
+        if (mPidFile.length() != 0) {
+            // write a pid file
+            ALOGI("pid file %s", mPidFile.c_str());
+            pid_t pid = getpid();
+            std::ofstream outfile(mPidFile);
+            outfile << pid;
+            outfile.close();
+        }
+
         while (!gCaughtSignal) {
             int wait_ms;
             struct timeval tv;
@@ -170,9 +206,14 @@
                 desktop->processFrames();
             }
         }
-
+        ret = 0;
     } catch (rdr::Exception& e) {
         ALOGE("%s", e.str());
-        return 1;
+        ret = 1;
     }
+    ALOGI("Bye - cleaning up");
+    if (mPidFile.length() != 0) {
+        remove(mPidFile.c_str());
+    }
+    return ret;
 }