IPACM: avoid duplicate instance
IPACM should detect if there is an instance already
running and exit if so.
Change-Id: Idf539414b940331f944ace521fca118ecc50a099
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
index 595a8c1..d13816f 100644
--- a/ipacm/src/IPACM_Main.cpp
+++ b/ipacm/src/IPACM_Main.cpp
@@ -102,6 +102,8 @@
#define IPACM_DIR_NAME "/etc"
#define IPACM_FILE_NAME "mobileap_firewall.xml"
+#define IPACM_PID_FILE "/etc/ipacm.pid"
+#define IPACM_NAME "ipacm"
#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))
#define INOTIFY_BUF_LEN (INOTIFY_EVENT_SIZE + 2*sizeof(IPACM_FILE_NAME))
@@ -113,6 +115,7 @@
uint32_t ipacm_event_stats[IPACM_EVENT_MAX];
bool ipacm_logging = true;
+void ipa_is_ipacm_running(void);
int ipa_get_if_index(char *if_name, int *if_index);
/* start netlink socket monitor*/
@@ -531,6 +534,9 @@
pthread_t netlink_thread = 0, monitor_thread = 0, ipa_driver_thread = 0;
pthread_t cmd_queue_thread = 0;
+ /* check if ipacm is already running or not */
+ ipa_is_ipacm_running();
+
IPACM_Neighbor *neigh = new IPACM_Neighbor();
IPACM_IfaceManager *ifacemgr = new IPACM_IfaceManager();
@@ -592,6 +598,85 @@
return IPACM_SUCCESS;
}
+/*===========================================================================
+ FUNCTION ipa_is_ipacm_running
+===========================================================================*/
+/*!
+@brief
+ Determine if IPACM process exists from its previous Process ID
+
+@return
+ None
+
+@note
+
+- Dependencies
+ - None
+
+- Side Effects
+ - None
+*/
+/*=========================================================================*/
+
+void ipa_is_ipacm_running(void) {
+
+ FILE *fp = NULL;
+ pid_t ipacm_pid =0;
+ char string[IPA_MAX_FILE_LEN];
+
+ /* find the latest pid of executed IPACM */
+ fp = fopen(IPACM_PID_FILE, "r");
+ if ( fp == NULL )
+ {
+ IPACMDBG("1st IPACM running \n");
+ }
+ else if (fscanf(fp, "%d", &ipacm_pid) != 1)
+ {
+ IPACMERR("Error reading ipacm_pid file \n");
+ ipacm_pid = 0;
+ fclose(fp);
+ }
+ else
+ {
+ IPACMDBG("Primary IPACM PID = %d\n",ipacm_pid);
+ fclose(fp);
+ if (0 == kill(ipacm_pid, 0)) /* Process exists */
+ {
+ /* check that process is IPACM */
+ memset(string, 0, IPA_MAX_FILE_LEN);
+ snprintf(string, IPA_MAX_FILE_LEN, "/proc/%d/cmdline", ipacm_pid);
+ IPACMDBG("open pid file %s \n",string);
+ fp = fopen(string, "r");
+ if ( fp == NULL )
+ {
+ IPACMDBG("open pid file failed \n");
+ }
+ else if (fgets(string, IPA_MAX_FILE_LEN, fp) != NULL)
+ {
+ IPACMDBG("get pid process name (%s)\n",string);
+ if( strcmp(string, IPACM_NAME) == 0)
+ {
+ if(ipacm_pid != getpid())
+ {
+ IPACMDBG("found IPACM already in PID (%d), new PID(%d) exit(0)\n",ipacm_pid, getpid());
+ exit(0);
+ }
+ IPACMDBG("same IPACM PID(%d) is running\n", getpid());
+ }
+ }
+ fclose(fp);
+ }
+ }
+ ipacm_pid = getpid();
+ fp = fopen(IPACM_PID_FILE, "w");
+ if ( fp != NULL )
+ {
+ IPACMDBG(" IPACM current PID: %d \n",ipacm_pid);
+ fprintf(fp, "%d", ipacm_pid);
+ fclose(fp);
+ }
+ return;
+}
/*===========================================================================
FUNCTION ipa_get_if_index