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 * XXX SVR4 Streams IOCTLs are all unimpl.
138 "unimplented OSF/1 IOCTL: group = %c, cmd = %d, len = %d, dir = %s\n",
139 group, cmd, len, dirstr);
145 * Structure used to query de and qe for physical addresses.
147 struct osf1_ifdevea {
148 char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
149 u_char default_pa[6]; /* default hardware address */
150 u_char current_pa[6]; /* current physical address */
155 osf1_ioctl_i(p, uap, cmd, dir, len)
157 struct ioctl_args /* {
159 syscallarg(u_long) com;
160 syscallarg(caddr_t) data;
168 case 20: /* OSF/1 OSIOCGIFCONF */
169 case 36: /* OSF/1 SIOCGIFCONF */
170 case 12: /* OSF/1 SIOCSIFADDR */
171 case 14: /* OSF/1 SIOCSIFDSTADDR */
172 case 16: /* OSF/1 SIOCSIFFLAGS (XXX) */
173 case 17: /* OSF/1 SIOCGIFFLAGS (XXX) */
174 case 19: /* OSF/1 SIOCSIFBRDADDR */
175 case 22: /* OSF/1 SIOCSIFNETMASK */
176 case 23: /* OSF/1 SIOCGIFMETRIC */
177 case 24: /* OSF/1 SIOCSIFMETRIC */
178 case 25: /* OSF/1 SIOCDIFADDR */
179 case 33: /* OSF/1 SIOCGIFADDR */
180 case 34: /* OSF/1 SIOCGIFDSTADDR */
181 case 35: /* OSF/1 SIOCGIFBRDADDR */
182 case 37: /* OSF/1 SIOCGIFNETMASK */
183 /* same as in FreeBSD */
184 return ioctl(p, uap);
187 case 62: /* OSF/1 SIOCRPHYSADDR */
193 struct sockaddr_dl *sdl;
194 struct osf1_ifdevea *ifd = (struct osf1_ifdevea *)uap->data;
197 * Note that we don't actually respect the name in the ifreq
198 * structure, as DU interface names are all different.
200 for (ifn = 0; ifn < if_index; ifn++) {
201 ifp = ifnet_addrs[ifn]->ifa_ifp; /* pointer to interface */
202 /* Only look at ether interfaces, exclude alteon nics
203 * because osf/1 doesn't know about most of them.
205 if (ifp->if_type == IFT_ETHER
206 && strcmp(ifp->if_name, "ti")) { /* looks good */
207 /* walk the address list */
208 for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa;
209 ifa = TAILQ_NEXT(ifa, ifa_link)) {
210 if ((sdl = (struct sockaddr_dl *)ifa->ifa_addr) /* we have an address structure */
211 && (sdl->sdl_family == AF_LINK) /* it's a link address */
212 && (sdl->sdl_type == IFT_ETHER)) { /* for an ethernet link */
213 retval = copyout(LLADDR(sdl),
214 (caddr_t)&ifd->current_pa,
219 (caddr_t)&ifd->default_pa,
226 return(ENOENT); /* ??? */
231 printf("osf1_ioctl_i: cmd = %d\n", cmd);
240 char sg_ispeed; /* input speed */
241 char sg_ospeed; /* output speed */
242 char sg_erase; /* erase character */
243 char sg_kill; /* kill character */
244 short sg_flags; /* mode flags */
249 osf1_ioctl_t(p, uap, cmd, dir, len)
251 struct ioctl_args /* {
253 syscallarg(u_long) com;
254 syscallarg(caddr_t) data;
264 case 0: /* OSF/1 COMPAT_43 TIOCGETD */
265 case 1: /* OSF/1 COMPAT_43 TIOCSETD */
266 case 8: /* OSF/1 COMPAT_43 TIOCGETP */
267 case 9: /* OSF/1 COMPAT_43 TIOCSETP */
268 case 10: /* OSF/1 COMPAT_43 TIOCSETN */
269 case 17: /* OSF/1 TIOCSETC (XXX) */
270 case 18: /* OSF/1 TIOCGETC (XXX) */
271 case 116: /* OSF/1 TIOCSLTC */
272 case 117: /* OSF/1 TIOCGLTC */
273 case 124: /* OSF/1 TIOCLGET */
274 case 125: /* OSF/1 TIOCLSET */
275 case 126: /* OSF/1 TIOCLBIC */
276 case 127: /* OSF/1 TIOCLBIS */
278 case 19: /* OSF/1 TIOCGETA (XXX) */
279 case 20: /* OSF/1 TIOCSETA (XXX) */
280 case 21: /* OSF/1 TIOCSETAW (XXX) */
281 case 22: /* OSF/1 TIOCSETAF (XXX) */
282 case 26: /* OSF/1 TIOCGETD (XXX) */
283 case 27: /* OSF/1 TIOCSETD (XXX) */
284 case 97: /* OSF/1 TIOCSCTTY */
285 case 103: /* OSF/1 TIOCSWINSZ */
286 case 104: /* OSF/1 TIOCGWINSZ */
287 case 110: /* OSF/1 TIOCSTART */
288 case 111: /* OSF/1 TIOCSTOP */
289 case 118: /* OSF/1 TIOCGPGRP */
290 case 119: /* OSF/1 TIOCGPGRP */
291 /* same as in NetBSD */
296 printf("osf1_ioctl_t: cmd = %d\n", cmd);
300 retval = ioctl(p, uap);
303 printf("osf1_ioctl_t: cmd = %d, com = 0x%lx, retval = %d\n",
304 cmd, uap->com,retval);
310 osf1_ioctl_f(p, uap, cmd, dir, len)
312 struct ioctl_args /* {
315 syscallarg(caddr_t) data;
323 case 1: /* OSF/1 FIOCLEX (XXX) */
324 case 2: /* OSF/1 FIONCLEX (XXX) */
325 case 127: /* OSF/1 FIONREAD (XXX) */
326 case 126: /* OSF/1 FIONREAD (XXX) */
327 case 125: /* OSF/1 FIOASYNC (XXX) */
328 case 124: /* OSF/1 FIOSETOWN (XXX) */
329 case 123: /* OSF/1 FIOGETOWN (XXX) */
330 /* same as in FreeBSD */
334 printf("osf1_ioctl_f: cmd = %d\n", cmd);
338 return ioctl(p, uap);