asmlinkage int sunos_mount(char *type, char *dir, int flags, void *data) { int linux_flags = MS_MGC_MSK; /* new semantics */ int error; char *dev_fname = 0; /* We don't handle the integer fs type */ if ((flags & SMNT_NEWTYPE) == 0) return -EINVAL; /* Do not allow for those flags we don't support */ if (flags & (SMNT_GRPID|SMNT_NOSUB|SMNT_MULTI|SMNT_SYS5)) return -EINVAL; if(flags & SMNT_REMOUNT) linux_flags |= MS_REMOUNT; if(flags & SMNT_RDONLY) linux_flags |= MS_RDONLY; if(flags & SMNT_NOSUID) linux_flags |= MS_NOSUID; error = verify_area(VERIFY_READ, type, 16); if(error) return error; if(strcmp(type, "ext2") == 0) { dev_fname = (char *) data; } else if(strcmp(type, "iso9660") == 0) { dev_fname = (char *) data; } else if(strcmp(type, "minix") == 0) { dev_fname = (char *) data; } else if(strcmp(type, "ext") == 0) { dev_fname = (char *) data; } else if(strcmp(type, "xiafs") == 0) { dev_fname = (char *) data; } else if(strcmp(type, "nfs") == 0) { error = sunos_nfs_mount (dir, flags, data); return error; } else if(strcmp(type, "ufs") == 0) { printk("Warning: UFS filesystem mounts unsupported.\n"); return -ENODEV; } else if(strcmp(type, "proc")) { return -ENODEV; } if(error) return error; error = sys_mount(dev_fname, dir, type, linux_flags, NULL); return error; }
/* XXXXXXXXXXXXXXXXXXXX */ asmlinkage int sunos_mount(char *type, char *dir, int flags, void *data) { int linux_flags = 0; int ret = -EINVAL; char *dev_fname = 0; char *dir_page, *type_page; if (!capable (CAP_SYS_ADMIN)) return -EPERM; /* We don't handle the integer fs type */ if ((flags & SMNT_NEWTYPE) == 0) goto out; /* Do not allow for those flags we don't support */ if (flags & (SMNT_GRPID|SMNT_NOSUB|SMNT_MULTI|SMNT_SYS5)) goto out; if(flags & SMNT_REMOUNT) linux_flags |= MS_REMOUNT; if(flags & SMNT_RDONLY) linux_flags |= MS_RDONLY; if(flags & SMNT_NOSUID) linux_flags |= MS_NOSUID; dir_page = getname(dir); ret = PTR_ERR(dir_page); if (IS_ERR(dir_page)) goto out; type_page = getname(type); ret = PTR_ERR(type_page); if (IS_ERR(type_page)) goto out1; if(strcmp(type_page, "ext2") == 0) { dev_fname = getname(data); } else if(strcmp(type_page, "iso9660") == 0) { dev_fname = getname(data); } else if(strcmp(type_page, "minix") == 0) { dev_fname = getname(data); } else if(strcmp(type_page, "nfs") == 0) { ret = sunos_nfs_mount (dir_page, flags, data); goto out2; } else if(strcmp(type_page, "ufs") == 0) { printk("Warning: UFS filesystem mounts unsupported.\n"); ret = -ENODEV; goto out2; } else if(strcmp(type_page, "proc")) { ret = -ENODEV; goto out2; } ret = PTR_ERR(dev_fname); if (IS_ERR(dev_fname)) goto out2; lock_kernel(); ret = do_mount(dev_fname, dir_page, type_page, linux_flags, NULL); unlock_kernel(); if (dev_fname) putname(dev_fname); out2: putname(type_page); out1: putname(dir_page); out: return ret; }