From: Jinkun Jang Date: Sun, 17 Mar 2013 04:29:14 +0000 (+0900) Subject: sync with master X-Git-Tag: submit/tizen/20141222.083159~212^2~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=12ca3afc5292a6dba00dabb4deedf8a98145f537;p=platform%2Fcore%2Fsystem%2Fdeviced.git sync with master --- diff --git a/packaging/system-server.spec b/packaging/system-server.spec index df0ac47..a7d87e2 100755 --- a/packaging/system-server.spec +++ b/packaging/system-server.spec @@ -2,7 +2,7 @@ Name: system-server Summary: System server Version: 0.1.65 -Release: 3 +Release: 4 Group: Framework/system License: Apache License, Version 2.0 Source0: system-server-%{version}.tar.gz diff --git a/ss_mmc_handler.c b/ss_mmc_handler.c index 27ac1c4..f52d630 100644 --- a/ss_mmc_handler.c +++ b/ss_mmc_handler.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -29,12 +28,50 @@ #define MOVINAND_DEV "/dev/mmcblk0p1" #define FORMAT_MMC PREFIX"/sbin/mkfs.vfat " #define FORMAT_MOVINAND PREFIX"/bin/movi_format.sh" + #define FS_VFAT_MOUNT_OPT "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed,smackfsroot=*,smackfsdef=*" +#define MMC_PARENT_PATH "/opt/storage" + +#define BUF_LEN 20 + +#define MMC_32GB_SIZE 61315072 + +static const char *vfat_arg[] = { + "/sbin/mkfs.vfat", + NULL, NULL, +}; + int mmc_status; int ss_mmc_inserted(void); static int __umount_fs(void); +static int exec_process(const char **argv) +{ + int pid; + int i; + int r; + + if (!argv) + return -1; + + pid = fork(); + if (pid == -1) + return -1; + + if (!pid) { + for (i = 0; i < _NSIG; ++i) + signal(i, SIG_DFL); + r = execv(argv[0], argv); + if (r == -1) { + PRT_TRACE_ERR("execv() error"); + exit(EXIT_FAILURE); + } + } + + return pid; +} + int get_mmcblk_num() { DIR *dp; @@ -99,12 +136,119 @@ int get_mmcblk_num() return -1; } +static int check_mount_state(void) +{ + struct stat parent_stat, mount_stat; + char parent_path[PATH_MAX]; + char mount_path[PATH_MAX]; + + snprintf(parent_path, sizeof(parent_path), "%s", MMC_PARENT_PATH); + snprintf(mount_path, sizeof(mount_path), "%s", MMC_MOUNT_POINT); + + if (stat(mount_path, &mount_stat) != 0 || stat(parent_path, &parent_stat) != 0) { + PRT_TRACE_ERR("get stat error"); + return 0; + } + + if (mount_stat.st_dev == parent_stat.st_dev) { + PRT_TRACE_ERR("state : UNMOUNT"); + return 0; + } + + PRT_TRACE_ERR("state : MOUNT"); + return 1; +} + +static int create_partition(const char *dev_path) +{ + int r; + + r = system("printf \"n\\n\\n\\n\\n\\nw\" | fdisk /dev/mmcblk1"); + if (WIFSIGNALED(r) && (WTERMSIG(r) == SIGINT || WTERMSIG(r) == SIGQUIT || WEXITSTATUS(r))) + return -1; + + return 0; +} + +static int format_mmc(const char *path) +{ + int mkfs_pid; + char buf[NAME_MAX]; + + if (path == NULL) { + PRT_TRACE_ERR("Invalid parameter"); + return -1; + } + + vfat_arg[1] = path; + + mkfs_pid = exec_process(vfat_arg); + + if (mkfs_pid < 0) { + PRT_TRACE_ERR("%s fail"); + return -1; + } + + snprintf(buf, sizeof(buf), "%s%d", "/proc/", mkfs_pid); + PRT_TRACE_ERR("child process : %s", buf); + while (1) { + sleep(1); + PRT_TRACE_ERR("formatting...."); + if (access(buf, R_OK) != 0) + break; + } + + return 0; +} + +static int format_exec(int blknum) +{ + char dev_mmcblk[NAME_MAX]; + char dev_mmcblkp[NAME_MAX]; + int r; + + if (check_mount_state() == 1) { + PRT_TRACE_ERR("Mounted, will be unmounted"); + r = __umount_fs(); + if (r != 0) { + PRT_TRACE_ERR("unmount_mmc fail"); + vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_FAILED); + return -1; + } + } + + snprintf(dev_mmcblk, sizeof(dev_mmcblk), "%s%d", MMC_DEV, blknum); + snprintf(dev_mmcblkp, sizeof(dev_mmcblkp), "%sp1", dev_mmcblk); + if (access(dev_mmcblkp, R_OK) < 0) { + PRT_TRACE_ERR("%s is not valid, create the primary partition", dev_mmcblkp); + r = create_partition(dev_mmcblk); + if (r < 0) { + PRT_TRACE_ERR("create_partition failed"); + vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_FAILED); + heynoti_publish("mmcblk_remove"); + return -1; + } + } + + r = format_mmc(dev_mmcblkp); + if (r < 0) { + PRT_TRACE_ERR("format_mmc fail"); + vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_FAILED); + heynoti_publish("mmcblk_remove"); + return -1; + } + + PRT_TRACE_ERR("Format Successful"); + vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_COMPLETED); + return 0; +} + static int ss_mmc_format(keynode_t *key_nodes, void *data) { PRT_TRACE_ERR("mmc format called"); __umount_fs(); vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS, VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS_NOW); - device_set_property(DEVTYPE_MMC, MMC_PROP_FORMAT, 0); + format_exec(get_mmcblk_num()); vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS, VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS_NONE); ss_mmc_inserted(); return 0; @@ -156,6 +300,7 @@ int ss_mmc_init() static int __mount_fs(char *path, const char *fs_name, const char *mount_data) { int ret, retry = 0; + do { if ((ret = mount(path, MMC_MOUNT_POINT, fs_name, 0, mount_data)) == 0) { PRT_TRACE("Mounted mmc card\n"); @@ -195,11 +340,11 @@ static int __mmc_mount_fs(void) } close(fd); - if (__mount_fs(buf, "vfat", FS_VFAT_MOUNT_OPT) != 0) - return errno; + if (__mount_fs(buf, "vfat", FS_VFAT_MOUNT_OPT) != 0) + return errno; return 0; -} +} int ss_mmc_inserted(void) { int r = 0; @@ -236,7 +381,6 @@ mount_fail: mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED; return 0; } - static int __umount_fs(void) { int ret; @@ -246,7 +390,6 @@ static int __umount_fs(void) mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED; return ret; } - int ss_mmc_removed() { int mmc_err = 0;