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;
}