Deleted Added
full compact
linux_ioctl.c (111741) linux_ioctl.c (111742)
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 *
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 111741 2003-03-02 15:50:23Z des $
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
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
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 ");
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<LINUX_NCCS; i++)
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");
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",
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 ");
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<NCCS; i++)
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{
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;
915 u_char cdte_track;
916 u_char cdte_adr:4;
917 u_char cdte_ctrl:4;
916 u_char cdte_adr:4;
917 u_char cdte_ctrl:4;
918 u_char cdte_format;
918 u_char cdte_format;
919 union linux_cdrom_addr cdte_addr;
919 union linux_cdrom_addr cdte_addr;
920 u_char cdte_datamode;
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 }
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
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 }
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
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 }
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
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__));
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
2108
2109 ifp = NULL;
2110 error = 0;
2109 ifp = NULL;
2110 error = 0;
2111
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) {
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
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;
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
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;
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
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;
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
2256
2257 case LINUX_SIOCGIFMTU:
2258 args->cmd = SIOCGIFMTU;
2259 error = ioctl(td, (struct ioctl_args *)args);
2260 break;
2257 case LINUX_SIOCGIFMTU:
2258 args->cmd = SIOCGIFMTU;
2259 error = ioctl(td, (struct ioctl_args *)args);
2260 break;
2261
2261
2262 case LINUX_SIOCSIFMTU:
2263 args->cmd = SIOCSIFMTU;
2264 error = ioctl(td, (struct ioctl_args *)args);
2265 break;
2262 case LINUX_SIOCSIFMTU:
2263 args->cmd = SIOCSIFMTU;
2264 error = ioctl(td, (struct ioctl_args *)args);
2265 break;
2266
2266
2267 case LINUX_SIOCSIFNAME:
2268 error = ENOIOCTL;
2269 break;
2267 case LINUX_SIOCSIFNAME:
2268 error = ENOIOCTL;
2269 break;
2270
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;
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
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;
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
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);
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
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 ---
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 ---