Add capability to set PECI device file name

This adds capability to set the name of the PECI device file.
If the PECI device name is null, use "/dev/peci-default".
If that does not exist fall back to "/dev/peci-0"

PECI_DEV environment variable can be used to override default
PECI device name, for example: export PECI_DEV=/dev/peci-wire

Added -d <dev name> command line option to peci_cmds, that
can be used to specify PECI device name, for example:
peci_cmds -d /dev/peci-0 gettemp

Added peci_SetDevName(char* dev_name) to libpeci API.

Tested manually:
1) using peci_cmds -d <dev_name> gettemp
2) calling peci_SetDevName(<dev_name>) from client application

Change-Id: I236857ec3ac42b8ff227aa32899ca8f1f3577d2b
Signed-off-by: Anna Platash <anna.platash@intel.com>
Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
diff --git a/peci.c b/peci.c
index 2627a03..53596f6 100644
--- a/peci.c
+++ b/peci.c
@@ -16,6 +16,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <peci.h>
+#include <stdlib.h>
 #include <string.h>
 #include <sys/ioctl.h>
 #include <syslog.h>
@@ -29,6 +30,47 @@
 
 EPECIStatus peci_GetDIB_seq(uint8_t target, uint64_t* dib, int peci_fd);
 
+char* peci_device_list[2];
+#define DEV_NAME_SIZE 64
+/*-------------------------------------------------------------------------
+ * This funcion sets the name of the PECI device file to use.
+ * If the PECI device name is null try "/dev/peci-default",
+ * if "/dev/peci-default" does not exist, fall back to "/dev/peci-0"
+ *------------------------------------------------------------------------*/
+void peci_SetDevName(char* peci_dev)
+{
+    static char peci_name_new[DEV_NAME_SIZE] = {};
+
+    if (peci_dev)
+    {
+        strncpy(peci_name_new, peci_dev, sizeof(peci_name_new));
+        peci_name_new[DEV_NAME_SIZE - 1] = '\0';
+        peci_device_list[0] = peci_name_new;
+        peci_device_list[1] = NULL;
+        syslog(LOG_INFO, "PECI set dev name to %s\n", peci_device_list[0]);
+    }
+    else
+    {
+        peci_device_list[0] = "/dev/peci-default";
+        peci_device_list[1] = "/dev/peci-0";
+        syslog(LOG_INFO, "PECI set dev names to %s, %s\n", peci_device_list[0],
+               peci_device_list[1]);
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * This function initializes PECI device name when a shared library
+ * is loaded, typically during program startup.
+ *------------------------------------------------------------------------*/
+static void init() __attribute__((constructor));
+static void init()
+{
+    // By default PECI_DEV is not defined in the environment,
+    // so this will call peci_SetDevName(NULL) and initialize
+    // PECI device name to defaults.
+    peci_SetDevName(getenv("PECI_DEV"));
+}
+
 /*-------------------------------------------------------------------------
  * This function unlocks the peci interface
  *------------------------------------------------------------------------*/
@@ -40,7 +82,6 @@
     }
 }
 
-#define PECI_DEVICE "/dev/peci-0"
 /*-------------------------------------------------------------------------
  * This function attempts to lock the peci interface with the specified
  * timeout and returns a file descriptor if successful.
@@ -51,6 +92,7 @@
     sRequest.tv_sec = 0;
     sRequest.tv_nsec = PECI_TIMEOUT_RESOLUTION_MS * 1000 * 1000;
     int timeout_count = 0;
+    char* peci_device = peci_device_list[0];
 
     if (NULL == peci_fd)
     {
@@ -58,7 +100,12 @@
     }
 
     // Open the PECI driver with the specified timeout
-    *peci_fd = open(PECI_DEVICE, O_RDWR | O_CLOEXEC);
+    *peci_fd = open(peci_device, O_RDWR | O_CLOEXEC);
+    if (*peci_fd == -1 && errno == ENOENT && peci_device_list[1])
+    {
+        peci_device = peci_device_list[1];
+        *peci_fd = open(peci_device, O_RDWR | O_CLOEXEC);
+    }
     switch (timeout_ms)
     {
         case PECI_NO_WAIT:
@@ -67,14 +114,14 @@
             while (-1 == *peci_fd)
             {
                 nanosleep(&sRequest, NULL);
-                *peci_fd = open(PECI_DEVICE, O_RDWR | O_CLOEXEC);
+                *peci_fd = open(peci_device, O_RDWR | O_CLOEXEC);
             }
         default:
             while (-1 == *peci_fd && timeout_count < timeout_ms)
             {
                 nanosleep(&sRequest, NULL);
                 timeout_count += PECI_TIMEOUT_RESOLUTION_MS;
-                *peci_fd = open(PECI_DEVICE, O_RDWR | O_CLOEXEC);
+                *peci_fd = open(peci_device, O_RDWR | O_CLOEXEC);
             }
     }
     if (-1 == *peci_fd)