Implemented on demand/static loading of plugins (part I); ATTENTION: pluginf config...
authorIngo Huerner <ingo.huerner@xse.de>
Fri, 13 Jun 2014 14:40:48 +0000 (16:40 +0200)
committerIngo Huerner <ingo.huerner@xse.de>
Fri, 13 Jun 2014 14:40:48 +0000 (16:40 +0200)
include/persistence_client_custom.h
include/persistence_client_library.h
src/persistence_client_library.c
src/persistence_client_library_backup_filelist.c
src/persistence_client_library_custom_loader.c
src/persistence_client_library_custom_loader.h
src/persistence_client_library_data_organization.c
src/persistence_client_library_data_organization.h
src/persistence_client_library_dbus_cmd.c

index b9bf8c9..302226a 100644 (file)
@@ -34,7 +34,7 @@
  *  - 2012.07.14 ihuerner  1.0.0.0  Initial version of the interface
  */
 
+
 /** \ingroup GEN_PERS_CLIENTLIB_INTERFACE API document
  *  \{
  */
index 1bd005a..f7a835c 100644 (file)
  *           The Persistence Client Library (PCL) provides an API to applications to read and write persistent data
  *           via a key-value and a file interface.<br>
  *           It also provide a plugin API to allow users to extend the client library with custom storage solutions.
+ *
+ * @section Custom plugin configuration file
+ *          @attention
+ *          The plugin configuration file has been changed!
+ *
+ *          The configuration file has now the following format<br>
+ *          <predefinedPluginName> <pathAndLibraryName> <loadingType> <initType>
+ *
+ *          <b>Predefined plugin name</b><br>
+ *          Use one of the following names:
+ *          - early     => predefined custom library for early persistence
+ *          - secure    => predefined custom library for secure persistence
+ *          - emergency => predefined custom library for emengency persistence
+ *          - hwinfo    => predefined custom library for hw information
+ *          - custom1   => custom library 1
+ *          - custom2   => custom library 2
+ *          - custom3   => custom library 3
+ *
+ *          <b>Path and library name:</b><br>
+ *          The name and path of the library
+ *
+ *          <b>Valid loading type:</b>
+ *          - "init" ==> if the plugin must be laoding during the pclInitLibrary function
+ *          - "on"     ==> if on demand laoding of the plugin is requested. The plugin will be loaded
+ *          when a plugin function will be loaded the first time
+ *
+ *          <b>Init Type:</b>
+ *          - sync ==> use the "plugin_init" function for plugin initialization
+ *          - async ==> use the "plugin_init_async" function for plugin initialization
+ *
+ *          <b>Example:</b><br>
+ *          hwinfo /usr/local/lib/libhwinfoperscustom.so init async
+ *
+ *          @note
+ *          Make sure that there is only ONE blank between each entry and no blank at the end of the file.
+ *          The parser has been optimized for speed, so there is less error checking.
  */
 
 
index 94b1169..18d5cdd 100644 (file)
@@ -45,21 +45,27 @@ static int gShutdownMode = 0;
 static int gCancelCounter = 0;
 
 
+int customAsyncInitClbk(int errcode)
+{
+       printf("Dummy async init Callback\n");
+}
+
+
 int pclInitLibrary(const char* appName, int shutdownMode)
 {
-   int status = 0;
    int i = 0, rval = 1;
 
+   printf("INIT START\n\n");
+
    if(gPclInitialized == PCLnotInitialized)
    {
+       printf("INIT START ==> DO INIT\n\n");
       gShutdownMode = shutdownMode;
 
       DLT_REGISTER_CONTEXT(gPclDLTContext,"PCL","Context for persistence client library logging");
       DLT_LOG(gPclDLTContext, DLT_LOG_INFO, DLT_STRING("pclInitLibrary => I N I T  Persistence Client Library - "), DLT_STRING(appName),
                               DLT_STRING("- init counter: "), DLT_INT(gPclInitialized) );
 
-      /// environment variable for on demand loading of custom libraries
-      const char *pOnDemandLoad = getenv("PERS_CUSTOM_LIB_LOAD_ON_DEMAND");
       /// environment variable for max key value data
       const char *pDataSize = getenv("PERS_MAX_KEY_VAL_DATA_SIZE");
       /// blacklist path environment variable
@@ -121,9 +127,9 @@ int pclInitLibrary(const char* appName, int shutdownMode)
       DLT_LOG(gPclDLTContext, DLT_LOG_WARN, DLT_STRING("PAS interface is not enabled, enable with \"./configure --enable-pasinterface\""));
 #endif
 
+
       /// get custom library names to load
-      status = get_custom_libraries();
-      if(status >= 0)
+      if(get_custom_libraries() >= 0)
       {
          // initialize custom library structure
          for(i = 0; i < PersCustomLib_LastEntry; i++)
@@ -131,42 +137,62 @@ int pclInitLibrary(const char* appName, int shutdownMode)
             invalidate_custom_plugin(i);
          }
 
-         if(pOnDemandLoad == NULL)  // load all available libraries now
-         {
-            for(i=0; i < PersCustomLib_LastEntry; i++ )
-            {
-               if(check_valid_idx(i) != -1)
-               {
-                  if(load_custom_library(i, &gPersCustomFuncs[i] ) == 1)
-                  {
-                     if( (gPersCustomFuncs[i].custom_plugin_init) != NULL)
-                     {
-                        DLT_LOG(gPclDLTContext, DLT_LOG_INFO, DLT_STRING("pclInitLibrary => Loaded plugin: "),
-                                                           DLT_STRING(get_custom_client_lib_name(i)));
-                        gPersCustomFuncs[i].custom_plugin_init();
-                     }
-                     else
-                     {
-                        DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("pclInitLibrary => E r r o r could not load plugin functions: "),
-                                                            DLT_STRING(get_custom_client_lib_name(i)));
-                     }
-                  }
-                  else
-                  {
-                     DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("pclInitLibrary => E r r o r could not load plugin: "),
-                                          DLT_STRING(get_custom_client_lib_name(i)));
-                  }
-               }
-               else
-               {
-                  continue;
-               }
-            }
-         }
+                       for(i=0; i < PersCustomLib_LastEntry; i++ )
+                       {
+                               if(check_valid_idx(i) != -1)
+                               {
+                                       if(getCustomLoadingType(i) == LoadType_PclInit) // check if the plugin must be loaded on plc init
+                                       {
+                                               if(load_custom_library(i, &gPersCustomFuncs[i] ) == 1)
+                                               {
+                                                       PersInitType_e initType = getCustomInitType(i);
+                                                       if(initType == Init_Synchronous)
+                                                       {
+                                                               if( (gPersCustomFuncs[i].custom_plugin_init) != NULL)
+                                                               {
+                                                                       DLT_LOG(gPclDLTContext, DLT_LOG_INFO, DLT_STRING("pclInitLibrary => plugin: "), DLT_STRING(get_custom_client_lib_name(i)));
+                                                                       gPersCustomFuncs[i].custom_plugin_init();
+                                                               }
+                                                               else
+                                                               {
+                                                                       DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("pclInitLibrary => E r r o r could not load plugin functions: "),
+                                                                                                                                                                       DLT_STRING(get_custom_client_lib_name(i)));
+                                                               }
+                                                       }
+                                                       else if(initType == Init_Asynchronous)
+                                                       {
+                                                               if( (gPersCustomFuncs[i].custom_plugin_init_async) != NULL)
+                                                               {
+                                                                       DLT_LOG(gPclDLTContext, DLT_LOG_INFO, DLT_STRING("pclInitLibrary => plugin: "), DLT_STRING(get_custom_client_lib_name(i)));
+                                                                       gPersCustomFuncs[i].custom_plugin_init_async(customAsyncInitClbk);
+                                                               }
+                                                               else
+                                                               {
+                                                                       DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("pclInitLibrary => E r r o r could not load plugin functions: "),
+                                                                                                                                                                       DLT_STRING(get_custom_client_lib_name(i)));
+                                                               }
+                                                       }
+                                                       else
+                                                       {
+                                                               DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("pclInitLibrary => E r r o r unknown init type "), DLT_STRING(get_custom_client_lib_name(i)));
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("pclInitLibrary => E r r o r could not load plugin: "),
+                                                                                                               DLT_STRING(get_custom_client_lib_name(i)));
+                                               }
+                                       }
+                               }
+                               else
+                               {
+                                       continue;
+                               }
+                       }
       }
       else
       {
-         DLT_LOG(gPclDLTContext, DLT_LOG_WARN, DLT_STRING("pclInit => Failed to load custom library config table => error number:"), DLT_INT(status));
+         DLT_LOG(gPclDLTContext, DLT_LOG_WARN, DLT_STRING("pclInit => Failed to load custom library config table"));
       }
 
       // initialize keyHandle array
@@ -186,6 +212,7 @@ int pclInitLibrary(const char* appName, int shutdownMode)
       DLT_LOG(gPclDLTContext, DLT_LOG_INFO, DLT_STRING("pclInitLibrary => I N I T  Persistence Client Library - "), DLT_STRING(gAppId),
                            DLT_STRING("- ONLY INCREMENT init counter: "), DLT_INT(gPclInitialized) );
    }
+
    return rval;
 }
 
index 79188ee..c8da7b5 100644 (file)
@@ -51,23 +51,6 @@ void* key_val_dup(void *p);
 int key_val_cmp(const void *p1, const void *p2 );
 
 
-
-/// the size of the token array
-enum configConstants
-{
-   TOKENARRAYSIZE = 255
-};
-
-
-const char gCharLookup[] =
-{
-   0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  // from 0x0 (NULL)  to 0x1F (unit seperator)
-   0,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  // from 020 (space) to 0x2F (?)
-   1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  // from 040 (@)     to 0x5F (_)
-   1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1     // from 060 (')     to 0x7E (~)
-};
-
-
 char* gpConfigFileMap = 0;
 char* gpTokenArray[TOKENARRAYSIZE] = {0};
 int gTokenCounter = 0;
@@ -82,7 +65,7 @@ static jsw_rbtree_t *gRb_tree_bl = NULL;
 int need_backup_key(unsigned int key);
 
 
-void fillCharTokenArray()
+void fillFileBackupCharTokenArray()
 {
    unsigned int i=0;
    int blankCount=0;
@@ -210,7 +193,7 @@ int readBlacklistConfigFile(const char* filename)
           // reset the token counter
           gTokenCounter = 0;
 
-          fillCharTokenArray();
+          fillFileBackupCharTokenArray();
 
           // create filenames and store them in the tree
           createAndStoreFileNames();
index d0dc4ae..36fc0b8 100644 (file)
 /// type definition of persistence custom library information
 typedef struct sPersCustomLibInfo
 {
-   char libname[CustLibMaxLen];
-   int valid;
+   char                                                libname[CustLibMaxLen];
+   int                                                 valid;
+   PersInitType_e              initFunction;
+   PersLoadingType_e   loadingType;
 } PersCustomLibInfo;
 
 
 /// array with custom client library names
 static PersCustomLibInfo gCustomLibArray[PersCustomLib_LastEntry];
 
+char* gpCustomConfigFileMap = 0;
+char* gpCustomTokenArray[TOKENARRAYSIZE];
+int   gCustomTokenCounter = 0;
+unsigned int gCustomConfigFileSize = 0;
+
+
+
+void fillCustomCharTokenArray()
+{
+   unsigned int i=0;
+   int blankCount=0;
+   char* tmpPointer = gpCustomConfigFileMap;
+
+   // set the first pointer to the start of the file
+   gpCustomTokenArray[blankCount] = tmpPointer;
+   blankCount++;
+
+   while(i < gCustomConfigFileSize)
+   {
+      if(1 != gCharLookup[(int)*tmpPointer])
+      {
+         *tmpPointer = 0;
+
+         // check if we are at the end of the token array
+         if(blankCount >= TOKENARRAYSIZE)
+         {
+            break;
+         }
+         gpCustomTokenArray[blankCount] = tmpPointer+1;
+         blankCount++;
+         gCustomTokenCounter++;
+
+      }
+      tmpPointer++;
+      i++;
+   }
+}
+
+PersLoadingType_e getCustomLoadingType(int i)
+{
+       return gCustomLibArray[i].loadingType;
+}
+
+PersLoadingType_e getLoadingType(const char* type)
+{
+       PersLoadingType_e persLoadingType = LoadType_Undefined;
+
+   if(0 == strcmp(type, "init") )
+   {
+       persLoadingType = LoadType_PclInit;
+   }
+   else if(0 == strcmp(type, "od") )
+   {
+       persLoadingType = LoadType_OnDemand;
+   }
+
+   return persLoadingType;
+}
+
+PersInitType_e getCustomInitType(int i)
+{
+       return gCustomLibArray[i].initFunction;
+}
+
+PersInitType_e getInitType(const char* policy)
+{
+       PersInitType_e persInitType = Init_Undefined;
+
+   if(0 == strcmp(policy, "sync"))
+   {
+       persInitType = Init_Synchronous;
+   }
+   else if (0 == strcmp(policy, "async"))
+   {
+       persInitType = Init_Asynchronous;
+   }
+
+   return persInitType;
+}
+
+
+
+
 
 PersistenceCustomLibs_e custom_client_name_to_id(const char* lib_name, int substring)
 {
@@ -124,18 +209,16 @@ PersistenceCustomLibs_e custom_client_name_to_id(const char* lib_name, int subst
 
 int get_custom_libraries()
 {
-   int rval = 0, fd = 0, j = 0;
-
+   int rval = 0, fd = 0, j = 0, i= 0;
+   int status = 0;
    struct stat buffer;
-   char* delimiters = " \n";   // search for blank and end of line
-   char* configFileMap = 0;
-   char* token = 0;
+
    const char *filename = getenv("PERS_CLIENT_LIB_CUSTOM_LOAD");
 
-   if(filename == NULL)
-   {
-      filename = "/etc/pclCustomLibConfigFile.cfg";  // use default filename
-   }
+       if(filename == NULL)
+       {
+               filename = "/etc/pclCustomLibConfigFile.cfg";  // use default filename
+       }
 
    for(j=0; j<PersCustomLib_LastEntry; j++)
    {
@@ -143,108 +226,78 @@ int get_custom_libraries()
       gCustomLibArray[j].valid = -1;
    }
 
+   memset(&buffer, 0, sizeof(buffer));
+   status = stat(filename, &buffer);
+   if(status != -1)
+   {
+      gCustomConfigFileSize = buffer.st_size;
+   }
 
-   if(stat(filename, &buffer) != -1)
+   fd = open(filename, O_RDONLY);
+   if (fd == -1)
    {
-      if(buffer.st_size > 20)  // file needs to be at least bigger then 20 bytes
-      {
-         fd = open(filename, O_RDONLY);
-         if (fd != -1)
-         {
-            configFileMap = (char*)mmap(0, buffer.st_size, PROT_WRITE, MAP_PRIVATE, fd, 0);
-
-            if(configFileMap != MAP_FAILED)
-            {
-               int libId = 0;
-
-               // get the library identifier (early, secure, emergency, ...)
-               token = strtok(configFileMap, delimiters);
-               libId = custom_client_name_to_id(token, 0);
-
-
-               if(libId < PersCustomLib_LastEntry)
-               {
-                  gCustomLibArray[libId].valid = 1;
-               }
-               else
-               {
-                  munmap(configFileMap, buffer.st_size); // @CB: Add
-                  close(fd); // @CB: Add // close file descriptor before return
-                   return EPERS_OUTOFBOUNDS; // out of array bounds
-               }
-
-               // get the library name
-               token  = strtok (NULL, delimiters);
-               strncpy(gCustomLibArray[libId].libname, token, CustLibMaxLen);
-               gCustomLibArray[libId].libname[CustLibMaxLen-1] = '\0'; // Ensures 0-Termination
-
-               while( token != NULL )
-               {
-                  // get the library identifier (early, secure, emergency, ...)
-                  token = strtok(NULL, delimiters);
-                  if(token != NULL)
-                  {
-                     libId = custom_client_name_to_id(token, 0);
-                     if(libId < PersCustomLib_LastEntry)
-                     {
-                        gCustomLibArray[libId].valid = 1;
-                     }
-                     else
-                     {
-                        rval = EPERS_OUTOFBOUNDS;
-                        break;
-                     }
-                  }
-                  else
-                  {
-                     break;
-                  }
-
-                  // get the library name
-                  token  = strtok (NULL, delimiters);
-                  if(token != NULL)
-                  {
-                     strncpy(gCustomLibArray[libId].libname, token, CustLibMaxLen);
-                     gCustomLibArray[libId].libname[CustLibMaxLen-1] = '\0'; // Ensures 0-Termination
-                  }
-                  else
-                  {
-                     break;
-                  }
-               }
-
-               munmap(configFileMap, buffer.st_size);
-
-               #if 0 // debuging
-               for(j=0; j<PersCustomLib_LastEntry; j++)
-               {
-                  printf("Custom libraries => Name: %s | valid: %d \n", gCustomLibArray[j].libname, gCustomLibArray[j].valid);
-               }
-               #endif
-            }
-            else
-            {
-               rval = EPERS_CONFIGMAPFAILED;
-               DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("load config file error - mapping of file failed"));
-            }
-            close(fd);
-         }
-         else
-         {
-            rval = EPERS_CONFIGNOTAVAILABLE;
-            DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("load config file error - no file with plugins available:"), DLT_STRING(filename), DLT_STRING(strerror(errno)));
-         }
-      }
-      else
-      {
-         DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("load config file error - invalid file size"), DLT_STRING(filename), DLT_STRING(strerror(errno)));
-      }
+      DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("load config file error ==> Error file open: "),
+            DLT_STRING(filename), DLT_STRING("err msg: "), DLT_STRING(strerror(errno)) );
+
+      return -1;
+   }
+
+   // check for empty file
+   if(gCustomConfigFileSize >= 0)
+   {
+               // map the config file into memory
+               gpCustomConfigFileMap = (char*)mmap(0, gCustomConfigFileSize, PROT_WRITE, MAP_PRIVATE, fd, 0);
+
+               if (gpCustomConfigFileMap == MAP_FAILED)
+               {
+                       gpCustomConfigFileMap = 0;
+                       close(fd);
+                       DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("load config file error ==> Error mapping the file"));
+                       return -1;
+               }
+
+               // reset the token counter
+               gCustomTokenCounter = 0;
+
+               fillCustomCharTokenArray();
+
+               while( i < TOKENARRAYSIZE )
+               {
+                       if(gpCustomTokenArray[i] != 0 && gpCustomTokenArray[i+1] != 0 && gpCustomTokenArray[i+2] != 0 &&gpCustomTokenArray[i+3] != 0 )
+                       {
+                               int libId = custom_client_name_to_id(gpCustomTokenArray[i], 0); // get the custom libID
+
+                               // assign the libraryname
+                               strncpy(gCustomLibArray[libId].libname, gpCustomTokenArray[i+1], CustLibMaxLen);
+                               gCustomLibArray[libId].libname[CustLibMaxLen-1] = '\0'; // Ensures 0-Termination
+
+                               gCustomLibArray[libId].loadingType  = getLoadingType(gpCustomTokenArray[i+2]);
+                               gCustomLibArray[libId].initFunction = getInitType(gpCustomTokenArray[i+3]);
+                               gCustomLibArray[libId].valid        = 1;        // marks as valid;
+#if 0
+                               // debug
+                               printf("     1. => %s => %d \n",   gpCustomTokenArray[i],   libId);
+                               printf("     2. => %s => %s \n",   gpCustomTokenArray[i+1], gCustomLibArray[libId].libname);
+                               printf("     3. => %s => %d \n",   gpCustomTokenArray[i+2], (int)gCustomLibArray[libId].initFunction);
+                               printf("     4. => %s => %d \n\n", gpCustomTokenArray[i+3], (int)gCustomLibArray[libId].loadingType);
+#endif
+                       }
+                       else
+                       {
+                               break;
+                       }
+                       i+=4;       // move to the next configuration file entry
+               }
+
+               close(fd);
    }
    else
    {
-      rval = EPERS_CONFIGNOSTAT;
-      DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("lload config file error - can't stat config file:"), DLT_STRING(filename), DLT_STRING(strerror(errno)));
+       DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("load config file error ==> Error file size is 0"));
+      close(fd);
+      rval = -1;
    }
+
    return rval;
 }
 
@@ -394,24 +447,6 @@ int load_custom_library(PersistenceCustomLibs_e customLib, Pers_custom_functs_s
 }
 
 
-
-int load_all_custom_libraries()
-{
-   int rval = 0,
-          i = 0;
-
-   for(i=0; i<PersCustomLib_LastEntry; i++)
-   {
-      rval = load_custom_library(i, &gPersCustomFuncs[i]);
-      if( rval < 0)
-      {
-         break;
-      }
-   }
-   return rval;
-}
-
-
 char* get_custom_client_lib_name(int idx)
 {
    if(idx < PersCustomLib_LastEntry)
index 82ccadc..4636a48 100644 (file)
@@ -48,6 +48,24 @@ enum _PersCustomLibDefines_e
 } PersCustomLibDefines_e;
 
 
+/// indicates the init method type
+typedef enum PersInitType_e_
+{
+       Init_Synchronous   = 0,
+       Init_Asynchronous = 1,
+       Init_Undefined
+} PersInitType_e;
+
+
+/// indicates the plugin loading type
+typedef enum PersLoadingType_e_
+{
+       LoadType_PclInit   = 0, // load plugin during pclInitLibrary function
+       LoadType_OnDemand = 1,  // load the pluing on demand, when a plugin function will be requested the first time.
+       LoadType_Undefined
+} PersLoadingType_e;
+
+
 
 /// structure definition for custom library functions
 typedef struct _Pers_custom_functs_s
@@ -150,16 +168,6 @@ int get_custom_libraries();
 int load_custom_library(PersistenceCustomLibs_e customLib, Pers_custom_functs_s *customFuncts);
 
 
-
-/**
- * @brief get the names of the custom libraries to load
- *
- * @return 0 for success orr a negative value with one of the following errors:
- *  EPERS_NOPLUGINFCNT   EPERS_DLOPENERROR
- */
-int load_all_custom_libraries();
-
-
 /**
  * @brief get the position in the array
  *
@@ -185,4 +193,9 @@ char* get_custom_client_lib_name(int idx);
 void invalidate_custom_plugin(int idx);
 
 
+
+PersLoadingType_e getCustomLoadingType(int i);
+
+PersInitType_e getCustomInitType(int i);
+
 #endif /* PERSISTENCE_CLIENT_LIBRARY_CUSTOM_LOADER_H */
index 9996572..c4332df 100644 (file)
@@ -108,3 +108,13 @@ DltContext gPclDLTContext;
 int(* gChangeNotifyCallback)(pclNotification_s * notifyStruct);
 
 
+const char gCharLookup[] =
+{
+   0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  // from 0x0 (NULL)  to 0x1F (unit seperator)
+   0,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  // from 020 (space) to 0x2F (?)
+   1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  // from 040 (@)     to 0x5F (_)
+   1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1,1,  1,1,1,1,1,1,1     // from 060 (')     to 0x7E (~)
+
+};
+
+
index 19393b6..4e47b84 100644 (file)
@@ -144,6 +144,8 @@ enum _PersistenceConstantDef
    MaxConfKeyLengthCusName = 32,    /// length of the config key custom name
    MaxRctLengthCustom_ID   = 64,    /// length of the customer ID
 
+   TOKENARRAYSIZE = 255,
+
    defaultMaxKeyValDataSize = PERS_DB_MAX_SIZE_KEY_DATA  /// default limit the key-value data size to 16kB
 };
 
@@ -241,6 +243,9 @@ extern int gDbusPendingRvalue;
  */
 extern int(* gChangeNotifyCallback)(pclNotification_s * notifyStruct);
 
+/// character lookup table
+extern const char gCharLookup[];
+
 
 #ifdef __cplusplus
 }
index 953a06c..a68a961 100644 (file)
@@ -179,7 +179,6 @@ void process_prepare_shutdown(int complete)
    {
       if(gOpenFdArray[i] == FileOpen)
       {
-         fsync(i);
 
 #if USE_FILECACHE
          if(complete == Shutdown_Full)