sys_socket.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sys_socket.c - socket ioctl routines */
  2. /* Copyright 1984 - 2000 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (c) 1982, 1986 Regents of the University of California.
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms are permitted
  9.  * provided that the above copyright notice and this paragraph are
  10.  * duplicated in all such forms and that any documentation,
  11.  * advertising materials, and other materials related to such
  12.  * distribution and use acknowledge that the software was developed
  13.  * by the University of California, Berkeley.  The name of the
  14.  * University may not be used to endorse or promote products derived
  15.  * from this software without specific prior written permission.
  16.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  17.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  18.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19.  *
  20.  *      @(#)sys_socket.c        7.3 (Berkeley) 6/29/88
  21.  */
  22. /*
  23. modification history
  24. --------------------
  25. 02l,12oct01,rae  merge from truestack (compilation warnings, WindView)
  26. 02k,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h
  27. 02j,26may92,rrr  the tree shuffle
  28. 02i,02dec91,elh  changed error handling to return ERROR (on error)
  29.  with errno set with return value.
  30. 02h,04oct91,rrr  passed through the ansification filter
  31.   -changed includes to have absolute path from h/
  32.   -changed copyright notice
  33. 02g,19apr90,hjb  deleted param.h
  34. 02f,16mar90,rdc  added select stuff.
  35. 02e,16apr89,gae  updated to new 4.3BSD.
  36. 02d,14dec87,gae  added include of vxWorks.h.
  37. 02c,29apr87,dnw  removed unnecessary includes.
  38.  removed unimplemented FIO_ASYNC ioctl ops from soo_ioctl().
  39. 02b,03apr87,ecs  added header and copyright.
  40. 02a,02feb87,jlf  Removed CLEAN ifdefs.
  41. */
  42. /*
  43. DESCRIPTION
  44. */
  45. #include "vxWorks.h"
  46. #include "net/mbuf.h"
  47. #include "net/protosw.h"
  48. #include "sys/socket.h"
  49. #include "net/socketvar.h"
  50. #include "sys/ioctl.h"
  51. #include "net/uio.h"
  52. #include "selectLib.h"
  53. #include "net/if.h"
  54. #include "net/route.h"
  55. #include "errno.h"
  56. #include "ioLib.h"
  57. #ifdef WV_INSTRUMENTATION
  58. #ifdef INCLUDE_WVNET
  59. #include "wvNetLib.h"
  60. #endif
  61. #endif
  62. #ifdef WV_INSTRUMENTATION
  63. #ifdef INCLUDE_WVNET
  64.     /* Set common fields of event identifiers for this module. */
  65. LOCAL UCHAR wvNetModuleId = WV_NET_SYSSOCK_MODULE; /* Value for sys_socket.c */
  66. LOCAL UCHAR wvNetLocalFilter = WV_NET_NONE;     /* Available event filter */
  67. LOCAL ULONG wvNetEventId;       /* Event identifier: see wvNetLib.h */
  68. #endif    /* INCLUDE_WVNET */
  69. #endif
  70. extern void sbselqueue ();
  71. extern void sbseldequeue ();
  72. int
  73. soo_ioctl(so, cmd, data)
  74. struct socket *so;
  75. int cmd;
  76. register caddr_t data;
  77. {
  78. int status;
  79. #ifdef WV_INSTRUMENTATION
  80. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  81.         WV_NET_MARKER_2 (NET_AUX_EVENT, WV_NET_INFO, 23, 1,
  82.                          WV_NETEVENT_SOCKIOCTL_START, so->so_fd, cmd)
  83. #endif  /* INCLUDE_WVNET */
  84. #endif
  85. switch (cmd) {
  86. case FIONBIO:
  87. if (*(int *)data)
  88. so->so_state |= SS_NBIO;
  89. else
  90. so->so_state &= ~SS_NBIO;
  91. return (0);
  92. case FIONREAD:
  93. *(int *)data = so->so_rcv.sb_cc;
  94. return (0);
  95. case SIOCSPGRP:
  96. so->so_pgrp = *(int *)data;
  97. return (0);
  98. case SIOCGPGRP:
  99. *(int *)data = so->so_pgrp;
  100. return (0);
  101. case SIOCATMARK:
  102. *(int *)data = (so->so_state&SS_RCVATMARK) != 0;
  103. return (0);
  104. case FIOSELECT:
  105. soo_select (so, (SEL_WAKEUP_NODE *) data);
  106. return (0);
  107. case FIOUNSELECT:
  108. soo_unselect (so, (SEL_WAKEUP_NODE *) data);
  109. return (0);
  110. }
  111. /*
  112.  * Interface/routing/protocol specific ioctls:
  113.  * interface and routing ioctls should have a
  114.  * different entry since a socket's unnecessary
  115.  */
  116. #define cmdbyte(x) (((x) >> 8) & 0xff)
  117. if (cmdbyte(cmd) == 'i')
  118. status = ifioctl(so, cmd, data);
  119. else {
  120. if (cmdbyte(cmd) == 'r')
  121. status = rtioctl(cmd, data);
  122. else
  123. status = ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
  124.       (struct mbuf *)cmd, (struct mbuf *)data,
  125.  (struct mbuf *)0));
  126. }
  127. if (status != 0)
  128. {
  129. errno = status;
  130. return (ERROR);
  131. }
  132. else
  133. return (OK);
  134. }
  135. int
  136. soo_select (so, wakeupNode)
  137.     struct socket *so;
  138.     SEL_WAKEUP_NODE *wakeupNode;
  139.     {
  140. #ifdef WV_INSTRUMENTATION
  141. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  142.     WV_NET_MARKER_1 (NET_AUX_EVENT, WV_NET_INFO, 24, 2,
  143.                      WV_NETEVENT_SOCKSELECT_START, so->so_fd)
  144. #endif  /* INCLUDE_WVNET */
  145. #endif
  146.     switch (selWakeupType (wakeupNode))
  147. {
  148. case SELREAD:
  149.     sbselqueue(so, &so->so_rcv, wakeupNode);
  150.     if (soreadable(so))
  151. {
  152. selWakeup (wakeupNode);
  153. return (1);
  154. }
  155.     break;
  156. case SELWRITE:
  157.     sbselqueue(so, &so->so_snd, wakeupNode);
  158.     if (sowriteable(so))
  159. {
  160. selWakeup (wakeupNode);
  161. return (1);
  162. }
  163.     break;
  164. default:
  165.     return (ERROR);
  166. }
  167.     return (0);
  168.     }
  169. int
  170. soo_unselect (so, wakeupNode)
  171.     struct socket *so;
  172.     SEL_WAKEUP_NODE *wakeupNode;
  173.     {
  174. #ifdef WV_INSTRUMENTATION
  175. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  176.     WV_NET_MARKER_1 (NET_AUX_EVENT, WV_NET_INFO, 25, 3,
  177.                      WV_NETEVENT_SOCKUNSELECT_START, so->so_fd)
  178. #endif  /* INCLUDE_WVNET */
  179. #endif
  180.     switch (selWakeupType (wakeupNode))
  181. {
  182. case SELREAD:
  183.     sbseldequeue(so, &so->so_rcv, wakeupNode);
  184.     break;
  185. case SELWRITE:
  186.     sbseldequeue(so, &so->so_snd, wakeupNode);
  187.     break;
  188. default:
  189.     return (ERROR);
  190. }
  191.     return (0);
  192.     }