sunos_ioctl.c 5.7 KB

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