1 /* $NetBSD: osf1_ioctl.c,v 1.5 1996/10/13 00:46:53 christos Exp $ */
4 * Copyright (c) 1994, 1995 Carnegie-Mellon University.
7 * Author: Chris G. Demetriou
9 * Permission to use, copy, modify and distribute this software and
10 * its documentation is hereby granted, provided that both the copyright
11 * notice and this permission notice appear in all copies of the
12 * software, derivative works or modified versions, and any portions
13 * thereof, and that both notices appear in supporting documentation.
15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
17 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19 * Carnegie Mellon requests users of this software to return to
21 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
22 * School of Computer Science
23 * Carnegie Mellon University
24 * Pittsburgh PA 15213-3890
26 * any improvements or extensions that they make and grant Carnegie the
27 * rights to redistribute these changes.
31 * Additional Copyright (c) 1999 by Andrew Gallatin
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/fcntl.h>
38 #include <sys/filio.h>
39 #include <sys/ioctl_compat.h>
40 #include <sys/termios.h>
41 #include <sys/filedesc.h>
44 #include <sys/mount.h>
45 #include <sys/sysproto.h>
46 #include <alpha/osf1/osf1_signal.h>
47 #include <alpha/osf1/osf1_proto.h>
48 #include <alpha/osf1/osf1.h>
49 #include <sys/socket.h>
51 #include <net/if_dl.h>
52 #include <net/if_types.h>
53 #include <sys/sockio.h>
55 #include "opt_compat.h"
57 /*#define IOCTL_DEBUG*/
59 int osf1_ioctl_i __P((struct proc *p, struct ioctl_args *nuap,
60 int cmd, int dir, int len));
61 int osf1_ioctl_t __P((struct proc *p, struct ioctl_args *nuap,
62 int cmd, int dir, int len));
63 int osf1_ioctl_f __P((struct proc *p, struct ioctl_args *nuap,
64 int cmd, int dir, int len));
69 struct osf1_ioctl_args *uap;
72 unsigned int cmd, dir, group, len, op;
73 struct ioctl_args /* {
75 syscallarg(u_long) com;
76 syscallarg(caddr_t) data;
80 dir = op & OSF1_IOC_DIRMASK;
81 group = OSF1_IOCGROUP(op);
82 cmd = OSF1_IOCCMD(op);
83 len = OSF1_IOCPARM_LEN(op);
112 "OSF/1 IOCTL: group = %c, cmd = %d, len = %d, dir = %s\n",
113 group, cmd, len, dirstr);
117 a.com = (unsigned long)uap->com;
118 bzero(&a.com, sizeof(long));
119 a.com = _IOC(dir, group, cmd, len);
123 return osf1_ioctl_i(p, &a, cmd, dir, len);
125 return osf1_ioctl_t(p, &a, cmd, dir, len);
127 return osf1_ioctl_f(p, &a, cmd, dir, len);
130 "unimplented OSF/1 IOCTL: group = %c, cmd = %d, len = %d, dir = %s\n",
131 group, cmd, len, dirstr);
137 * Structure used to query de and qe for physical addresses.
139 struct osf1_ifdevea {
140 char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
141 u_char default_pa[6]; /* default hardware address */
142 u_char current_pa[6]; /* current physical address */
147 osf1_ioctl_i(p, uap, cmd, dir, len)
149 struct ioctl_args /* {
151 syscallarg(u_long) com;
152 syscallarg(caddr_t) data;
160 case 20: /* OSF/1 OSIOCGIFCONF */
161 case 36: /* OSF/1 SIOCGIFCONF */
162 case 12: /* OSF/1 SIOCSIFADDR */
163 case 14: /* OSF/1 SIOCSIFDSTADDR */
164 case 16: /* OSF/1 SIOCSIFFLAGS (XXX) */
165 case 17: /* OSF/1 SIOCGIFFLAGS (XXX) */
166 case 19: /* OSF/1 SIOCSIFBRDADDR */
167 case 22: /* OSF/1 SIOCSIFNETMASK */
168 case 23: /* OSF/1 SIOCGIFMETRIC */
169 case 24: /* OSF/1 SIOCSIFMETRIC */
170 case 25: /* OSF/1 SIOCDIFADDR */
171 case 33: /* OSF/1 SIOCGIFADDR */
172 case 34: /* OSF/1 SIOCGIFDSTADDR */
173 case 35: /* OSF/1 SIOCGIFBRDADDR */
174 case 37: /* OSF/1 SIOCGIFNETMASK */
175 /* same as in FreeBSD */
176 return ioctl(p, uap);
179 case 62: /* OSF/1 SIOCRPHYSADDR */
185 struct sockaddr_dl *sdl;
186 struct osf1_ifdevea *ifd = (struct osf1_ifdevea *)uap->data;
189 * Note that we don't actually respect the name in the ifreq
190 * structure, as DU interface names are all different.
192 for (ifn = 0; ifn < if_index; ifn++) {
193 ifp = ifnet_addrs[ifn]->ifa_ifp; /* pointer to interface */
194 /* Only look at ether interfaces, exclude alteon nics
195 * because osf/1 doesn't know about most of them.
197 if (ifp->if_type == IFT_ETHER
198 && strcmp(ifp->if_name, "ti")) { /* looks good */
199 /* walk the address list */
200 for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa;
201 ifa = TAILQ_NEXT(ifa, ifa_link)) {
202 if ((sdl = (struct sockaddr_dl *)ifa->ifa_addr) /* we have an address structure */
203 && (sdl->sdl_family == AF_LINK) /* it's a link address */
204 && (sdl->sdl_type == IFT_ETHER)) { /* for an ethernet link */
205 retval = copyout(LLADDR(sdl),
206 (caddr_t)&ifd->current_pa,
211 (caddr_t)&ifd->default_pa,
218 return(ENOENT); /* ??? */
223 printf("osf1_ioctl_i: cmd = %d\n", cmd);
232 char sg_ispeed; /* input speed */
233 char sg_ospeed; /* output speed */
234 char sg_erase; /* erase character */
235 char sg_kill; /* kill character */
236 short sg_flags; /* mode flags */
241 osf1_ioctl_t(p, uap, cmd, dir, len)
243 struct ioctl_args /* {
245 syscallarg(u_long) com;
246 syscallarg(caddr_t) data;
256 case 0: /* OSF/1 COMPAT_43 TIOCGETD */
257 case 1: /* OSF/1 COMPAT_43 TIOCSETD */
258 case 8: /* OSF/1 COMPAT_43 TIOCGETP */
259 case 9: /* OSF/1 COMPAT_43 TIOCSETP */
260 case 10: /* OSF/1 COMPAT_43 TIOCSETN */
261 case 17: /* OSF/1 TIOCSETC (XXX) */
262 case 18: /* OSF/1 TIOCGETC (XXX) */
263 case 116: /* OSF/1 TIOCSLTC */
264 case 117: /* OSF/1 TIOCGLTC */
265 case 124: /* OSF/1 TIOCLGET */
266 case 125: /* OSF/1 TIOCLSET */
267 case 126: /* OSF/1 TIOCLBIC */
268 case 127: /* OSF/1 TIOCLBIS */
270 case 19: /* OSF/1 TIOCGETA (XXX) */
271 case 20: /* OSF/1 TIOCSETA (XXX) */
272 case 21: /* OSF/1 TIOCSETAW (XXX) */
273 case 22: /* OSF/1 TIOCSETAF (XXX) */
274 case 26: /* OSF/1 TIOCGETD (XXX) */
275 case 27: /* OSF/1 TIOCSETD (XXX) */
276 case 97: /* OSF/1 TIOCSCTTY */
277 case 103: /* OSF/1 TIOCSWINSZ */
278 case 104: /* OSF/1 TIOCGWINSZ */
279 case 110: /* OSF/1 TIOCSTART */
280 case 111: /* OSF/1 TIOCSTOP */
281 case 118: /* OSF/1 TIOCGPGRP */
282 case 119: /* OSF/1 TIOCGPGRP */
283 /* same as in NetBSD */
288 printf("osf1_ioctl_t: cmd = %d\n", cmd);
292 retval = ioctl(p, uap);
295 printf("osf1_ioctl_t: cmd = %d, com = 0x%lx, retval = %d\n",
296 cmd, uap->com,retval);
302 osf1_ioctl_f(p, uap, cmd, dir, len)
304 struct ioctl_args /* {
307 syscallarg(caddr_t) data;
315 case 1: /* OSF/1 FIOCLEX (XXX) */
316 case 2: /* OSF/1 FIONCLEX (XXX) */
317 case 127: /* OSF/1 FIONREAD (XXX) */
318 case 126: /* OSF/1 FIONREAD (XXX) */
319 case 125: /* OSF/1 FIOASYNC (XXX) */
320 case 124: /* OSF/1 FIOSETOWN (XXX) */
321 case 123: /* OSF/1 FIOGETOWN (XXX) */
322 /* same as in FreeBSD */
326 printf("osf1_ioctl_f: cmd = %d\n", cmd);
330 return ioctl(p, uap);