X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fmountd.git;a=blobdiff_plain;f=mount.c;h=7cbb8fff365907a47b8b560f0d92f176c1611284;hp=88920407490a97f71f668e320c918090e936cd87;hb=582d4d41f1e4ccd327143a3f2f89b5124d3cd8ba;hpb=d5926d3848b1e9c6147f0bd908a35d20cdef50b5 diff --git a/mount.c b/mount.c index 8892040..7cbb8ff 100644 --- a/mount.c +++ b/mount.c @@ -51,15 +51,17 @@ struct mount { char *fs_names[] = { "", "", - "MBR", - "EXT2", - "EXT3", - "FAT", - "HFSPLUS", + "mbr", + "ext2", + "ext3", + "fat", + "hfsplus", "", - "NTFS", + "ntfs", "", - "EXT4" + "exfat", + "ext4", + "hfsplusjournal" }; #define MAX_MOUNTED 32 @@ -99,7 +101,7 @@ static void mount_dump_uci_state(void) ucix_add_option(ctx, mountd, q->serial, "rev", q->rev); snprintf(t, 64, "size%d", atoi(&q->dev[3])); ucix_add_option(ctx, mountd, q->serial, t, q->size); - if(q->fs > MBR && q->fs <= EXT4) + if(q->fs > MBR && q->fs <= LASTFS) { snprintf(t, 64, "fs%d", atoi(&q->dev[3])); ucix_add_option(ctx, mountd, q->serial, t, fs_names[q->fs]); @@ -137,7 +139,7 @@ static void mount_add_list(char *name, char *dev, char *serial, { struct mount *mount; char tmp[64], tmp2[64]; - if(fs <= MBR || fs > EXT4) + if(fs <= MBR || fs > LASTFS) return; mount = malloc(sizeof(struct mount)); INIT_LIST_HEAD(&mount->list); @@ -153,13 +155,14 @@ static void mount_add_list(char *name, char *dev, char *serial, mount->mounted = 0; mount->fs = fs; list_add(&mount->list, &mounts); - if((!mount->ignore) && (mount->fs > MBR) && (mount->fs <= EXT4)) + if((!mount->ignore) && (mount->fs > MBR) && (mount->fs <= LASTFS)) { log_printf("new mount : %s -> %s (%s)\n", name, dev, fs_names[mount->fs]); snprintf(tmp, 64, "%s%s", uci_path, name); snprintf(tmp2, 64, "/tmp/run/mountd/%s", dev); symlink(tmp2, tmp); mount_new("/tmp/run/mountd/", dev); + system_printf("ACTION=add DEVICE=%s NAME=%s /sbin/hotplug-call mount", dev, name); } } @@ -227,40 +230,64 @@ int mount_new(char *path, char *dev) pid = autofs_safe_fork(); if(!pid) { + char *options, *fstype; if(mount->fs == EXFAT) { - log_printf("mount -t exfat -o rw,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t exfat -o rw,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); + options = "rw,uid=1000,gid=1000"; + fstype = "exfat"; } if(mount->fs == FAT) { - log_printf("mount -t vfat -o rw,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t vfat -o rw,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); + options = "rw,uid=1000,gid=1000"; + fstype = "vfat"; } if(mount->fs == EXT4) { - log_printf("mount -t ext4 -o rw,defaults /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t ext4 -o rw,defaults /dev/%s %s", mount->dev, tmp); + options = "rw,defaults"; + fstype = "ext4"; } if(mount->fs == EXT3) { - log_printf("mount -t ext3 -o rw,defaults /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t ext3 -o rw,defaults /dev/%s %s", mount->dev, tmp); + options = "rw,defaults"; + fstype = "ext3"; } if(mount->fs == EXT2) { - log_printf("mount -t ext2 -o rw,defaults /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t ext2 -o rw,defaults /dev/%s %s", mount->dev, tmp); + options = "rw,defaults"; + fstype = "ext2"; } if(mount->fs == HFSPLUS) { - log_printf("mount -t hfsplus -o rw,defaults,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t hfsplus -o rw,defaults,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); + options = "rw,defaults,uid=1000,gid=1000"; + fstype = "hfsplus"; + } + if(mount->fs == HFSPLUSJOURNAL) + { + options = "ro,defaults,uid=1000,gid=1000"; + fstype = "hfsplus"; } if(mount->fs == NTFS) { - log_printf("ntfs-3g /dev/%s %s -o force", mount->dev, tmp); - ret = system_printf("ntfs-3g /dev/%s %s -o force", mount->dev, tmp); + options = "force"; + fstype = "ntfs-3g"; + } + if(mount->fs > MBR && mount->fs <= LASTFS) + { + struct uci_context *ctx; + char *uci_options, *uci_fstype; + ctx = ucix_init("mountd"); + if(fs_names[mount->fs]) + { + uci_options = ucix_get_option(ctx, "mountd", fs_names[mount->fs], "options"); + uci_fstype = ucix_get_option(ctx, "mountd", fs_names[mount->fs], "fstype"); + if(uci_options) + options = uci_options; + if(uci_fstype) + fstype = uci_fstype; + log_printf("mount -t %s -o %s /dev/%s %s", fstype, options, mount->dev, tmp); + ret = system_printf("mount -t %s -o %s /dev/%s %s", fstype, options, mount->dev, tmp); + } + ucix_cleanup(ctx); } exit(WEXITSTATUS(ret)); } @@ -666,13 +693,19 @@ static void mount_enum_drives(void) char tmp[64]; snprintf(tmp, 64, "/sys/block/%s/", namelist[n]->d_name); m = scandir(tmp, &namelist2, dir_filter2, dir_sort); - while(m--) + if(m > 0) { - strncpy(&block[blk_cnt][0], namelist2[m]->d_name, MAX_BLOCK); + while(m--) + { + strncpy(&block[blk_cnt][0], namelist2[m]->d_name, MAX_BLOCK); + blk_cnt++; + free(namelist2[m]); + } + free(namelist2); + } else { + strncpy(&block[blk_cnt][0], namelist[n]->d_name, MAX_BLOCK); blk_cnt++; - free(namelist2[m]); } - free(namelist2); } free(namelist[n]); } @@ -714,7 +747,7 @@ static void mount_enum_drives(void) log_printf("removing %s\n", q->dev); snprintf(tmp, 64, "%s%s", uci_path, q->name); unlink(tmp); - system_printf("/etc/mountd/event remove %s %s", q->dev, q->name); + system_printf("ACTION=remove DEVICE=%s NAME=%s /sbin/hotplug-call mount", q->dev, q->name); free(q); mount_dump_uci_state(); system_printf("/etc/fonstated/ReloadSamba");