# #include "../h/param.h" #include "../h/conf.h" #include "../h/systm.h" #include "../h/user.h" #include "../h/userx.h" #include "../h/inode.h" #include "../h/file.h" #include "../h/reg.h" #include "../h/ioctl.h" #include "../h/pkts.h" #include "../h/net.h" ioctl() { register struct file *fp; register struct inode *ip; int dev; if ((fp = getf(u.u_ar0[R0])) == NULL) return; ip = fp->f_inode; dev = ip->i_addr[0]; if (fp->f_flag & FPIPE) ioctlp(fp, u.u_arg[0], u.u_arg[1]); else if ( (ip->i_mode & IFMT) == IFCHR) (*cdevsw2[dev.d_major].d_ioctl) (dev, ip, u.u_arg[0], u.u_arg[1]); else u.u_error = ENODEV; } netioctl(dev, nip, cmd, cmdarg) int dev; register struct netino *nip; register int cmd; register char *cmdarg; { int sysarg[3], temp; switch(cmd) { case NIOCSETL: if (copyin(cmdarg, sysarg, 2) == ERR) return(netu_err(EFAULT)); if ((nip->nt_procp != 0) && (nip->nt_procp != u.u_procp)) return(netu_err(EACCES)); spl4(); nip->nt_flags = sysarg[0]|(nip->nt_flags & NINTMISS); if (nip->nt_flags & NINTRUP) { nip->nt_procp = u.u_procp; if (nip->nt_flags & NINTMISS) { psignal(nip->nt_procp, SIGNINT); nip->nt_flags &= (~NINTMISS); } } else nip->nt_procp = 0; spl0(); break; case NIOCGETL: sysarg[0] = nip->nt_flags; if (copyout(sysarg, cmdarg, 2) == ERR) return(netu_err(EFAULT)); break; case NIOCGETHT: sysarg[0] = NETHSIZ; sysarg[1] = 0; if (copyout(sysarg, cmdarg, 4) == ERR) return(netu_err(EFAULT)); break; case NIOCGETMAXPKT: sysarg[0] = MAXINET; if (copyout(sysarg, cmdarg, 2) == ERR) return(netu_err(EFAULT)); break; case NIOCGETHOST: if (copyout(&mymach, cmdarg, 4) == ERR) return(netu_err(EFAULT)); break; case NIONWRITE: if (copyin(cmdarg, sysarg, 4) == ERR) return(netu_err(EFAULT)); temp = inn_maxfrag(&mymach, sysarg); if (copyout(&temp, cmdarg + 4, 2) == ERR) return(netu_err(EFAULT)); break; case FIONREAD: sysarg[0] = netrcnt(nip); if (copyout(sysarg, cmdarg, 2) == ERR) return(netu_err(EFAULT)); break; case NIOCHGCLR: clr_hgate(); break; case NIOCHGADD: if (copyin(cmdarg, sysarg, sizeof(struct gt_host)) == ERR) return(netu_err(EFAULT)); add_hgate(sysarg); break; case NIOCGATE: if (copyin(cmdarg, sysarg, 2) == ERR) return(netu_err(EFAULT)); def_gate(sysarg[0]); break; case NIOCGDEL: if (copyin(cmdarg, sysarg, 2) == ERR) return(netu_err(EFAULT)); del_gate(sysarg[0]); break; default: u.u_error = EINVAL; return; } } /* gt_unqid get unique id * routine not invoked at interrupt * time so no need to lock out ints */ gt_unqid() { static short unq_id = 1000; if (++unq_id < 1000) unq_id = 1000; return(unq_id); }