lad: Clean-up old response FIFOs
authorMisael Lopez Cruz <misael.lopez@ti.com>
Mon, 21 Dec 2015 17:39:30 +0000 (11:39 -0600)
committerAngela Stegmaier <angelabaker@ti.com>
Tue, 5 Jan 2016 18:59:18 +0000 (12:59 -0600)
The LAD daemon was only deleting specific FIFOs for new clients
whose PIDs had a corresponding old FIFO left over.  This was not
effective as the client side checks if the FIFO doesn't exist
before sending the LAD_CONNECT command, so the old FIFO was
not deleted.

The cleanup is changed to delete any old FIFO left over from
previous LAD sessions.  The cleanup implementation is based on
wpa_supplicant's.

Signed-off-by: Vishal Mahaveer <vishalm@ti.com>
Signed-off-by: Misael Lopez Cruz <misael.lopez@ti.com>
linux/src/daemon/lad.c

index 11dc1a79c58e64613bfd494f85bd63a57113b2cd..1c7c7072e7a506b7aded1c82b3b7701b5ba34422 100644 (file)
@@ -45,6 +45,7 @@
 #include <sys/types.h>
 #include <signal.h>
 #include <unistd.h>
+#include <dirent.h>
 
 #include <ti/ipc/MessageQ.h>
 #include <_MessageQ.h>
@@ -80,6 +81,7 @@ static FILE * responseFIFOFilePtr[LAD_MAXNUMCLIENTS];
 
 /* local internal routines */
 static LAD_ClientHandle assignClientId(Void);
+static Void cleanupFifos(Void);
 static Void cleanupDepartedClients(Void);
 static Int connectToLAD(String clientName, Int pid, String clientProto, Int *clientIdPtr);
 static Void disconnectFromLAD(Int clientId);
@@ -160,6 +162,8 @@ int main(int argc, char * argv[])
                     "\nERROR: Failed to change to LAD's working directory!\n");
             exit(EXIT_FAILURE);
         }
+    } else {
+        cleanupFifos();
     }
 
     /* process command line args */
@@ -882,6 +886,38 @@ static LAD_ClientHandle assignClientId(Void)
     return(clientId);
 }
 
+/*
+ *  ======== cleanupFifos ========
+ */
+static void cleanupFifos(Void)
+{
+    DIR *dir;
+    struct dirent entry;
+    struct dirent *result;
+    size_t dirnamelen;
+    size_t maxcopy;
+    Char pathname[PATH_MAX];
+    Char *namep;
+
+    if ((dir = opendir(LAD_WORKINGDIR)) == NULL)
+        return;
+
+    dirnamelen = snprintf(pathname, sizeof(pathname), "%s/", LAD_WORKINGDIR);
+    if (dirnamelen >= sizeof(pathname)) {
+        closedir(dir);
+        return;
+    }
+    namep = pathname + dirnamelen;
+    maxcopy = PATH_MAX - dirnamelen;
+    while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
+        /* Delete old FIFOs left over */
+        if ((entry.d_type == DT_FIFO) && (strlen(entry.d_name) < maxcopy)) {
+            strncpy(namep, entry.d_name, maxcopy);
+            unlink(pathname);
+        }
+    }
+    closedir(dir);
+}
 
 /*
  *  ======== cleanupDepartedClients ========
@@ -983,9 +1019,6 @@ static Int connectToLAD(String clientName, Int pid, String clientProto, Int *cli
 
 openResponseFIFO:
 
-    /* if response FIFO exists from previous LAD session delete it now */
-    unlink(clientName);
-
     /* create the dedicated response FIFO to the client */
     statusIO = mkfifo(clientName, 0777);
     if (statusIO != 0) {