zte's code,first commit

Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/ap/app/zte_comm/sd_hotplug/sd_hotplug.c b/ap/app/zte_comm/sd_hotplug/sd_hotplug.c
new file mode 100644
index 0000000..d74b7e4
--- /dev/null
+++ b/ap/app/zte_comm/sd_hotplug/sd_hotplug.c
@@ -0,0 +1,277 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/un.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <linux/types.h>
+#include <linux/netlink.h>
+#include <errno.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <syslog.h>
+#include <sys/klog.h>
+#include <signal.h>
+#include "sd_httpshare.h"
+#include "hotplug.h"
+
+
+//#define UEVENT_BUFFER_SIZE 1024*6
+//#define SD_ONLINE_MESSAGE "add@/devices/platform/zx297520_mmc.0/mmc_host/mmc0/mmc0"
+//#define SD_OFFLINE_MESSAGE "remove@/devices/platform/zx297520_mmc.0/mmc_host/mmc0/mmc0"
+#define SD_ONLINE_MESSAGE "add@/devices/platform/zx29_sd.1"
+#define SD_OFFLINE_MESSAGE "remove@/devices/platform/zx29_sd.1"
+#define PATH_LENGTH 256
+char usb_lun_path[PATH_LENGTH] = {0};
+
+/*¶ÁдÎļþÏà¹Ø²Ù×÷begin*/
+int filelength(FILE *fp)
+{
+    int num;
+    fseek(fp,0,SEEK_END);
+    num=ftell(fp);
+    fseek(fp,0,SEEK_SET);
+    return num;
+}
+
+static int readfile(char *path, char* buf, unsigned len)
+{
+    FILE *fp;
+    unsigned int length;
+    if((fp=fopen(path,"r"))==NULL)
+    {
+        slog(SDCARD_PRINT, SLOG_ERR, "open file %s error.\n",path);
+        return -1;
+    }
+    length=filelength(fp);
+    length = length > len? len: length;
+    //ch=(char *)malloc(length+1);
+    int read_len = fread(buf,length,1,fp);
+    if(read_len < 1)  // cov M CHECKED_RETURN
+    {
+        slog(SDCARD_PRINT, SLOG_ERR, "fread %s error.\n",path); 
+    }
+    fclose(fp);
+    *(buf+length)='\0';
+    return (int)length;
+}
+
+int sd_get_cdrom()
+{
+	char cdrom0[8] = {0};
+	char cdrom1[8] = {0};
+	int rtv = 0;
+	int cdrom_state0 = -1;
+	int cdrom_state1 = -1;
+	
+	rtv = readfile("/sys/devices/platform/zx29_hsotg.0/gadget/lun0/cdrom", cdrom0, sizeof(cdrom0)-1);
+	cdrom_state0 = atoi(cdrom0);
+	rtv = readfile("/sys/devices/platform/zx29_hsotg.0/gadget/lun1/cdrom", cdrom1, sizeof(cdrom1)-1);
+	cdrom_state1 = atoi(cdrom1);
+	
+	if (cdrom_state0 == 0)	//lun0ΪuÅÌ
+	{
+		return 0;
+	}
+
+	if (cdrom_state1 == 0)	//lun1ΪuÅÌ
+	{
+		return 1;
+	}
+
+	return -1;
+
+}
+
+static int init_hotplug_sock()
+{
+	int ret;
+
+	struct sockaddr_nl snl;
+	bzero(&snl, sizeof(struct sockaddr_nl));
+	snl.nl_family = AF_NETLINK;
+	snl.nl_pid = getpid();
+	snl.nl_groups = 1;
+
+	if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
+		perror("signal");
+
+	int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
+	if (s == -1) {
+		perror("socket");
+		return -1;
+	}
+//  setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
+
+	ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
+	if (ret < 0) {
+		perror("bind");
+		close(s);
+		return -1;
+	}
+
+	return s;
+}
+
+int sd_app_msg_parse(const char *msg, int msglen, struct hotplug_event *event)
+{
+	char sd_card_state[ZTE_HTTPSHARE_DEFAULT_LEN] = {0};
+	char cmd[MAX_CMD_LEN] = {0};
+
+	if (strncmp(msg, SD_ONLINE_MESSAGE, strlen(SD_ONLINE_MESSAGE)) == 0) {
+		memset(sd_card_state, 0, sizeof(sd_card_state));
+		cfg_get_item("sd_card_state", sd_card_state, sizeof(sd_card_state));
+		
+		slog(SDCARD_PRINT, SLOG_DEBUG, "[%s][%d], state:%s\n", __func__, __LINE__, sd_card_state);
+
+		//0-°Î³ö£¬ 1-²åÈë
+		if (0 == strcmp("0", sd_card_state)) {
+			zte_httpshare_init();
+			slog(SDCARD_PRINT, SLOG_NORMAL, "[sdcard-hotplug]init sd mode!\n");
+		} else
+			slog(SDCARD_PRINT, SLOG_NORMAL, "[sdcard-hotplug]init sd ok!\n");
+	} else if (strncmp(msg, SD_OFFLINE_MESSAGE, strlen(SD_OFFLINE_MESSAGE)) == 0) {
+		slog(SDCARD_PRINT, SLOG_DEBUG, "[%s][%d]\n", __func__, __LINE__);
+		cfg_set("sd_card_state", "0");
+
+#if 0
+		zte_httpshare_call_system("umount /dev/mmcblk0");
+		zte_httpshare_call_system("umount /mnt/jffs2/etc_rw/config/mmc2");
+		zte_httpshare_call_system("umount /etc_rw/config/mmc2");
+#endif
+		zte_umount_dev();
+
+		memset(cmd, 0, sizeof(cmd));
+		snprintf(cmd, sizeof(cmd), "echo NULL > %s", usb_lun_path);
+		soft_system(cmd);
+		//zte_httpshare_call_system("echo NULL > /sys/devices/platform/zx29_hsotg.0/gadget/lun1/file");
+		slog(SDCARD_PRINT, SLOG_NORMAL, "[sdcard-hotplug]remove sd!\n");
+	}
+
+	return 0;
+}
+
+
+int sd_hotplug_init(viod)
+{
+	int cdrom = -1;
+	
+	if (ZTE_HTTPSHARE_SUCCESS != zte_init_sdcard_path()) {
+		slog(SDCARD_PRINT, SLOG_ERR, "%s does not exist.\n", SD_CARD_PATH_PR);
+		return -1;
+	}
+
+	// »ñÈ¡usb lunÉ豸·¾¶
+	cdrom = sd_get_cdrom();
+	slog(SDCARD_PRINT, SLOG_ERR,"sd_hotplug:cdrom=%d\n",cdrom);
+	if (cdrom == 0)
+		memcpy(usb_lun_path, USB_HTTPSHARE_LUN0_PATH, strlen(USB_HTTPSHARE_LUN0_PATH));
+	else if(cdrom == 1)
+		memcpy(usb_lun_path, USB_HTTPSHARE_LUN1_PATH, strlen(USB_HTTPSHARE_LUN1_PATH));
+	else
+	{
+		slog(SDCARD_PRINT, SLOG_ERR, "lun for usb not exsited.\n");
+		return -1;
+	}
+	slog(SDCARD_PRINT, SLOG_ERR,"sd_hotplug usb_lun_path=%s\n", usb_lun_path);
+
+	hotplug_parse_register(DEVICE_TYPE_APP_SDCARD, sd_app_msg_parse);
+
+	return 0;
+}
+
+int sd_hotplug_main(int argc, char* argv[])
+{
+	int hotplug_sock = 0;
+	char sd_card_state[ZTE_HTTPSHARE_DEFAULT_LEN] = {0};
+	char buf[UEVENT_BUFFER_SIZE] = {0};
+	char cmd[MAX_CMD_LEN] = {0};
+	int len = 0;
+	int cdrom = -1;
+	prctl(PR_SET_NAME, "sd_hotplug", 0, 0, 0);
+	
+	//¸ù¾ÝNV³õʼ»¯´òÓ¡¼¶±ð£¬²¢×¢²á¶¯Ì¬µ÷Õû´òÓ¡¼¶±ðÐźÅÁ¿
+	loglevel_init();
+	
+	hotplug_sock = init_hotplug_sock();
+	if (hotplug_sock < 0) {
+		slog(SDCARD_PRINT, SLOG_ERR, "[sdcard_hotplug]create netlink socket failed!\n");
+		return -1;
+	}
+
+	if (ZTE_HTTPSHARE_SUCCESS != zte_init_sdcard_path()) {
+		slog(SDCARD_PRINT, SLOG_ERR, "%s does not exist.\n", SD_CARD_PATH_PR);
+		close(hotplug_sock);
+		return -1;
+	}
+
+	// »ñÈ¡usb lunÉ豸·¾¶
+	cdrom = sd_get_cdrom();
+	slog(SDCARD_PRINT, SLOG_ERR,"sd_hotplug:cdrom=%d\n",cdrom);
+	if(cdrom != 0 && cdrom != 1)
+	{
+		slog(SDCARD_PRINT, SLOG_ERR, "lun for usb not exsited.\n");
+		close(hotplug_sock);
+		return -1;
+	}
+	
+	if (cdrom == 0){
+		len = strlen(USB_HTTPSHARE_LUN0_PATH);
+		memcpy(usb_lun_path, USB_HTTPSHARE_LUN0_PATH, len);
+	}else if(cdrom == 1){
+		len = strlen(USB_HTTPSHARE_LUN1_PATH);
+		memcpy(usb_lun_path, USB_HTTPSHARE_LUN1_PATH, len);
+	}
+	
+	if(len >= PATH_LENGTH){
+		usb_lun_path[PATH_LENGTH -1] = '\0';
+	} else{
+		usb_lun_path[len] = '\0';
+	}
+	
+	slog(SDCARD_PRINT, SLOG_ERR,"sd_hotplug usb_lun_path=%s\n", usb_lun_path);
+
+	while (1) {
+		/* Netlink message buffer */
+		memset(buf, 0, sizeof(buf));
+		len = recv(hotplug_sock, &buf, sizeof(buf)-1, 0);
+		if (len <= 0) {
+			continue;
+		}
+
+		if (strncmp(buf, SD_ONLINE_MESSAGE, strlen(SD_ONLINE_MESSAGE)) == 0) {
+			memset(sd_card_state, 0, sizeof(sd_card_state));
+			cfg_get_item("sd_card_state", sd_card_state, sizeof(sd_card_state));
+			
+			slog(SDCARD_PRINT, SLOG_DEBUG, "[%s][%d], state:%s\n", __func__, __LINE__, sd_card_state);
+
+			//0-°Î³ö£¬ 1-²åÈë
+			if (0 == strcmp("0", sd_card_state)) {
+				zte_httpshare_init();
+				slog(SDCARD_PRINT, SLOG_NORMAL, "[sdcard-hotplug]init sd mode!\n");
+			} else
+				slog(SDCARD_PRINT, SLOG_NORMAL, "[sdcard-hotplug]init sd ok!\n");
+		} else if (strncmp(buf, SD_OFFLINE_MESSAGE, strlen(SD_OFFLINE_MESSAGE)) == 0) {
+			slog(SDCARD_PRINT, SLOG_DEBUG, "[%s][%d]\n", __func__, __LINE__);
+			cfg_set("sd_card_state", "0");
+
+#if 0
+			zte_httpshare_call_system("umount /dev/mmcblk0");
+			zte_httpshare_call_system("umount /mnt/jffs2/etc_rw/config/mmc2");
+			zte_httpshare_call_system("umount /etc_rw/config/mmc2");
+#endif
+			zte_umount_dev();
+
+			memset(cmd, 0, sizeof(cmd));
+			snprintf(cmd, sizeof(cmd), "echo NULL > %s", usb_lun_path);
+			soft_system(cmd);
+			//zte_httpshare_call_system("echo NULL > /sys/devices/platform/zx29_hsotg.0/gadget/lun1/file");
+			slog(SDCARD_PRINT, SLOG_NORMAL, "[sdcard-hotplug]remove sd!\n");
+		}
+	}
+
+	//close(hotplug_sock);//klocwork
+	return 0;
+}