IPACM: support QXDM diag via socket
In order to support diag with log in
QXDM, IPACM needs to open the socket
client and send the log mesg to ipacmdiag
which is property module to print mesg
to QXDM.
Change-Id: I989e7654c3d80e3d699903a314cf92e8f85cad5e
diff --git a/ipacm/inc/IPACM_Log.h b/ipacm/inc/IPACM_Log.h
index c54d05b..d468f96 100644
--- a/ipacm/inc/IPACM_Log.h
+++ b/ipacm/inc/IPACM_Log.h
@@ -50,23 +50,31 @@
#include <string.h>
#include <syslog.h>
-#define PERROR(fmt) printf("%s:%d %s()", __FILE__, __LINE__, __FUNCTION__);\
+#define MAX_BUF_LEN 256
+#define IPACMLOG_FILE "/etc/ipacm_log_file"
+
+typedef struct ipacm_log_buffer_s {
+ char user_data[MAX_BUF_LEN];
+} ipacm_log_buffer_t;
+
+void ipacm_log_send( void * user_data);
+
+static char buffer_send[MAX_BUF_LEN];
+
+#define PERROR(fmt) memset(buffer_send, 0, sizeof(MAX_BUF_LEN));\
+ snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s()", __FILE__, __LINE__, __FUNCTION__);\
+ ipacm_log_send (buffer_send); \
perror(fmt);
-#define IPACMERR(fmt, ...) syslog(LOG_ERR, "ERROR: %s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\
- printf("ERR: %s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
-
-#ifdef DEBUG
-#define IPACMDBG(fmt, ...) syslog(LOG_DEBUG, "%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\
- printf("%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);
-
-#define IPACMLOG(fmt, ...) syslog(LOG_DEBUG, fmt, ##__VA_ARGS__);\
- printf(fmt, ##__VA_ARGS__);
-#else
-#define IPACMDBG(fmt, ...)
-#define IPACMLOG(fmt, ...)
-#endif
-
+#define IPACMERR(fmt, ...) memset(buffer_send, 0, sizeof(MAX_BUF_LEN));\
+ snprintf(buffer_send,MAX_BUF_LEN,"ERR: %s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\
+ ipacm_log_send (buffer_send);
+#define IPACMDBG(fmt, ...) memset(buffer_send, 0, sizeof(MAX_BUF_LEN));\
+ snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\
+ ipacm_log_send (buffer_send);
+#define IPACMLOG(fmt, ...) memset(buffer_send, 0, sizeof(MAX_BUF_LEN));\
+ snprintf(buffer_send,MAX_BUF_LEN, fmt, ##__VA_ARGS__);\
+ ipacm_log_send (buffer_send);
#ifdef __cplusplus
}
diff --git a/ipacm/src/IPACM_Log.cpp b/ipacm/src/IPACM_Log.cpp
index 72f71c5..20dd26c 100644
--- a/ipacm/src/IPACM_Log.cpp
+++ b/ipacm/src/IPACM_Log.cpp
@@ -40,10 +40,68 @@
#include "IPACM_Log.h"
#include <stdlib.h>
#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <asm/types.h>
+#include <linux/if.h>
+#include <sys/un.h>
+#include <errno.h>
+#include <IPACM_Defs.h>
void logmessage(int log_level)
{
return;
}
+/* start IPACMDIAG socket*/
+int create_socket(unsigned int *sockfd)
+{
+ if ((*sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == IPACM_FAILURE)
+ {
+ perror("Error creating ipacm_log socket\n");
+ return IPACM_FAILURE;
+ }
+
+ if(fcntl(*sockfd, F_SETFD, FD_CLOEXEC) < 0)
+ {
+ perror("Couldn't set ipacm_log Close on Exec\n");
+ }
+
+ return IPACM_SUCCESS;
+}
+
+void ipacm_log_send( void * user_data)
+{
+ ipacm_log_buffer_t ipacm_log_buffer;
+ int numBytes=0, len;
+ struct sockaddr_un ipacmlog_socket;
+ static unsigned int ipacm_log_sockfd = 0;
+
+ if(ipacm_log_sockfd == 0)
+ {
+ /* start ipacm_log socket */
+ if(create_socket(&ipacm_log_sockfd) < 0)
+ {
+ printf("unable to create ipacm_log socket\n");
+ return;
+ }
+ printf("create ipacm_log socket successfully\n");
+ }
+ ipacmlog_socket.sun_family = AF_UNIX;
+ strcpy(ipacmlog_socket.sun_path, IPACMLOG_FILE);
+ len = strlen(ipacmlog_socket.sun_path) + sizeof(ipacmlog_socket.sun_family);
+
+ memcpy(ipacm_log_buffer.user_data, user_data, MAX_BUF_LEN);
+
+ //printf("send : %s\n", ipacm_log_buffer.user_data);
+ if ((numBytes = sendto(ipacm_log_sockfd, (void *)&ipacm_log_buffer, sizeof(ipacm_log_buffer.user_data), 0,
+ (struct sockaddr *)&ipacmlog_socket, len)) == -1)
+ {
+ printf("Send Failed(%d) %s \n",errno,strerror(errno));
+ return;
+ }
+ return;
+}