* autotools: install via Synaptic Package Manger or use apt-get
* GNU c compiler: install via Synaptic Package Manger or use apt-get
+Known issues:
+* Patch Itzam/C configure.ac file:
+ - replace in the Itzam/C configure.ac GENERIC_LIBRARY_NAME=libitzam with GENERIC_LIBRARY_NAME=itzam
+* copy itzam package confiuration file to /usr/local/lib/pkgconfig
+
+
How to compile
For the Persistence Client Library autotools will be used to generate makefiles.
To build the client library perform the following steps:
FileClosed = 0,
FileOpen = 1,
- NsmShutdownNormal = 1, /// lifecycle shutdown normal
+ NsmShutdownNormal = 1, /// lifecycle shutdown normal
NsmErrorStatus_OK = 1,
NsmErrorStatus_Fail = -1,
- PrctKeySize = 64, /// persistence resource config table max key size
- PrctValueSize = 256, /// persistence resource config table max value size
- PrctDbTableSize = 1024, /// number of persistence resource config tables to store
+ PrctKeySize = 64, /// persistence resource config table max key size
+ PrctValueSize = 256, /// persistence resource config table max value size
+ PrctDbTableSize = 1024, /// number of persistence resource config tables to store
- DbKeySize = 64, /// database max key size
- DbValueSize = 16384, /// database max value size
- DbTableSize = 1024, /// database table size
+ DbKeySize = 64, /// database max key size
+ DbValueSize = 16384, /// database max value size
+ DbTableSize = 1024, /// database table size
- PasMsg_Block = 1, /// persistence administration service block access
- PasMsg_WriteBack = 2, /// persistence administration service write_back
- PasMsg_Unblock = 4, /// persistence administration service unblock access
- PasErrorStatus_RespPend = 50, /// persistence administration service msg return status
- PasErrorStatus_OK = 100, /// persistence administration service msg return status
- PasErrorStatus_FAIL = -1, /// persistence administration service msg return status
+ PasMsg_Block = 0x0001, /// persistence administration service block access
+ PasMsg_Unblock = 0x0002, /// persistence administration service unblock access
+ PasMsg_WriteBack = 0x0010, /// persistence administration service write_back
+
+ PasErrorStatus_RespPend = 0x0001, /// persistence administration service msg return status
+ PasErrorStatus_OK = 0x0002, /// persistence administration service msg return status
+ PasErrorStatus_FAIL = 0x8000, /// persistence administration service msg return status
CustLibMaxLen = 128, /// max length of the custom library name and path
DbKeyMaxLen = 128, /// max database key length
{
dbus_connection_set_exit_on_disconnect (conn, FALSE);
printf("connected as '%s'\n", dbus_bus_get_unique_name(conn));
- if (0!=pipe(gPipefds))
+ if (-1 == (gEfds = eventfd(0, 0)))
{
- printf("pipe() failed w/ errno %d\n", errno);
+ printf("eventfd() failed w/ errno %d\n", errno);
}
else
{
memset(&gPollInfo, 0 , sizeof(gPollInfo));
gPollInfo.nfds = 1;
- gPollInfo.fds[0].fd = gPipefds[0];
+ gPollInfo.fds[0].fd = gEfds;
gPollInfo.fds[0].events = POLLIN;
dbus_bus_add_match(conn, "type='signal',interface='org.genivi.persistence.admin',member='PersistenceModeChanged',path='/org/genivi/persistence/admin'", &err);
}
else
{
- char buf[64];
+ uint16_t buf[64];
pthread_cond_signal(&gDbusInitializedCond);
pthread_mutex_unlock(&gDbusInitializedMtx);
{
if (0!=gPollInfo.fds[i].revents)
{
- if (gPollInfo.fds[i].fd==gPipefds[0])
+ if (gPollInfo.fds[i].fd==gEfds)
{
if (0!=(gPollInfo.fds[i].revents & POLLIN))
{
while ((-1==(ret=read(gPollInfo.fds[i].fd, buf, 64)))&&(EINTR==errno));
if (0>ret)
{
- printf("read() failed w/ errno %d\n", errno);
+ printf("read() failed w/ errno %d | %s\n", errno, strerror(errno));
}
- else if (sizeof(int)==ret)
+ else if (ret != -1)
{
switch (buf[0])
{
case CMD_PAS_BLOCK_AND_WRITE_BACK:
- process_block_and_write_data_back(buf[1]);
+ process_block_and_write_data_back((buf[2]), buf[1]);
break;
case CMD_LC_PREPARE_SHUTDOWN:
- process_prepare_shutdown(buf[1]);
+ process_prepare_shutdown((buf[2]), buf[1]);
break;
case CMD_QUIT:
bContinue = FALSE;
}
else
{
- printf("read() returned %d (%s)\n", ret, buf);
+ printf("read() returned %d \n", ret);
}
}
}
dbus_connection_unregister_object_path(conn, "/com/contiautomotive/NodeStateManager/LifecycleConsumer");
dbus_connection_unregister_object_path(conn, "/");
}
- close(gPipefds[1]);
- close(gPipefds[0]);
+ close(gEfds);
}
dbus_connection_unref(conn);
dbus_shutdown();
#include <dbus/dbus.h>
#include <poll.h>
#include <pthread.h>
+#include <sys/eventfd.h>
/// mutex to make sure main loop is running
extern pthread_mutex_t gDbusInitializedMtx;
/// pipe file descriptors
-int gPipefds[2];
+int gEfds;
/// returns the dbus connection
{
case NsmShutdownNormal:
{
+ uint64_t cmd;
// add command and data to queue
- unsigned long cmd = ( (requestID << 8) | CMD_LC_PREPARE_SHUTDOWN);
+ cmd = ( ((uint64_t)requestID << 32) | ((uint64_t)request << 16) | CMD_LC_PREPARE_SHUTDOWN);
- if(sizeof(int)!=write(gPipefds[1], &cmd, sizeof(unsigned long)))
+ if(-1 == write(gEfds, &cmd, (sizeof(uint64_t))))
{
printf("write failed w/ errno %d\n", errno);
rval = NsmErrorStatus_Fail;
}
-int send_prepare_shutdown_complete(int requestId)
+int send_prepare_shutdown_complete(int requestId, int status)
{
- int status = 1; // TODO send correct status
-
return send_lifecycle_request("LifecycleRequestComplete", requestId, status);
}
-void process_prepare_shutdown(unsigned char requestId)
+void process_prepare_shutdown(unsigned char requestId, unsigned int status)
{
int i = 0;
//GvdbTable* resourceTable = NULL;
}
// notify lifecycle shutdown OK
- send_prepare_shutdown_complete((int)requestId);
+ send_prepare_shutdown_complete((int)requestId, (int)status);
}
*
* @param requestId the requestID
*/
-void process_prepare_shutdown(unsigned char requestId);
+void process_prepare_shutdown(unsigned char requestId, unsigned int status);
int check_pas_request(unsigned int request, unsigned int requestID)
{
int rval = 0;
-
switch(request)
{
case (PasMsg_Block|PasMsg_WriteBack):
{
+ uint64_t cmd;
// add command and data to queue
- unsigned long cmd = ( (requestID << 8) | CMD_PAS_BLOCK_AND_WRITE_BACK);
+ cmd = ( ((uint64_t)requestID << 32) | ((uint64_t)request << 16) | CMD_PAS_BLOCK_AND_WRITE_BACK);
- if(sizeof(int)!=write(gPipefds[1], &cmd, sizeof(unsigned long)))
+ if(-1 == write(gEfds, &cmd, (sizeof(uint64_t))))
{
- printf("write failed w/ errno %d\n", errno);
+ printf("write failed w/ errno %d | %s\n", errno, strerror(errno));
rval = PasErrorStatus_FAIL;
}
else
{
rval = PasErrorStatus_RespPend;
}
+ printf("======> check_pas_request(requestID: %u | status: %u ) \n", (unsigned int)(cmd>>32&0xFF), (unsigned int)(cmd>>16&0xFF));
break;
}
case PasMsg_Unblock:
}
errorReturn = check_pas_request(request, requestID);
+
reply = dbus_message_new_method_return(message);
if (reply == 0)
int send_pas_request(const char* method, unsigned int requestID, int status)
{
- int rval = 0, errorCode = 0;
+ int rval = 0;
DBusError error;
dbus_error_init (&error);
"/org/genivi/persistence/admin", // path
"org.genivi.persistence.admin", // interface
method); // method
+
+ printf(" =======****> send_pas_request: requestID: %u | status: %u \n", requestID, status);
+
if(message != NULL)
{
dbus_message_append_args(message, DBUS_TYPE_UINT32, &requestID,
DBUS_TYPE_INT32, &status,
- DBUS_TYPE_INT32, &errorCode,
DBUS_TYPE_INVALID);
if(conn != NULL)
-int pers_admin_service_data_sync_complete(unsigned int requestID)
+int pers_admin_service_data_sync_complete(unsigned int requestID, unsigned int status)
{
- return send_pas_request("PersistenceAdminRequestCompleted", requestID, 1);
+ return send_pas_request("PersistenceAdminRequestCompleted", requestID, status);
}
-void process_block_and_write_data_back(unsigned int requestID)
+void process_block_and_write_data_back(unsigned int requestID, unsigned int status)
{
// lock persistence data access
pers_lock_access();
// sync data back to memory device
pers_data_sync();
// send complete notification
- pers_admin_service_data_sync_complete(requestID);
+ pers_admin_service_data_sync_complete(requestID, status);
}
/// block persistence access and write data back to device
-void process_block_and_write_data_back(unsigned int requestID);
+void process_block_and_write_data_back(unsigned int requestID, unsigned int status);
/**
noinst_PROGRAMS = persistence_client_library_test persistence_client_library_dbus_test
-persistence_client_library_test_SOURCES = persistence_client_library_test.c
-persistence_client_library_test_LDADD = $(DEPS_LIBS) $(CHECK_LIBS) \
- $(top_srcdir)/src/libpersistence_client_library.la
-
persistence_client_library_dbus_test_SOURCES = persistence_client_library_dbus_test.c
persistence_client_library_dbus_test_LDADD = $(DEPS_LIBS) $(top_srcdir)/src/libpersistence_client_library.la
-
+
+persistence_client_library_test_SOURCES = persistence_client_library_test.c
+persistence_client_library_test_LDADD = $(DEPS_LIBS) $(CHECK_LIBS) \
+ $(top_srcdir)/src/libpersistence_client_library.la
+
TESTS=persistence_client_library_test
-secure /usr/local/lib/libsecureperscustom.so
-early /usr/local/lib/libearlyperscustom.so
-custom2 /usr/local/lib/libcustom2perscustom.so
-hwinfo /usr/local/lib/libhwinfoperscustom.so
-custom1 /usr/local/lib/libcustom1perscustom.so
-emergency /usr/local/lib/libemergencyperscustom.so
-custom3 /usr/local/lib/libcustom3perscustom.so
\ No newline at end of file
#include "../include/persistence_client_library_key.h"
#include "../include/persistence_client_library_file.h"
-
+#include "../include/persistence_client_library_error_def.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int ret = 0;
- char buffer[128];
-
+ unsigned char buffer[1024];
printf("Dbus interface test application\n");
- ret = pclKeyReadData(0, "/language/current_language", 3, 0, (unsigned char*)buffer, 128);
-
+ getchar();
+ ret = pclKeyReadData(0xFF, "pos/last_position", 0, 0, buffer, 1024);
getchar();