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

VxWorks

开发平台:

C/C++

  1. /* wvSockUploadPathLib.c -  socket upload path library */
  2. /* Copyright 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 02i,28aug98,dgp  FCS man page edit
  7. 02h,06aug98,cth  added ability to create path with host name
  8. 02g,08may98,dgp  clean up man pages for WV 2.0 beta release
  9. 02f,15apr98,cth  removed errno set
  10. 02e,20mar98,cth  removed debug print statements
  11. 02d,27jan98,cth  removed oob error indications, removed sockUploadPathError,
  12.  changed SOSENDBUFSIZE to sockUpPathSendBufSize
  13. 02c,19dec97,cth  renamed again from wvSockUploadPath.c to wvSockUploadPathLib.c,
  14.                  added sockUploadPathLibInit, updated include files
  15. 02b,16nov97,cth  renamed again from sockUploadPath.c to wvSockUploadPath.c
  16.                  changed include sockUploadPathP.h to wvSockUploadPathP.h
  17. 02a,16nov97,cth  rewritten for WV2.0
  18.  renamed file to sockUploadPath.c from evtSockLib.c
  19. 01g,21aug97,cth  reverted functionality to 01e, TSFS support now in
  20.  evtTsfsSockLib.c
  21. 01f,18aug97,cth  added support for upload through TSFS
  22. 01e,31jul97,nps  WindView 2.0 - evtSockInit now passes fd to event rBuff.
  23. 01d,22feb94,smb  corrected Copyright date (SPR #2910)
  24. 01c,21jan94,maf  shut off event logging when write() to event socket fails
  25.    (SPR #2805).
  26.  handle case of write() writing fewer bytes than requested
  27.    in evtSockDataTransfer().
  28.                  other minor tweaks.
  29. 01b,18jan94,maf  evtSockError() now closes event stream socket (part of fix
  30.    for SPR #2800).
  31. 01a,10dec93,smb  created.
  32. */
  33. /*
  34. DESCRIPTION
  35. This file contains routines that are used by wvLib to pass event data from
  36. the target buffers to the host.  This particular event-upload path opens
  37. a normal network socket connected with the WindView host process to 
  38. transfer the data.
  39. INCLUDE FILES:
  40. SEE ALSO:  wvTsfsUploadPathLib, wvFileUploadPathLib
  41. */
  42. #include "vxWorks.h"
  43. #include "fcntl.h"
  44. #include "stdlib.h"
  45. #include "in.h"
  46. #include "inetLib.h"
  47. #include "ioLib.h"
  48. #include "logLib.h"
  49. #include "nfsLib.h"
  50. #include "socket.h"
  51. #include "sockLib.h"
  52. #include "hostLib.h"
  53. #include "string.h"
  54. #include "sys/socket.h"
  55. #include "private/wvUploadPathP.h"
  56. #include "private/wvSockUploadPathLibP.h"
  57. typedef struct sockUploadPath   /* SOCK_UPLOAD_DESC */
  58.     {
  59.     UPLOAD_DESC path; /* struct must begin with this descriptor */
  60.     int sockFd; /* private fd for each upload path */
  61.     } SOCK_UPLOAD_DESC;
  62. /* globals */
  63. int sockUpPathSendBufSize = (64 * 1024 >> 1);
  64. /*******************************************************************************
  65. *
  66. * sockUploadPathLibInit - initialize wvSockUploadPathLib library (Windview)
  67. *
  68. * This routine initializes wvSockUploadPathLib by pulling in the
  69. * routines in this file for use with WindView.  It is called during system
  70. * configuration from usrWindview.c.
  71. *
  72. * RETURN: OK.
  73. *
  74. */
  75. STATUS sockUploadPathLibInit (void)
  76.     {
  77.     return OK;
  78.     }
  79. /*******************************************************************************
  80. *
  81. * sockUploadPathCreate - establish an upload path to the host using a socket (Windview)
  82. *
  83. * This routine initializes the TCP/IP connection to the host process that 
  84. * receives uploaded events.  It can be retried if the connection attempt fails.
  85. *
  86. * RETURNS: The UPLOAD_ID, or NULL if the connection cannot be completed or 
  87. * memory for the ID is not available.
  88. *
  89. * SEE ALSO: sockUploadPathClose()
  90. */
  91. UPLOAD_ID sockUploadPathCreate 
  92.     (
  93.     char *ipAddress,     /* server's hostname or IP address in .-notation */
  94.     short port     /* port number to bind to */
  95.     )
  96.     {
  97.     SOCK_UPLOAD_DESC   *pSockUploadDesc; /* this socket's descriptor */
  98.     struct sockaddr_in sin; /* address of server */
  99.     /* Allocate the upload path's descriptor. */
  100.     if ((pSockUploadDesc = (SOCK_UPLOAD_DESC *)
  101.                            malloc (sizeof (SOCK_UPLOAD_DESC))) == NULL)
  102.         {
  103.         logMsg ("sockUploadPathCreate: failed to allocate upload descriptor.n",
  104.                 0, 0, 0, 0, 0, 0);
  105.         return (NULL);
  106.         }
  107.     /* Open the upload socket. */
  108.     if ((pSockUploadDesc->sockFd = socket (AF_INET, SOCK_STREAM, 
  109.     IPPROTO_TCP)) == ERROR)
  110.         {
  111.         logMsg ("sockUploadPathCreate: failed to open socket.n",
  112.                 0, 0, 0, 0, 0, 0);
  113.         return (NULL);
  114.         }
  115.     /* Increase the socket's send-buffer size. */
  116.     if (setsockopt (pSockUploadDesc->sockFd, SOL_SOCKET, 
  117.                     SO_SNDBUF, (char *) & sockUpPathSendBufSize, 
  118.                     sizeof (sockUpPathSendBufSize)) == ERROR)
  119.         {
  120.         logMsg ("sockUploadPathCreate: setsockopt failedn",
  121.                 0, 0, 0, 0, 0, 0);
  122. close (pSockUploadDesc->sockFd);
  123.         return (NULL);
  124.         }
  125.     /* Fill in the server's address before connection. */
  126.     bzero ((char *) &sin, sizeof (sin));
  127.     sin.sin_family      = AF_INET;
  128.     sin.sin_port        = htons (port);
  129.     if ((sin.sin_addr.s_addr = hostGetByName (ipAddress)) == ERROR &&
  130.         (sin.sin_addr.s_addr = inet_addr (ipAddress)) == ERROR)
  131.         {
  132.         logMsg ("sockUploadPathCreate: failed to get inet addr for (%s)n",
  133.                 (int) ipAddress, 0, 0, 0, 0, 0);
  134. close (pSockUploadDesc->sockFd);
  135.         return (NULL);
  136. }
  137.     /* Connect to host (server). */
  138.     if (connect (pSockUploadDesc->sockFd, (struct sockaddr *)&sin, 
  139.                  sizeof (sin)) == ERROR)
  140.         {
  141.         logMsg ("sockUploadPathCreate: connect failedn",
  142.                 0, 0, 0, 0, 0, 0);
  143. close (pSockUploadDesc->sockFd);
  144.         return (NULL);
  145.         }
  146.     /* Fill in the socket upload routines so the uploader can access them. */
  147.     pSockUploadDesc->path.writeRtn = (FUNCPTR) sockUploadPathWrite;
  148.     pSockUploadDesc->path.errorRtn = (FUNCPTR) sockUploadPathClose;
  149.     /* Cast the SOCK_UPLOAD_DESC to a generic UPLOAD_DESC before returning. */
  150.     return ((UPLOAD_ID) pSockUploadDesc);
  151.     }
  152. /*******************************************************************************
  153. *
  154. * sockUploadPathClose - close the socket upload path (Windview)
  155. *
  156. * This routine closes the socket connection to the event
  157. * receiver on the host.
  158. *
  159. * RETURNS: N/A
  160. *
  161. * SEE ALSO: sockUploadPathCreate()
  162. */
  163. void sockUploadPathClose 
  164.     (
  165.     UPLOAD_ID upId /* generic upload-path descriptor */
  166.     )
  167.     {
  168.     SOCK_UPLOAD_DESC *pSockUploadDesc; /* upId cast to see private data */
  169.     if (upId == NULL)
  170.         return;
  171.     pSockUploadDesc = (SOCK_UPLOAD_DESC *) upId;
  172.     close (pSockUploadDesc->sockFd);
  173.     free (pSockUploadDesc);
  174.     }
  175. /*******************************************************************************
  176. *
  177. * sockUploadPathWrite - write to the socket upload path (Windview)
  178. *
  179. * This routine writes <size> bytes of data beginning at <pStart> to the upload
  180. * path between the target and the event receiver on the host.
  181. *
  182. * RETURNS: The number of bytes written, or ERROR.
  183. *
  184. * SEE ALSO: sockUploadPathCreate()
  185. */
  186. int sockUploadPathWrite
  187.     (
  188.     UPLOAD_ID   upId,                   /* generic upload-path descriptor */
  189.     char *      pStart,                 /* address of data to write */
  190.     size_t      size                    /* number of bytes of data at pStart */
  191.     )
  192.     {
  193.     SOCK_UPLOAD_DESC  *pSockUploadDesc; /* upId cast to see private data */
  194.     if (upId == NULL)
  195.         return (ERROR);
  196.     /* Cast upId to a SOCK_UPLOAD_DESC for access to private data. */
  197.     pSockUploadDesc = (SOCK_UPLOAD_DESC *)upId;
  198.     return (write (pSockUploadDesc->sockFd, pStart, size));
  199.     }