/arch/sparc/kernel/sunos_ioctl.c

https://github.com/dduval/kernel-rhel3 · C · 236 lines · 195 code · 25 blank · 16 comment · 24 complexity · 2415e44889e9e69501cb03b8291a96e6 MD5 · raw file

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