1/* 2 * Copyright (c) 1994-1995 S�ren Schmidt 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * |
28 * $FreeBSD: head/sys/compat/linux/linux_ioctl.c 111742 2003-03-02 15:56:49Z des $ |
29 */ 30 31#include <sys/param.h> 32#include <sys/systm.h> 33#include <sys/sysproto.h> 34#include <sys/cdio.h> 35#include <sys/dvdio.h> 36#include <sys/consio.h> --- 54 unchanged lines hidden (view full) --- 91DATA_SET(linux_ioctl_handler_set, vfat_handler); 92DATA_SET(linux_ioctl_handler_set, console_handler); 93DATA_SET(linux_ioctl_handler_set, disk_handler); 94DATA_SET(linux_ioctl_handler_set, socket_handler); 95DATA_SET(linux_ioctl_handler_set, sound_handler); 96DATA_SET(linux_ioctl_handler_set, termio_handler); 97DATA_SET(linux_ioctl_handler_set, private_handler); 98 |
99struct handler_element |
100{ 101 TAILQ_ENTRY(handler_element) list; 102 int (*func)(struct thread *, struct linux_ioctl_args *); 103 int low, high, span; 104}; 105 106static TAILQ_HEAD(, handler_element) handlers = 107 TAILQ_HEAD_INITIALIZER(handlers); --- 232 unchanged lines hidden (view full) --- 340 341#ifdef DEBUG 342 if (ldebug(ioctl)) { 343 printf("LINUX: LINUX termios structure (output):\n"); 344 printf("i=%08x o=%08x c=%08x l=%08x line=%d\n", 345 lios->c_iflag, lios->c_oflag, lios->c_cflag, 346 lios->c_lflag, (int)lios->c_line); 347 printf("c_cc "); |
348 for (i=0; i |
349 printf("%02x ", lios->c_cc[i]); 350 printf("\n"); 351 } 352#endif 353} 354 355static void 356linux_to_bsd_termios(struct linux_termios *lios, struct termios *bios) 357{ 358 int i; 359 360#ifdef DEBUG 361 if (ldebug(ioctl)) { 362 printf("LINUX: LINUX termios structure (input):\n"); |
363 printf("i=%08x o=%08x c=%08x l=%08x line=%d\n", |
364 lios->c_iflag, lios->c_oflag, lios->c_cflag, 365 lios->c_lflag, (int)lios->c_line); 366 printf("c_cc "); 367 for (i=0; i<LINUX_NCCS; i++) 368 printf("%02x ", lios->c_cc[i]); 369 printf("\n"); 370 } 371#endif --- 109 unchanged lines hidden (view full) --- 481 482#ifdef DEBUG 483 if (ldebug(ioctl)) { 484 printf("LINUX: BSD termios structure (output):\n"); 485 printf("i=%08x o=%08x c=%08x l=%08x ispeed=%d ospeed=%d\n", 486 bios->c_iflag, bios->c_oflag, bios->c_cflag, bios->c_lflag, 487 bios->c_ispeed, bios->c_ospeed); 488 printf("c_cc "); |
489 for (i=0; i |
490 printf("%02x ", bios->c_cc[i]); 491 printf("\n"); 492 } 493#endif 494} 495 496static void 497bsd_to_linux_termio(struct termios *bios, struct linux_termio *lio) --- 409 unchanged lines hidden (view full) --- 907 u_char second; 908 u_char frame; 909 } msf; 910 int lba; 911}; 912 913struct linux_cdrom_tocentry 914{ |
915 u_char cdte_track; |
916 u_char cdte_adr:4; 917 u_char cdte_ctrl:4; |
918 u_char cdte_format; |
919 union linux_cdrom_addr cdte_addr; |
920 u_char cdte_datamode; |
921}; 922 923struct linux_cdrom_subchnl 924{ 925 u_char cdsc_format; 926 u_char cdsc_audiostatus; 927 u_char cdsc_adr:4; 928 u_char cdsc_ctrl:4; --- 946 unchanged lines hidden (view full) --- 1875 args->cmd = VT_WAITACTIVE; 1876 error = (ioctl(td, (struct ioctl_args *)args)); 1877 break; 1878 1879 default: 1880 error = ENOIOCTL; 1881 break; 1882 } |
1883 |
1884 fdrop(fp, td); 1885 return (error); 1886} 1887 1888/* 1889 * Criteria for interface name translation 1890 */ 1891#define IFP_IS_ETH(ifp) (ifp->if_type == IFT_ETHER) --- 176 unchanged lines hidden (view full) --- 2068 struct sockaddr_dl *sdl; 2069 struct l_sockaddr lsa; 2070 2071 if (ifp->if_type == IFT_LOOP) { 2072 bzero(&lsa, sizeof lsa); 2073 lsa.sa_family = ARPHRD_LOOPBACK; 2074 return (copyout(&lsa, &ifr->ifr_hwaddr, sizeof lsa)); 2075 } |
2076 |
2077 if (ifp->if_type != IFT_ETHER) 2078 return (ENOENT); 2079 2080 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { 2081 sdl = (struct sockaddr_dl*)ifa->ifa_addr; 2082 if (sdl != NULL && (sdl->sdl_family == AF_LINK) && 2083 (sdl->sdl_type == IFT_ETHER)) { 2084 bzero(&lsa, sizeof lsa); 2085 lsa.sa_family = ARPHRD_ETHER; 2086 bcopy(LLADDR(sdl), lsa.sa_data, LINUX_IFHWADDRLEN); 2087 return (copyout(&lsa, &ifr->ifr_hwaddr, sizeof lsa)); 2088 } 2089 } |
2090 |
2091 return (ENOENT); 2092} 2093 2094/* 2095 * Socket related ioctls 2096 */ 2097 2098static int 2099linux_ioctl_socket(struct thread *td, struct linux_ioctl_args *args) 2100{ 2101 char lifname[LINUX_IFNAMSIZ], ifname[IFNAMSIZ]; 2102 struct ifnet *ifp; 2103 struct file *fp; 2104 int error, type; 2105 2106 KASSERT(LINUX_IFNAMSIZ == IFNAMSIZ, 2107 ("%s(): LINUX_IFNAMSIZ != IFNAMSIZ", __func__)); |
2108 |
2109 ifp = NULL; 2110 error = 0; |
2111 |
2112 if ((error = fget(td, args->fd, &fp)) != 0) 2113 return (error); 2114 type = fp->f_type; 2115 fdrop(fp, td); 2116 if (type != DTYPE_SOCKET) { 2117 /* not a socket - probably a tap / vmnet device */ 2118 switch (args->cmd) { 2119 case LINUX_SIOCGIFADDR: 2120 case LINUX_SIOCSIFADDR: 2121 case LINUX_SIOCGIFFLAGS: 2122 return (linux_ioctl_special(td, args)); 2123 default: 2124 return (ENOIOCTL); 2125 } 2126 } 2127 2128 switch (args->cmd & 0xffff) { |
2129 |
2130 case LINUX_FIOGETOWN: 2131 case LINUX_FIOSETOWN: 2132 case LINUX_SIOCADDMULTI: 2133 case LINUX_SIOCATMARK: 2134 case LINUX_SIOCDELMULTI: 2135 case LINUX_SIOCGIFCONF: 2136 case LINUX_SIOCGPGRP: 2137 case LINUX_SIOCSPGRP: 2138 /* these ioctls don't take an interface name */ 2139#ifdef DEBUG 2140 printf("%s(): ioctl %d\n", __func__, 2141 args->cmd & 0xffff); 2142#endif 2143 break; |
2144 |
2145 case LINUX_SIOCGIFFLAGS: 2146 case LINUX_SIOCGIFADDR: 2147 case LINUX_SIOCSIFADDR: 2148 case LINUX_SIOCGIFDSTADDR: 2149 case LINUX_SIOCGIFBRDADDR: 2150 case LINUX_SIOCGIFNETMASK: 2151 case LINUX_SIOCSIFNETMASK: 2152 case LINUX_SIOCGIFMTU: --- 23 unchanged lines hidden (view full) --- 2176 error = copyout(ifname, (char *)args->arg, IFNAMSIZ); 2177 if (error != 0) 2178 return (error); 2179#ifdef DEBUG 2180 printf("%s(): %s translated to %s\n", __func__, 2181 lifname, ifname); 2182#endif 2183 break; |
2184 |
2185 default: 2186 return (ENOIOCTL); 2187 } 2188 2189 switch (args->cmd & 0xffff) { 2190 2191 case LINUX_FIOSETOWN: 2192 args->cmd = FIOSETOWN; --- 55 unchanged lines hidden (view full) --- 2248 case LINUX_SIOCGIFNETMASK: 2249 args->cmd = OSIOCGIFNETMASK; 2250 error = ioctl(td, (struct ioctl_args *)args); 2251 break; 2252 2253 case LINUX_SIOCSIFNETMASK: 2254 error = ENOIOCTL; 2255 break; |
2256 |
2257 case LINUX_SIOCGIFMTU: 2258 args->cmd = SIOCGIFMTU; 2259 error = ioctl(td, (struct ioctl_args *)args); 2260 break; |
2261 |
2262 case LINUX_SIOCSIFMTU: 2263 args->cmd = SIOCSIFMTU; 2264 error = ioctl(td, (struct ioctl_args *)args); 2265 break; |
2266 |
2267 case LINUX_SIOCSIFNAME: 2268 error = ENOIOCTL; 2269 break; |
2270 |
2271 case LINUX_SIOCGIFHWADDR: 2272 error = linux_gifhwaddr(ifp, (struct l_ifreq *)args->arg); 2273 break; 2274 2275 case LINUX_SIOCSIFHWADDR: 2276 error = ENOIOCTL; 2277 break; |
2278 |
2279 case LINUX_SIOCADDMULTI: 2280 args->cmd = SIOCADDMULTI; 2281 error = ioctl(td, (struct ioctl_args *)args); 2282 break; 2283 2284 case LINUX_SIOCDELMULTI: 2285 args->cmd = SIOCDELMULTI; 2286 error = ioctl(td, (struct ioctl_args *)args); 2287 break; 2288 2289 /* 2290 * XXX This is slightly bogus, but these ioctls are currently 2291 * XXX only used by the aironet (if_an) network driver. 2292 */ 2293 case LINUX_SIOCDEVPRIVATE: 2294 args->cmd = SIOCGPRIVATE_0; 2295 error = ioctl(td, (struct ioctl_args *)args); 2296 break; |
2297 |
2298 case LINUX_SIOCDEVPRIVATE+1: 2299 args->cmd = SIOCGPRIVATE_1; 2300 error = ioctl(td, (struct ioctl_args *)args); 2301 break; 2302 } 2303 2304 if (ifp != NULL) 2305 /* restore the original interface name */ --- 112 unchanged lines hidden (view full) --- 2418 break; 2419 } 2420 if (he == NULL) { 2421 MALLOC(he, struct handler_element *, sizeof(*he), 2422 M_LINUX, M_WAITOK); 2423 he->func = h->func; 2424 } else 2425 TAILQ_REMOVE(&handlers, he, list); |
2426 |
2427 /* Initialize range information. */ 2428 he->low = h->low; 2429 he->high = h->high; 2430 he->span = h->high - h->low + 1; 2431 2432 /* Add the element to the list, sorted on span. */ 2433 TAILQ_FOREACH(cur, &handlers, list) { 2434 if (cur->span > he->span) { --- 27 unchanged lines hidden --- |