hfs+ journal partition support as read only
[project/mountd.git] / mount.c
diff --git a/mount.c b/mount.c
index 8892040..0c2862a 100644 (file)
--- 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));
        }
@@ -714,7 +741,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");