Exemple #1
0
static int __init do_linuxrc(void * shell)
{
	static char *argv[] = { "linuxrc", NULL, };
	extern char * envp_init[];

	sys_close(old_fd);sys_close(root_fd);
	sys_setsid();
	return kernel_execve(shell, argv, envp_init);
}
Exemple #2
0
asmlinkage int sunos_setpgrp(pid_t pid, pid_t pgid)
{
	/* So stupid... */
	if((!pid || pid == current->pid) &&
	   !pgid) {
		sys_setsid();
		return 0;
	} else {
		return sys_setpgid(pid, pgid);
	}
}
Exemple #3
0
static int fn(void *d)
{
    struct l4fdx_client *client = d;
    int err;

    err = sys_setregid(client->gid, client->gid);
    err = sys_setreuid(client->uid, client->uid);
    err = sys_setsid();

    if (client->capname)
        snprintf(current->comm, sizeof(current->comm),
                 "l4xfdx-%s", client->capname);
    else
        snprintf(current->comm, sizeof(current->comm),
                 "l4xfdx-%lx", client->cap >> L4_CAP_SHIFT);
    current->comm[sizeof(current->comm) - 1] = 0;

    set_user_nice(current, -20);

    while (!should_stop || !list_empty(&client->req_list)) {
        struct internal_request *r;

        wait_event_interruptible(client->event,
                                 !list_empty(&client->req_list)
                                 || should_stop);

        r = pop_request(client->srv_obj);

        switch (r->type) {
        case L4FS_REQ_OPEN:
            fn_open(client->srv_obj, r);
            break;
        case L4FS_REQ_READ:
            fn_read(client->srv_obj, r);
            break;
        case L4FS_REQ_WRITE:
            fn_write(client->srv_obj, r);
            break;
        case L4FS_REQ_CLOSE:
            fn_close(client->srv_obj, r);
            break;
        case L4FS_REQ_FSTAT64:
            fn_fstat64(client->srv_obj, r);
            break;
        default:
            pr_err("l4fdx: Invalid type=%d\n", r->type);
            break;
        }
    }

    return 0;
}
Exemple #4
0
/* This is the C kernel entry point */
void kmain(struct multiboot *mboot_header, addr_t initial_stack)
{
	/* Store passed values, and initiate some early things
	 * We want serial log output as early as possible */
	kernel_state_flags=0;
	mtboot = mboot_header;
	i_stack = initial_stack;
	parse_kernel_elf(mboot_header, &kernel_elf);
#if CONFIG_MODULES
	init_kernel_symbols();
#endif
	init_serial();
	console_init_stage1();
	load_tables();
	puts("~ SeaOS Version ");	
	char ver[32];
	get_kernel_version(ver);
	puts(ver);
	puts(" Booting Up ~\n\r");
#if CONFIG_MODULES
	init_module_system();
#endif
	init_syscalls();
	load_initrd(mtboot);
	install_timer(1000);
	pm_init(placement, mtboot);
	init_main_cpu_1();

	/* Now get the management stuff going */
	printk(1, "[kernel]: Starting system management\n");
	init_memory(mtboot);
	init_main_cpu_2();
	console_init_stage2();
	parse_kernel_cmd((char *)(addr_t)mtboot->cmdline);
	init_multitasking();
	init_cache();
	init_dm();
	init_vfs();
	/* Load the rest... */
	process_initrd();
	init_kern_task();
	get_timed(&kernel_start_time);
	printk(KERN_MILE, "[kernel]: Kernel is setup (%2.2d:%2.2d:%2.2d, %s, kv=%d, ts=%d bytes: ok)\n", 
	       kernel_start_time.tm_hour, kernel_start_time.tm_min, 
	       kernel_start_time.tm_sec, kernel_name, KVERSION, sizeof(task_t));
	assert(!set_int(1));
	if(!fork())
		init();
	sys_setsid();
	enter_system(255);
	kernel_idle_task();
}
static int __init do_linuxrc(void * shell)
{
	static char *argv[] = { "linuxrc", NULL, };
	extern char * envp_init[];

	sys_close(old_fd);sys_close(root_fd);
	sys_close(0);sys_close(1);sys_close(2);
	sys_setsid();
	(void) sys_open((const char __user *)"/dev/console",O_RDWR,0);
	(void) sys_dup(0);
	(void) sys_dup(0);
	return kernel_execve(shell, argv, envp_init);
}
Exemple #6
0
/* This is the C kernel entry point */
void kmain(struct multiboot *mboot_header, addr_t initial_stack)
{
	/* Store passed values, and initiate some early things
	 * We want serial log output as early as possible */
	kernel_state_flags=0;
	mtboot = mboot_header;
	initial_boot_stack = initial_stack;
	loader_parse_kernel_elf(mboot_header, &kernel_sections);
#if CONFIG_MODULES
	loader_init_kernel_symbols();
#endif
	serial_init();
	cpu_early_init();
#if CONFIG_MODULES
	loader_init_modules();
#endif
	syscall_init();
	fs_initrd_load(mtboot);
	cpu_timer_install(1000);
	cpu_processor_init_1();

	/* Now get the management stuff going */
	printk(1, "[kernel]: Starting system management\n");
	mm_init(mtboot);
	syslog_init();
	parse_kernel_command_line((char *)(addr_t)mtboot->cmdline);
	tm_init_multitasking();
	dm_init();
	fs_init();
	net_init();
	trace_init();
	/* Load the rest... */
	printk(KERN_MILE, "[kernel]: Kernel is setup (kv=%d, bpl=%d: ok)\n", 
	       CONFIG_VERSION_NUMBER, BITS_PER_LONG);
	printk(KERN_DEBUG, "[kernel]: structure sizes: process=%d bytes, thread=%d bytes, inode=%d bytes\n",
			sizeof(struct process), sizeof(struct thread), sizeof(struct inode));
	cpu_interrupt_set(1);
	sys_setup();
	cpu_processor_init_2();
	timer_calibrate();
#if CONFIG_SMP
	if(boot_cpus)
		cpu_boot_all_aps();
#endif
	tm_clone(0, __init_entry, 0);
	sys_setsid();
	kt_kernel_idle_task();
}
Exemple #7
0
int module_install()
{
	printk(1, "[sync]: Kernel service for autosyncronization beginning in 3 seconds\n");
	int x = mod_fork(&pid);
	if(!x)
	{
		sys_setsid();
		exe=set_as_kernel_task("ksync");
		delay(3000);
		printk(1, "[sync]: Autosync enabled\n");
		for(;;) {
			delay(1000);
			//kernel_cache_sync_slow(0);
		}
	}
	return 0;
}
Exemple #8
0
int cmain ()
{
    static const char *cmd[] =
            { (char *)0, "/etc/kyu/init.sx", "local", (char *)0 };
    define_string (str_monitor, "monitor");

    sexpr mbinary = sx_false;

#if defined(have_sys_setsid)
    sys_setsid();
#endif

    mbinary = which (str_monitor);

    if (falsep(mbinary)) {
        return 1;
    }

    cmd[0] = sx_string (mbinary);

    multiplex_signal();
    multiplex_all_processes();
    multiplex_sexpr();

    multiplex_add_process ((struct exec_context *)0,
                           global_death_notification, (void *)0);

    on_init_death((void *)0, cmd);

    multiplex_add_signal (sig_int, on_sig_int, (void *)0);

#ifdef have_sys_close
    sys_close (0);
    sys_close (1);
#endif

    prevent_hissyfits ();

    while (1) multiplex(); /* make sure to not get outta this loop, ever */

    return 0; /* this should never be reached... */
}
int
ultrix_sys_setpgrp(struct lwp *l, const struct ultrix_sys_setpgrp_args *uap, register_t *retval)
{
	struct proc *p = l->l_proc;
	struct sys_setpgid_args ap;

	SCARG(&ap, pid) = SCARG(uap, pid);
	SCARG(&ap, pgid) = SCARG(uap, pgid);
	/*
	 * difference to our setpgid call is to include backwards
	 * compatibility to pre-setsid() binaries. Do setsid()
	 * instead of setpgid() in those cases where the process
	 * tries to create a new session the old way.
	 */
	if (!SCARG(&ap, pgid) &&
	    (!SCARG(&ap, pid) || SCARG(&ap, pid) == p->p_pid))
		return sys_setsid(l, &ap, retval);
	else
		return sys_setpgid(l, &ap, retval);
}
Exemple #10
0
asmlinkage int sunos_ioctl (int fd, u32 cmd, u32 arg)
{
	int ret = -EBADF;

	if(fd >= SUNOS_NR_OPEN)
		goto out;
	if(!fcheck(fd))
		goto out;

	if(cmd == TIOCSETD) {
		mm_segment_t old_fs = get_fs();
		int __user *p;
		int ntty = N_TTY;
		int tmp;

		p = (int __user *) (unsigned long) arg;
		ret = -EFAULT;
		if(get_user(tmp, p))
			goto out;
		if(tmp == 2) {
			set_fs(KERNEL_DS);
			ret = sys_ioctl(fd, cmd, (unsigned long) &ntty);
			set_fs(old_fs);
			ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
			goto out;
		}
	}
	if(cmd == TIOCNOTTY) {
		ret = sys_setsid();
		goto out;
	}
	switch(cmd) {
	case _IOW('r', 10, struct rtentry32):
		ret = compat_sys_ioctl(fd, SIOCADDRT, arg);
		goto out;
	case _IOW('r', 11, struct rtentry32):
		ret = compat_sys_ioctl(fd, SIOCDELRT, arg);
		goto out;

	case _IOW('i', 12, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFADDR, arg);
		goto out;
	case _IOWR('i', 13, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFADDR, arg);
		goto out;
	case _IOW('i', 14, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFDSTADDR, arg);
		goto out;
	case _IOWR('i', 15, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFDSTADDR, arg);
		goto out;
	case _IOW('i', 16, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFFLAGS, arg);
		goto out;
	case _IOWR('i', 17, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFFLAGS, arg);
		goto out;
	case _IOW('i', 18, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFMEM, arg);
		goto out;
	case _IOWR('i', 19, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFMEM, arg);
		goto out;

	case _IOWR('i', 20, struct ifconf32):
		ret = compat_sys_ioctl(fd, SIOCGIFCONF, arg);
		goto out;

	case _IOW('i', 21, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFMTU, arg);
		goto out;

	case _IOWR('i', 22, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFMTU, arg);
		goto out;

	case _IOWR('i', 23, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFBRDADDR, arg);
		goto out;
	case _IOW('i', 24, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFBRDADDR, arg);
		goto out;
	case _IOWR('i', 25, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFNETMASK, arg);
		goto out;
	case _IOW('i', 26, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFNETMASK, arg);
		goto out;
	case _IOWR('i', 27, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCGIFMETRIC, arg);
		goto out;
	case _IOW('i', 28, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCSIFMETRIC, arg);
		goto out;

	case _IOW('i', 30, struct arpreq):
		ret = compat_sys_ioctl(fd, SIOCSARP, arg);
		goto out;
	case _IOWR('i', 31, struct arpreq):
		ret = compat_sys_ioctl(fd, SIOCGARP, arg);
		goto out;
	case _IOW('i', 32, struct arpreq):
		ret = compat_sys_ioctl(fd, SIOCDARP, arg);
		goto out;

	case _IOW('i', 40, struct ifreq32): /* SIOCUPPER */
	case _IOW('i', 41, struct ifreq32): /* SIOCLOWER */
	case _IOW('i', 44, struct ifreq32): /* SIOCSETSYNC */
	case _IOW('i', 45, struct ifreq32): /* SIOCGETSYNC */
	case _IOW('i', 46, struct ifreq32): /* SIOCSSDSTATS */
	case _IOW('i', 47, struct ifreq32): /* SIOCSSESTATS */
	case _IOW('i', 48, struct ifreq32): /* SIOCSPROMISC */
		ret = -EOPNOTSUPP;
		goto out;

	case _IOW('i', 49, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCADDMULTI, arg);
		goto out;
	case _IOW('i', 50, struct ifreq32):
		ret = compat_sys_ioctl(fd, SIOCDELMULTI, arg);
		goto out;

	/* FDDI interface ioctls, unsupported. */
		
	case _IOW('i', 51, struct ifreq32): /* SIOCFDRESET */
	case _IOW('i', 52, struct ifreq32): /* SIOCFDSLEEP */
	case _IOW('i', 53, struct ifreq32): /* SIOCSTRTFMWAR */
	case _IOW('i', 54, struct ifreq32): /* SIOCLDNSTRTFW */
	case _IOW('i', 55, struct ifreq32): /* SIOCGETFDSTAT */
	case _IOW('i', 56, struct ifreq32): /* SIOCFDNMIINT */
	case _IOW('i', 57, struct ifreq32): /* SIOCFDEXUSER */
	case _IOW('i', 58, struct ifreq32): /* SIOCFDGNETMAP */
	case _IOW('i', 59, struct ifreq32): /* SIOCFDGIOCTL */
		printk("FDDI ioctl, returning EOPNOTSUPP\n");
		ret = -EOPNOTSUPP;
		goto out;

	case _IOW('t', 125, int):
		/* More stupid tty sunos ioctls, just
		 * say it worked.
		 */
		ret = 0;
		goto out;

	/* Non posix grp */
	case _IOW('t', 118, int): {
		int oldval, newval, __user *ptr;

		cmd = TIOCSPGRP;
		ptr = (int __user *) (unsigned long) arg;
		ret = -EFAULT;
		if(get_user(oldval, ptr))
			goto out;
		ret = compat_sys_ioctl(fd, cmd, arg);
		__get_user(newval, ptr);
		if(newval == -1) {
			__put_user(oldval, ptr);
			ret = -EIO;
		}
		if(ret == -ENOTTY)
			ret = -EIO;
		goto out;
	}

	case _IOR('t', 119, int): {
		int oldval, newval, __user *ptr;

		cmd = TIOCGPGRP;
		ptr = (int __user *) (unsigned long) arg;
		ret = -EFAULT;
		if(get_user(oldval, ptr))
			goto out;
		ret = compat_sys_ioctl(fd, cmd, arg);
		__get_user(newval, ptr);
		if(newval == -1) {
			__put_user(oldval, ptr);
			ret = -EIO;
		}
		if(ret == -ENOTTY)
			ret = -EIO;
		goto out;
	}
	};

	ret = compat_sys_ioctl(fd, cmd, arg);
	/* so stupid... */
	ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
out:
	return ret;
}
Exemple #11
0
asmlinkage int sunos_ioctl (int fd, unsigned long cmd, unsigned long arg)
{
	struct file *filp;
	int foo;

	if (fd >= NR_OPEN || !(filp = current->files->fd [fd]))
		return -EBADF;

	/* First handle an easy compat. case for tty ldisc. */
	if(cmd == TIOCSETD) {
		int *p, ntty = N_TTY, old_fs;

		p = (int *) arg;
		foo = verify_area(VERIFY_WRITE, p, sizeof(int));
		if(foo) return foo;
		if(*p == 2) {
			old_fs = get_fs();
			set_fs(KERNEL_DS);
			foo = sys_ioctl(fd, cmd, (int) &ntty);
			set_fs(old_fs);
			return (foo == -EINVAL ? -EOPNOTSUPP : foo);
		}
	}

	/* Binary compatibility is good American knowhow f****n' up. */
	if(cmd == TIOCNOTTY)
		return sys_setsid();

	/* SunOS networking ioctls. */
	switch (cmd) {
	case _IOW('r', 10, struct rtentry):
		return sys_ioctl(fd, SIOCADDRT, arg);
	case _IOW('r', 11, struct rtentry):
		return sys_ioctl(fd, SIOCDELRT, arg);
	case _IOW('i', 12, struct ifreq):
		return sys_ioctl(fd, SIOCSIFADDR, arg);
	case _IORW('i', 13, struct ifreq):
		return sys_ioctl(fd, SIOCGIFADDR, arg);
	case _IOW('i', 14, struct ifreq):
		return sys_ioctl(fd, SIOCSIFDSTADDR, arg);
	case _IORW('i', 15, struct ifreq):
		return sys_ioctl(fd, SIOCGIFDSTADDR, arg);
	case _IOW('i', 16, struct ifreq):
		return sys_ioctl(fd, SIOCSIFFLAGS, arg);
	case _IORW('i', 17, struct ifreq):
		return sys_ioctl(fd, SIOCGIFFLAGS, arg);
	case _IOW('i', 18, struct ifreq):
		return sys_ioctl(fd, SIOCSIFMEM, arg);
	case _IORW('i', 19, struct ifreq):
		return sys_ioctl(fd, SIOCGIFMEM, arg);
	case _IORW('i', 20, struct ifconf):
		return sys_ioctl(fd, SIOCGIFCONF, arg);
	case _IOW('i', 21, struct ifreq): /* SIOCSIFMTU */
		return sys_ioctl(fd, SIOCSIFMTU, arg);
	case _IORW('i', 22, struct ifreq): /* SIOCGIFMTU */
		return sys_ioctl(fd, SIOCGIFMTU, arg);

	case _IORW('i', 23, struct ifreq):
		return sys_ioctl(fd, SIOCGIFBRDADDR, arg);
	case _IOW('i', 24, struct ifreq):
		return sys_ioctl(fd, SIOCGIFBRDADDR, arg);
	case _IORW('i', 25, struct ifreq):
		return sys_ioctl(fd, SIOCGIFNETMASK, arg);
	case _IOW('i', 26, struct ifreq):
		return sys_ioctl(fd, SIOCSIFNETMASK, arg);
	case _IORW('i', 27, struct ifreq):
		return sys_ioctl(fd, SIOCGIFMETRIC, arg);
	case _IOW('i', 28, struct ifreq):
		return sys_ioctl(fd, SIOCSIFMETRIC, arg);

	case _IOW('i', 30, struct arpreq):
		return sys_ioctl(fd, SIOCSARP, arg);
	case _IOW('i', 31, struct arpreq):
		return sys_ioctl(fd, SIOCGARP, arg);
	case _IOW('i', 32, struct arpreq):
		return sys_ioctl(fd, SIOCGARP, arg);

	case _IOW('i', 40, struct ifreq): /* SIOCUPPER */
	case _IOW('i', 41, struct ifreq): /* SIOCLOWER */
	case _IOW('i', 44, struct ifreq): /* SIOCSETSYNC */
	case _IOW('i', 45, struct ifreq): /* SIOCGETSYNC */
	case _IOW('i', 46, struct ifreq): /* SIOCSSDSTATS */
	case _IOW('i', 47, struct ifreq): /* SIOCSSESTATS */
	case _IOW('i', 48, struct ifreq): /* SIOCSPROMISC */
		return -EOPNOTSUPP;

	case _IOW('i', 49, struct ifreq):
		return sys_ioctl(fd, SIOCADDMULTI, arg);
	case _IOW('i', 50, struct ifreq):
		return sys_ioctl(fd, SIOCDELMULTI, arg);

	/* FDDI interface ioctls, unsupported. */
		
	case _IOW('i', 51, struct ifreq): /* SIOCFDRESET */
	case _IOW('i', 52, struct ifreq): /* SIOCFDSLEEP */
	case _IOW('i', 53, struct ifreq): /* SIOCSTRTFMWAR */
	case _IOW('i', 54, struct ifreq): /* SIOCLDNSTRTFW */
	case _IOW('i', 55, struct ifreq): /* SIOCGETFDSTAT */
	case _IOW('i', 56, struct ifreq): /* SIOCFDNMIINT */
	case _IOW('i', 57, struct ifreq): /* SIOCFDEXUSER */
	case _IOW('i', 58, struct ifreq): /* SIOCFDGNETMAP */
	case _IOW('i', 59, struct ifreq): /* SIOCFDGIOCTL */
		printk("FDDI ioctl, returning EOPNOTSUPP\n");
		return -EOPNOTSUPP;
	case _IOW('t', 125, int):
		/* More stupid tty sunos ioctls, just
		 * say it worked.
		 */
		return 0;
	/* Non posix grp */
	case _IOW('t', 118, int): {
		int oldval, *ptr;

		cmd = TIOCSPGRP;
		ptr = (int *) arg;
		oldval = verify_area(VERIFY_WRITE, ptr, sizeof(int));
		if(oldval)
			return oldval;
		oldval = *ptr;
		foo = sys_ioctl(fd, cmd, arg);
		if(*ptr == -1) {
			*ptr = oldval;
			foo = -EIO;
		}
		if(foo == -ENOTTY)
			foo = -EIO;
		return foo;
	}

	case _IOR('t', 119, int): {
		int oldval, *ptr;

		cmd = TIOCGPGRP;
		ptr = (int *) arg;
		oldval = verify_area(VERIFY_WRITE, ptr, sizeof(int));
		if(oldval)
			return oldval;
		oldval = *ptr;
		foo = sys_ioctl(fd, cmd, arg);
		if(*ptr == -1) {
			*ptr = oldval;
			foo = -EIO;
		}
		if(foo == -ENOTTY)
			foo = -EIO;
		return foo;
	}
	}

#if 0
	if (cmd & 0xff00 == ('k' << 8)){
		printk ("[[KBIO: %8.8x\n", (unsigned int) cmd);
	}
#endif

	foo = sys_ioctl(fd, cmd, arg);
	/* so stupid... */
	return (foo == -EINVAL ? -EOPNOTSUPP : foo);
}
Exemple #12
0
int cmain ()
{
    define_symbol (sym_monitor, "monitor");
    int i;

    programme_identification = cons (sym_monitor, make_integer (2));

#if defined(have_sys_setsid)
    sys_setsid();
#endif

    initialise_kyu_script_commands ();

    multiplex_add_kyu_callback (on_ipc_read, (void *)0);

    global_environment = kyu_sx_default_environment ();

    global_environment =
        lx_environment_bind
        (global_environment, sym_on_event,
         lx_foreign_mu (sym_on_event, on_event));
    global_environment =
        lx_environment_bind
        (global_environment, sym_power_on,
         lx_foreign_mu (sym_power_on, power_on));
    global_environment =
        lx_environment_bind
        (global_environment, sym_power_down,
         lx_foreign_mu (sym_power_down, power_down));
    global_environment =
        lx_environment_bind
        (global_environment, sym_power_reset,
         lx_foreign_mu (sym_power_reset, power_reset));
    global_environment =
        lx_environment_bind
        (global_environment, sym_ctrl_alt_del,
         lx_foreign_mu (sym_ctrl_alt_del, ctrl_alt_del));

    for (i = 1; curie_argv[i] != (char *)0; i++)
    {
        sexpr n = make_string (curie_argv[i]);

        if (truep(filep(n)))
        {
            open_script_files++;
            multiplex_add_sexpr
            (sx_open_i (io_open_read (curie_argv[i])),
             on_script_read, (void *)0);
        }
        else
        {
            native_system = make_symbol (curie_argv[i]);
        }
    }

    kyu_sd_add_listener_stdio ();

    while (multiplex() == mx_ok);

    return 21;
}
Exemple #13
0
asmlinkage int sunos_ioctl (int fd, unsigned long cmd, unsigned long arg)
{
	int ret = -EBADF;

	if (fd >= SUNOS_NR_OPEN || !fcheck(fd))
		goto out;

	/* First handle an easy compat. case for tty ldisc. */
	if (cmd == TIOCSETD) {
		int __user *p;
		int ntty = N_TTY, tmp;
		mm_segment_t oldfs;

		p = (int __user *) arg;
		ret = -EFAULT;
		if (get_user(tmp, p))
			goto out;
		if (tmp == 2) {
			oldfs = get_fs();
			set_fs(KERNEL_DS);
			ret = sys_ioctl(fd, cmd, (unsigned long) &ntty);
			set_fs(oldfs);
			ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
			goto out;
		}
	}

	/* Binary compatibility is good American knowhow f****n' up. */
	if (cmd == TIOCNOTTY) {
		ret = sys_setsid();
		goto out;
	}

	/* SunOS networking ioctls. */
	switch (cmd) {
	case _IOW('r', 10, struct rtentry):
		ret = sys_ioctl(fd, SIOCADDRT, arg);
		goto out;
	case _IOW('r', 11, struct rtentry):
		ret = sys_ioctl(fd, SIOCDELRT, arg);
		goto out;
	case _IOW('i', 12, struct ifreq):
		ret = sys_ioctl(fd, SIOCSIFADDR, arg);
		goto out;
	case _IOWR('i', 13, struct ifreq):
		ret = sys_ioctl(fd, SIOCGIFADDR, arg);
		goto out;
	case _IOW('i', 14, struct ifreq):
		ret = sys_ioctl(fd, SIOCSIFDSTADDR, arg);
		goto out;
	case _IOWR('i', 15, struct ifreq):
		ret = sys_ioctl(fd, SIOCGIFDSTADDR, arg);
		goto out;
	case _IOW('i', 16, struct ifreq):
		ret = sys_ioctl(fd, SIOCSIFFLAGS, arg);
		goto out;
	case _IOWR('i', 17, struct ifreq):
		ret = sys_ioctl(fd, SIOCGIFFLAGS, arg);
		goto out;
	case _IOW('i', 18, struct ifreq):
		ret = sys_ioctl(fd, SIOCSIFMEM, arg);
		goto out;
	case _IOWR('i', 19, struct ifreq):
		ret = sys_ioctl(fd, SIOCGIFMEM, arg);
		goto out;
	case _IOWR('i', 20, struct ifconf):
		ret = sys_ioctl(fd, SIOCGIFCONF, arg);
		goto out;
	case _IOW('i', 21, struct ifreq): /* SIOCSIFMTU */
		ret = sys_ioctl(fd, SIOCSIFMTU, arg);
		goto out;
	case _IOWR('i', 22, struct ifreq): /* SIOCGIFMTU */
		ret = sys_ioctl(fd, SIOCGIFMTU, arg);
		goto out;

	case _IOWR('i', 23, struct ifreq):
		ret = sys_ioctl(fd, SIOCGIFBRDADDR, arg);
		goto out;
	case _IOW('i', 24, struct ifreq):
		ret = sys_ioctl(fd, SIOCSIFBRDADDR, arg);
		goto out;
	case _IOWR('i', 25, struct ifreq):
		ret = sys_ioctl(fd, SIOCGIFNETMASK, arg);
		goto out;
	case _IOW('i', 26, struct ifreq):
		ret = sys_ioctl(fd, SIOCSIFNETMASK, arg);
		goto out;
	case _IOWR('i', 27, struct ifreq):
		ret = sys_ioctl(fd, SIOCGIFMETRIC, arg);
		goto out;
	case _IOW('i', 28, struct ifreq):
		ret = sys_ioctl(fd, SIOCSIFMETRIC, arg);
		goto out;

	case _IOW('i', 30, struct arpreq):
		ret = sys_ioctl(fd, SIOCSARP, arg);
		goto out;
	case _IOWR('i', 31, struct arpreq):
		ret = sys_ioctl(fd, SIOCGARP, arg);
		goto out;
	case _IOW('i', 32, struct arpreq):
		ret = sys_ioctl(fd, SIOCDARP, arg);
		goto out;

	case _IOW('i', 40, struct ifreq): /* SIOCUPPER */
	case _IOW('i', 41, struct ifreq): /* SIOCLOWER */
	case _IOW('i', 44, struct ifreq): /* SIOCSETSYNC */
	case _IOW('i', 45, struct ifreq): /* SIOCGETSYNC */
	case _IOW('i', 46, struct ifreq): /* SIOCSSDSTATS */
	case _IOW('i', 47, struct ifreq): /* SIOCSSESTATS */
	case _IOW('i', 48, struct ifreq): /* SIOCSPROMISC */
		ret = -EOPNOTSUPP;
		goto out;

	case _IOW('i', 49, struct ifreq):
		ret = sys_ioctl(fd, SIOCADDMULTI, arg);
		goto out;
	case _IOW('i', 50, struct ifreq):
		ret = sys_ioctl(fd, SIOCDELMULTI, arg);
		goto out;

	/* FDDI interface ioctls, unsupported. */
		
	case _IOW('i', 51, struct ifreq): /* SIOCFDRESET */
	case _IOW('i', 52, struct ifreq): /* SIOCFDSLEEP */
	case _IOW('i', 53, struct ifreq): /* SIOCSTRTFMWAR */
	case _IOW('i', 54, struct ifreq): /* SIOCLDNSTRTFW */
	case _IOW('i', 55, struct ifreq): /* SIOCGETFDSTAT */
	case _IOW('i', 56, struct ifreq): /* SIOCFDNMIINT */
	case _IOW('i', 57, struct ifreq): /* SIOCFDEXUSER */
	case _IOW('i', 58, struct ifreq): /* SIOCFDGNETMAP */
	case _IOW('i', 59, struct ifreq): /* SIOCFDGIOCTL */
		printk("FDDI ioctl, returning EOPNOTSUPP\n");
		ret = -EOPNOTSUPP;
		goto out;

	case _IOW('t', 125, int):
		/* More stupid tty sunos ioctls, just
		 * say it worked.
		 */
		ret = 0;
		goto out;
	/* Non posix grp */
	case _IOW('t', 118, int): {
		int oldval, newval, __user *ptr;

		cmd = TIOCSPGRP;
		ptr = (int __user *) arg;
		ret = -EFAULT;
		if (get_user(oldval, ptr))
			goto out;
		ret = sys_ioctl(fd, cmd, arg);
		__get_user(newval, ptr);
		if (newval == -1) {
			__put_user(oldval, ptr);
			ret = -EIO;
		}
		if (ret == -ENOTTY)
			ret = -EIO;
		goto out;
	}

	case _IOR('t', 119, int): {
		int oldval, newval, __user *ptr;

		cmd = TIOCGPGRP;
		ptr = (int __user *) arg;
		ret = -EFAULT;
		if (get_user(oldval, ptr))
			goto out;
		ret = sys_ioctl(fd, cmd, arg);
		__get_user(newval, ptr);
		if (newval == -1) {
			__put_user(oldval, ptr);
			ret = -EIO;
		}
		if (ret == -ENOTTY)
			ret = -EIO;
		goto out;
	}
	}

#if 0
	if ((cmd & 0xff00) == ('k' << 8)) {
		printk ("[[KBIO: %8.8x\n", (unsigned int) cmd);
	}
#endif

	ret = sys_ioctl(fd, cmd, arg);
	/* so stupid... */
	ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
out:
	return ret;
}