#include <sys/mount.h>
#include <errno.h>
#include <vconf.h>
-#include <devman.h>
#include <fcntl.h>
#include <dirent.h>
#include <sysman.h>
#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;
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;
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");
}
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;
mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;
return 0;
}
-
static int __umount_fs(void)
{
int ret;
mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;
return ret;
}
-
int ss_mmc_removed()
{
int mmc_err = 0;