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;
+}