Merge "IPACM: support QXDM diag via socket"
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;
+}