sunos_ioctl.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /* $Id: sunos_ioctl.c,v 1.34 2000/09/03 14:10:56 anton Exp $
  2. * sunos_ioctl.c: The Linux Operating system: SunOS ioctl compatibility.
  3. *
  4. * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
  5. * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  6. */
  7. #include <asm/uaccess.h>
  8. #include <linux/sched.h>
  9. #include <linux/errno.h>
  10. #include <linux/string.h>
  11. #include <linux/termios.h>
  12. #include <linux/ioctl.h>
  13. #include <linux/route.h>
  14. #include <linux/sockios.h>
  15. #include <linux/if.h>
  16. #include <linux/netdevice.h>
  17. #include <linux/if_arp.h>
  18. #include <linux/fs.h>
  19. #include <linux/mm.h>
  20. #include <linux/smp.h>
  21. #include <linux/smp_lock.h>
  22. #include <linux/syscalls.h>
  23. #include <linux/file.h>
  24. #include <asm/kbio.h>
  25. #if 0
  26. extern char sunkbd_type;
  27. extern char sunkbd_layout;
  28. #endif
  29. /* NR_OPEN is now larger and dynamic in recent kernels. */
  30. #define SUNOS_NR_OPEN 256
  31. asmlinkage int sunos_ioctl (int fd, unsigned long cmd, unsigned long arg)
  32. {
  33. int ret = -EBADF;
  34. if (fd >= SUNOS_NR_OPEN || !fcheck(fd))
  35. goto out;
  36. /* First handle an easy compat. case for tty ldisc. */
  37. if (cmd == TIOCSETD) {
  38. int __user *p;
  39. int ntty = N_TTY, tmp;
  40. mm_segment_t oldfs;
  41. p = (int __user *) arg;
  42. ret = -EFAULT;
  43. if (get_user(tmp, p))
  44. goto out;
  45. if (tmp == 2) {
  46. oldfs = get_fs();
  47. set_fs(KERNEL_DS);
  48. ret = sys_ioctl(fd, cmd, (unsigned long) &ntty);
  49. set_fs(oldfs);
  50. ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
  51. goto out;
  52. }
  53. }
  54. /* Binary compatibility is good American knowhow fuckin' up. */
  55. if (cmd == TIOCNOTTY) {
  56. ret = sys_setsid();
  57. goto out;
  58. }
  59. /* SunOS networking ioctls. */
  60. switch (cmd) {
  61. case _IOW('r', 10, struct rtentry):
  62. ret = sys_ioctl(fd, SIOCADDRT, arg);
  63. goto out;
  64. case _IOW('r', 11, struct rtentry):
  65. ret = sys_ioctl(fd, SIOCDELRT, arg);
  66. goto out;
  67. case _IOW('i', 12, struct ifreq):
  68. ret = sys_ioctl(fd, SIOCSIFADDR, arg);
  69. goto out;
  70. case _IOWR('i', 13, struct ifreq):
  71. ret = sys_ioctl(fd, SIOCGIFADDR, arg);
  72. goto out;
  73. case _IOW('i', 14, struct ifreq):
  74. ret = sys_ioctl(fd, SIOCSIFDSTADDR, arg);
  75. goto out;
  76. case _IOWR('i', 15, struct ifreq):
  77. ret = sys_ioctl(fd, SIOCGIFDSTADDR, arg);
  78. goto out;
  79. case _IOW('i', 16, struct ifreq):
  80. ret = sys_ioctl(fd, SIOCSIFFLAGS, arg);
  81. goto out;
  82. case _IOWR('i', 17, struct ifreq):
  83. ret = sys_ioctl(fd, SIOCGIFFLAGS, arg);
  84. goto out;
  85. case _IOW('i', 18, struct ifreq):
  86. ret = sys_ioctl(fd, SIOCSIFMEM, arg);
  87. goto out;
  88. case _IOWR('i', 19, struct ifreq):
  89. ret = sys_ioctl(fd, SIOCGIFMEM, arg);
  90. goto out;
  91. case _IOWR('i', 20, struct ifconf):
  92. ret = sys_ioctl(fd, SIOCGIFCONF, arg);
  93. goto out;
  94. case _IOW('i', 21, struct ifreq): /* SIOCSIFMTU */
  95. ret = sys_ioctl(fd, SIOCSIFMTU, arg);
  96. goto out;
  97. case _IOWR('i', 22, struct ifreq): /* SIOCGIFMTU */
  98. ret = sys_ioctl(fd, SIOCGIFMTU, arg);
  99. goto out;
  100. case _IOWR('i', 23, struct ifreq):
  101. ret = sys_ioctl(fd, SIOCGIFBRDADDR, arg);
  102. goto out;
  103. case _IOW('i', 24, struct ifreq):
  104. ret = sys_ioctl(fd, SIOCSIFBRDADDR, arg);
  105. goto out;
  106. case _IOWR('i', 25, struct ifreq):
  107. ret = sys_ioctl(fd, SIOCGIFNETMASK, arg);
  108. goto out;
  109. case _IOW('i', 26, struct ifreq):
  110. ret = sys_ioctl(fd, SIOCSIFNETMASK, arg);
  111. goto out;
  112. case _IOWR('i', 27, struct ifreq):
  113. ret = sys_ioctl(fd, SIOCGIFMETRIC, arg);
  114. goto out;
  115. case _IOW('i', 28, struct ifreq):
  116. ret = sys_ioctl(fd, SIOCSIFMETRIC, arg);
  117. goto out;
  118. case _IOW('i', 30, struct arpreq):
  119. ret = sys_ioctl(fd, SIOCSARP, arg);
  120. goto out;
  121. case _IOWR('i', 31, struct arpreq):
  122. ret = sys_ioctl(fd, SIOCGARP, arg);
  123. goto out;
  124. case _IOW('i', 32, struct arpreq):
  125. ret = sys_ioctl(fd, SIOCDARP, arg);
  126. goto out;
  127. case _IOW('i', 40, struct ifreq): /* SIOCUPPER */
  128. case _IOW('i', 41, struct ifreq): /* SIOCLOWER */
  129. case _IOW('i', 44, struct ifreq): /* SIOCSETSYNC */
  130. case _IOW('i', 45, struct ifreq): /* SIOCGETSYNC */
  131. case _IOW('i', 46, struct ifreq): /* SIOCSSDSTATS */
  132. case _IOW('i', 47, struct ifreq): /* SIOCSSESTATS */
  133. case _IOW('i', 48, struct ifreq): /* SIOCSPROMISC */
  134. ret = -EOPNOTSUPP;
  135. goto out;
  136. case _IOW('i', 49, struct ifreq):
  137. ret = sys_ioctl(fd, SIOCADDMULTI, arg);
  138. goto out;
  139. case _IOW('i', 50, struct ifreq):
  140. ret = sys_ioctl(fd, SIOCDELMULTI, arg);
  141. goto out;
  142. /* FDDI interface ioctls, unsupported. */
  143. case _IOW('i', 51, struct ifreq): /* SIOCFDRESET */
  144. case _IOW('i', 52, struct ifreq): /* SIOCFDSLEEP */
  145. case _IOW('i', 53, struct ifreq): /* SIOCSTRTFMWAR */
  146. case _IOW('i', 54, struct ifreq): /* SIOCLDNSTRTFW */
  147. case _IOW('i', 55, struct ifreq): /* SIOCGETFDSTAT */
  148. case _IOW('i', 56, struct ifreq): /* SIOCFDNMIINT */
  149. case _IOW('i', 57, struct ifreq): /* SIOCFDEXUSER */
  150. case _IOW('i', 58, struct ifreq): /* SIOCFDGNETMAP */
  151. case _IOW('i', 59, struct ifreq): /* SIOCFDGIOCTL */
  152. printk("FDDI ioctl, returning EOPNOTSUPP\n");
  153. ret = -EOPNOTSUPP;
  154. goto out;
  155. case _IOW('t', 125, int):
  156. /* More stupid tty sunos ioctls, just
  157. * say it worked.
  158. */
  159. ret = 0;
  160. goto out;
  161. /* Non posix grp */
  162. case _IOW('t', 118, int): {
  163. int oldval, newval, __user *ptr;
  164. cmd = TIOCSPGRP;
  165. ptr = (int __user *) arg;
  166. ret = -EFAULT;
  167. if (get_user(oldval, ptr))
  168. goto out;
  169. ret = sys_ioctl(fd, cmd, arg);
  170. __get_user(newval, ptr);
  171. if (newval == -1) {
  172. __put_user(oldval, ptr);
  173. ret = -EIO;
  174. }
  175. if (ret == -ENOTTY)
  176. ret = -EIO;
  177. goto out;
  178. }
  179. case _IOR('t', 119, int): {
  180. int oldval, newval, __user *ptr;
  181. cmd = TIOCGPGRP;
  182. ptr = (int __user *) arg;
  183. ret = -EFAULT;
  184. if (get_user(oldval, ptr))
  185. goto out;
  186. ret = sys_ioctl(fd, cmd, arg);
  187. __get_user(newval, ptr);
  188. if (newval == -1) {
  189. __put_user(oldval, ptr);
  190. ret = -EIO;
  191. }
  192. if (ret == -ENOTTY)
  193. ret = -EIO;
  194. goto out;
  195. }
  196. }
  197. #if 0
  198. if ((cmd & 0xff00) == ('k' << 8)) {
  199. printk ("[[KBIO: %8.8x\n", (unsigned int) cmd);
  200. }
  201. #endif
  202. ret = sys_ioctl(fd, cmd, arg);
  203. /* so stupid... */
  204. ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
  205. out:
  206. return ret;
  207. }