]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/alpha/osf1/osf1_ioctl.c
This commit was generated by cvs2svn to compensate for changes in r58551,
[FreeBSD/FreeBSD.git] / sys / alpha / osf1 / osf1_ioctl.c
1 /*      $NetBSD: osf1_ioctl.c,v 1.5 1996/10/13 00:46:53 christos Exp $  */
2
3 /*
4  * Copyright (c) 1994, 1995 Carnegie-Mellon University.
5  * All rights reserved.
6  *
7  * Author: Chris G. Demetriou
8  *
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.
14  *
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.
18  *
19  * Carnegie Mellon requests users of this software to return to
20  *
21  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
22  *  School of Computer Science
23  *  Carnegie Mellon University
24  *  Pittsburgh PA 15213-3890
25  *
26  * any improvements or extensions that they make and grant Carnegie the
27  * rights to redistribute these changes.
28  */
29
30 /*
31  * Additional Copyright (c) 1999 by Andrew Gallatin
32  * $FreeBSD$
33  */
34
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>
42 #include <sys/file.h>
43 #include <sys/proc.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>
50 #include <net/if.h>
51 #include <net/if_dl.h>
52 #include <net/if_types.h>
53 #include <sys/sockio.h>
54
55 #include "opt_compat.h"
56
57 /*#define       IOCTL_DEBUG*/
58
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));
65
66 int
67 osf1_ioctl(p, uap)
68         struct proc *p;
69         struct osf1_ioctl_args *uap;
70 {
71         char *dirstr;
72         unsigned int cmd, dir, group, len, op;
73         struct ioctl_args /* {
74                 syscallarg(int) fd;
75                 syscallarg(u_long) com;
76                 syscallarg(caddr_t) data;
77         } */ a;
78
79         op = uap->com;
80         dir = op & OSF1_IOC_DIRMASK;
81         group = OSF1_IOCGROUP(op);
82         cmd = OSF1_IOCCMD(op);
83         len = OSF1_IOCPARM_LEN(op);
84
85         switch (dir) {
86         case OSF1_IOC_VOID:
87                 dir = IOC_VOID;
88                 dirstr = "none";
89                 break;
90
91         case OSF1_IOC_OUT:
92                 dir = IOC_OUT;
93                 dirstr = "out";
94                 break;
95
96         case OSF1_IOC_IN:
97                 dir = IOC_IN;
98                 dirstr = "in";
99                 break;
100
101         case OSF1_IOC_INOUT:
102                 dir = IOC_INOUT;
103                 dirstr = "in-out";
104                 break;
105
106         default:
107                 return (EINVAL);
108                 break;
109         }
110 #ifdef IOCTL_DEBUG
111                 uprintf(
112                     "OSF/1 IOCTL: group = %c, cmd = %d, len = %d, dir = %s\n",
113                     group, cmd, len, dirstr);
114 #endif
115
116         a.fd = uap->fd;
117         a.com = (unsigned long)uap->com;
118         bzero(&a.com, sizeof(long));
119         a.com = _IOC(dir, group, cmd, len);
120         a.data = uap->data;
121         switch (group) {
122         case 'i':
123                 return osf1_ioctl_i(p, &a, cmd, dir, len);
124         case 't':
125                 return osf1_ioctl_t(p, &a, cmd, dir, len);
126         case 'f':
127                 return osf1_ioctl_f(p, &a, cmd, dir, len);
128         case 'S':
129                 /*
130                  * XXX SVR4 Streams IOCTLs are all unimpl.
131                  */
132
133 #ifndef IOCTL_DEBUG
134                 return (0);
135 #endif          
136         default:
137                 printf(
138                     "unimplented OSF/1 IOCTL: group = %c, cmd = %d, len = %d, dir = %s\n",
139                     group, cmd, len, dirstr);
140                 return (ENOTTY);
141         }
142 }
143
144 /*
145  * Structure used to query de and qe for physical addresses.
146  */
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 */
151 };
152
153
154 int
155 osf1_ioctl_i(p, uap, cmd, dir, len)
156         struct proc *p;
157         struct ioctl_args /* {
158                 syscallarg(int) fd;
159                 syscallarg(u_long) com;
160                 syscallarg(caddr_t) data;
161         } */ *uap;
162         int cmd;
163         int dir;
164         int len;
165 {
166
167         switch (cmd) {
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);
185                 break;
186
187         case 62:                        /* OSF/1 SIOCRPHYSADDR */
188
189         {
190                 int                     ifn, retval;
191                 struct ifnet            *ifp;
192                 struct ifaddr           *ifa;
193                 struct sockaddr_dl      *sdl;
194                 struct osf1_ifdevea     *ifd = (struct osf1_ifdevea *)uap->data;
195                 
196                 /*
197                  * Note that we don't actually respect the name in the ifreq
198                  * structure, as DU interface names are all different.
199                  */
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.
204                          */
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,
215                                                     6);
216                                                 if (!retval) {
217                                                         return(copyout(
218                                                             LLADDR(sdl),
219                                                             (caddr_t)&ifd->default_pa,
220                                                             6));
221                                                 }
222                                         }
223                                 }
224                         }
225                 }
226                 return(ENOENT);         /* ??? */
227         }
228
229
230         default:
231                 printf("osf1_ioctl_i: cmd = %d\n", cmd);
232                 return (ENOTTY);
233         }
234
235
236 }
237 #ifndef _SGTTYB_
238 #define _SGTTYB_
239 struct sgttyb {
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 */
245 };
246 #endif
247
248 int
249 osf1_ioctl_t(p, uap, cmd, dir, len)
250         struct proc *p;
251         struct ioctl_args /* {
252                 syscallarg(int) fd;
253                 syscallarg(u_long) com;
254                 syscallarg(caddr_t) data;
255         } */ *uap;
256         int cmd;
257         int dir;
258         int len;
259 {
260         int retval;
261
262         switch (cmd) {
263 #ifdef COMPAT_43
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 */            
277 #endif
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 */
292                 break;
293
294
295         default:
296                 printf("osf1_ioctl_t: cmd = %d\n", cmd);
297                 return (ENOTTY);
298         }
299
300         retval = ioctl(p, uap);
301 #if 0
302         if (retval)
303                 printf("osf1_ioctl_t: cmd = %d, com = 0x%lx, retval = %d\n",
304                        cmd, uap->com,retval);
305 #endif
306         return retval;
307 }
308
309 int
310 osf1_ioctl_f(p, uap, cmd, dir, len)
311         struct proc *p;
312         struct ioctl_args /* {
313                 syscallarg(int) fd;
314                 syscallarg(int) com;
315                 syscallarg(caddr_t) data;
316         } */ *uap;
317         int cmd;
318         int dir;
319         int len;
320 {
321
322         switch (cmd) {
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 */
331                 break;
332                 
333         default:
334                 printf("osf1_ioctl_f: cmd = %d\n", cmd);
335                 return (ENOTTY);
336         }
337
338         return ioctl(p, uap);
339 }