home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / gdb-4.9 / gdb / 29k-share / udi / udr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-12  |  11.2 KB  |  426 lines

  1. /******************************************************************************
  2. * Copyright 1991 Advanced Micro Devices, Inc.
  3. * This software is the property of Advanced Micro Devices, Inc  (AMD)  which
  4. * specifically  grants the user the right to modify, use and distribute this
  5. * software provided this notice is not removed or altered.  All other rights
  6. * are reserved by AMD.
  7. *
  8. * AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS
  9. * SOFTWARE.  IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL
  10. * DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR
  11. * USE OF THIS SOFTWARE.
  12. *
  13. * So that all may benefit from your experience, please report  any  problems
  14. * or  suggestions about this software to the 29K Technical Support Center at
  15. * 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131  in  the  UK,  or
  16. * 0031-11-1129 in Japan, toll free.  The direct dial number is 512-462-4118.
  17. *
  18. * Advanced Micro Devices, Inc.
  19. * 29K Support Products
  20. * Mail Stop 573
  21. * 5900 E. Ben White Blvd.
  22. * Austin, TX 78741
  23. * 800-292-9263
  24. *****************************************************************************
  25. */
  26. static char udr_c[]="@(#)udr.c    2.8  Daniel Mann";
  27. static char udr_c_AMD[]="@(#)udr.c    2.3, AMD";
  28. /* 
  29. *    This module supports sending and receiving
  30. *    data objects over a socket conection.
  31. *    All data is serialised into a character stream,
  32. *    and de-serialised back into the approproiate objects.
  33. ********************************************************************** HISTORY
  34. */
  35. #include <stdio.h>
  36. #include <sys/fcntl.h>
  37. #include <sys/types.h>
  38. #include <sys/socket.h>
  39. #include "udiproc.h"
  40. #include "udisoc.h"
  41.  
  42. extern    int    errno;
  43. extern    char*    malloc();
  44.  
  45. /* local type decs. and macro defs. not in a .h  file ************* MACRO/TYPE
  46. */
  47.  
  48. /* global dec/defs. which are not in a .h   file ************* EXPORT DEC/DEFS
  49. */
  50. int        udr_errno;        /* error occurs during UDR service */
  51.  
  52. /* local dec/defs. which are not in a .h   file *************** LOCAL DEC/DEFS
  53. */
  54.  
  55. /****************************************************************** UDR_CREATE
  56. * Build UDR structure for character stream processing.
  57. */
  58. int udr_create(udrs, sd, size)
  59. UDR*    udrs;
  60. int    sd;
  61. int    size;
  62. {
  63.     udrs->sd = sd;
  64.     if(!udrs->buff) udrs->buff = malloc(size);
  65.     udrs->getbytes = udrs->buff;    /* set the buffer to the start */
  66.     udrs->putbytes = udrs->buff;
  67.     udrs->putend = udrs->buff;
  68.     udrs->udr_op = -1;            /* don't know the direction */
  69.     udrs->previous_op = -1;        /* don't know the direction */
  70.     udrs->bufsize = size;
  71.     return 0;
  72. }
  73.  
  74. /******************************************************************** UDR_FREE
  75. * Free USR structure and close socket.
  76. */
  77. int udr_free(udrs)
  78. UDR*    udrs;
  79. {
  80.     close(udrs->sd);
  81.     free(udrs->buff);
  82.     return 0;
  83. }
  84.  
  85. /****************************************************************** UDR_SIGNAL
  86. * Send a signal to the process at the other end of the socket,
  87. * indicating that it should expect to recieve a new message shortly.
  88. */
  89. int udr_signal(udrs)
  90. UDR*    udrs;
  91. {
  92.     if(send(udrs->sd, "I", 1, MSG_OOB) == -1)
  93.     {    perror("ERROR, udr_signal(), send(...MSG_OOB)");
  94.     udr_errno =  UDIErrorIPCInternal;
  95.         return -1;        /* return error code */
  96.     }
  97.     return 0;
  98. }
  99.  
  100. /***************************************************************** UDR_SENDNOW
  101. * used to flush the current character stream buffer to
  102. * the associated socket.  */
  103. int udr_sendnow(udrs)
  104. UDR*    udrs;
  105. {
  106.     int size = (UDIUInt32)(udrs->putend) - (UDIUInt32)(udrs->buff);
  107.     if(udrs->previous_op == 0)
  108.     {   udr_errno =  UDIErrorIPCInternal;
  109.     return -1;
  110.     }
  111.     udrs->putbytes = udrs->buff;
  112.     udrs->putend = udrs->buff;
  113.     if (write(udrs->sd, udrs->buff, size) == -1)
  114.     {    perror("ERROR, udr_sendnow(), write() call: ");
  115.     udr_errno =  UDIErrorIPCInternal;
  116.         return -1;        /* return error code */
  117.     }
  118.     return 0;
  119. }
  120.  
  121. /******************************************************************** UDR_WORK
  122. * Function to send or recieve data from the buffers supporting
  123. * socket communication. The buffer contains serialised objects
  124. * sent/recieved over a socket connection.
  125. */
  126. int udr_work(udrs, object_p, size)
  127. UDR*    udrs;
  128. void*    object_p;
  129. int    size;
  130. {
  131.     int        cnt, remain;
  132.  
  133.     if(udrs->udr_op != udrs->previous_op)
  134.     {    if(udrs->previous_op == 0)
  135.     {   udr_errno =  UDIErrorIPCInternal;
  136.         return -1;
  137.         }
  138.     udrs->previous_op= udrs->udr_op;
  139.     udrs->putbytes = udrs->buff;
  140.     udrs->getbytes = udrs->buff;
  141.     }
  142.  
  143.     if(udrs->udr_op == UDR_ENCODE)
  144.     {            /* write data into character stream buffer */
  145.         if( (UDIUInt32)(udrs->putbytes) + size >
  146.         (UDIUInt32)(udrs->buff) + (UDIUInt32)(udrs->bufsize) )
  147.     {   udr_errno =  UDIErrorIPCInternal;
  148.         return -1;
  149.         }
  150.     bcopy((char*)object_p, udrs->putbytes, size);
  151.         udrs->putbytes += size;
  152.         if(udrs->putbytes > udrs->putend) udrs->putend = udrs->putbytes;
  153.     }
  154.     else if(udrs->udr_op == UDR_DECODE)
  155.     {
  156.         if( (UDIUInt32)(udrs->putbytes)-(UDIUInt32)(udrs->getbytes) < size )
  157.     {         /* need more data in character stream buffer */
  158.                remain = (UDIUInt32)(udrs->bufsize) -
  159.         ( (UDIUInt32)(udrs->putbytes)-(UDIUInt32)(udrs->buff) );
  160.                if( ((UDIUInt32)(udrs->bufsize) + (UDIUInt32)(udrs->buff)
  161.         - (UDIUInt32)(udrs->getbytes)) < size)
  162.         {   udr_errno =  UDIErrorIPCInternal;
  163.             return -1;
  164.             }
  165.             cnt = read(udrs->sd, (char*)udrs->putbytes, remain);
  166.         if(cnt == -1) perror("ERROR udr_work(),  read() failure: ");
  167.         udrs->putbytes += cnt;
  168.             if( (UDIUInt32)(udrs->putbytes)-(UDIUInt32)(udrs->getbytes) < size )
  169.         {    udr_errno =  UDIErrorIPCInternal;
  170.             return -1;        /* return error code */
  171.             }
  172.         }        /* read data from character stream buffer */
  173.     bcopy(udrs->getbytes, (char*)object_p,  size);
  174.         udrs->getbytes += size;
  175.     }
  176.     else
  177.     {    udr_errno =  UDIErrorIPCInternal;
  178.     return -1;
  179.     }
  180.     return 0;
  181. }
  182.  
  183. /************************************************************* UDR_UDIResource
  184. */
  185. int udr_UDIResource(udrs, object_p)
  186. UDR*    udrs;
  187. UDIResource*    object_p;
  188. {
  189.     int    retval;
  190.  
  191.     retval = udr_CPUSpace(udrs, &object_p->Space);
  192.     retval = retval |  udr_CPUOffset(udrs, &object_p->Offset);
  193.     return retval;
  194. }
  195.  
  196. /**************************************************************** UDR_UDIRange
  197. */
  198. int udr_UDIRange(udrs, object_p)
  199. UDR*        udrs;
  200. UDIRange*    object_p;
  201. {
  202.     int    retval;
  203.  
  204.     retval = udr_CPUOffset(udrs, &object_p->Low);
  205.     retval = retval | udr_CPUOffset(udrs, &object_p->High);
  206.     return retval;
  207. }
  208.  
  209. /********************************************************** UDR_UDIMemoryRange
  210. */
  211. int udr_UDIMemoryRange(udrs, object_p)
  212. UDR*        udrs;
  213. UDIMemoryRange*    object_p;
  214. {
  215.     int    retval;
  216.  
  217.     retval = udr_CPUSpace(udrs, &object_p->Space);
  218.     retval = retval | udr_CPUOffset(udrs, &object_p->Offset);
  219.     retval = retval | udr_CPUSizeT(udrs, &object_p->Size);
  220.     return retval;
  221. }
  222.  
  223. /****************************************************************** UDR_string
  224. */
  225. int udr_string(udrs, sp)
  226. UDR*    udrs;
  227. char*    sp;
  228. {
  229.     int    len, retval;
  230.  
  231.     if(udrs->udr_op == UDR_ENCODE)
  232.     {
  233.     if(sp)
  234.         {   len = strlen(sp) + 1;
  235.             retval = udr_UDIInt32(udrs, &len);
  236.             retval = retval | udr_work(udrs, sp, len);
  237.     }
  238.     else    /* deal with NULL pointer */
  239.     {   len = 0;
  240.             retval = udr_UDIInt32(udrs, &len);
  241.     }
  242.     }
  243.     else if(udrs->udr_op == UDR_DECODE)
  244.     {
  245.         retval = udr_UDIInt32(udrs, &len);
  246.     if(len)
  247.             retval = retval | udr_work(udrs, sp, len);
  248.     else    *sp = '\0';            /* terminate string */
  249.     }
  250.     else
  251.     {    udr_errno =  UDIErrorIPCInternal;
  252.     return -1;
  253.     }
  254.     return retval;
  255. }
  256.  
  257. /******************************************************************* UDR_BYTES
  258. */
  259. int udr_bytes(udrs, ptr, len)
  260. UDR*    udrs;
  261. char*    ptr;
  262. int    len;
  263. {
  264.     return udr_work(udrs, ptr, len);
  265. }
  266.  
  267. /********************************************************************* UDR_INT
  268. */
  269. int udr_int(udrs, int_p)
  270. UDR*    udrs;
  271. int*    int_p;
  272. {
  273.     int ret_val;
  274.     UDIInt32  udr_obj;            /* object of know size */
  275.  
  276.     if(udrs->udr_op == UDR_ENCODE)
  277.     {
  278.         udr_obj = *int_p;        /* copy into know object size */
  279.         return udr_UDIInt32(udrs, &udr_obj);
  280.     }
  281.     else if(udrs->udr_op == UDR_DECODE)
  282.     {
  283.         ret_val = udr_UDIInt32(udrs, &udr_obj);    /* get object of known size */
  284.     *int_p = udr_obj;
  285.     return ret_val;
  286.     }
  287.     else
  288.     {    udr_errno =  UDIErrorIPCInternal;
  289.     return -1;
  290.     }
  291. }
  292.  
  293. /****************************************************************** UDR_INLINE
  294. */
  295. char* udr_inline(udrs, size)
  296. UDR*    udrs;
  297. int    size;
  298. {
  299.     if(udrs->udr_op != udrs->previous_op)
  300.     {    if(udrs->previous_op == 0)
  301.     {   udr_errno =  UDIErrorIPCInternal;
  302.         return 0;
  303.         }
  304.         udrs->previous_op= udrs->udr_op;
  305.     udrs->putbytes = udrs->buff;
  306.     udrs->getbytes = udrs->buff;
  307.     }
  308.     if(udrs->udr_op == UDR_ENCODE)
  309.     {
  310.         if(udrs->putbytes + size > udrs->bufsize + udrs->buff)
  311.        return 0;
  312.         udrs->putbytes += size;
  313.     return udrs->putbytes - size;
  314.     }
  315.     else if(udrs->udr_op == UDR_DECODE)
  316.     {
  317.         if(udrs->getbytes + size > udrs->bufsize + udrs->buff)
  318.        return 0;
  319.         udrs->getbytes += size;
  320.     return udrs->getbytes - size;
  321.     }
  322.     else
  323.     {    udr_errno =  UDIErrorIPCInternal;
  324.     return 0;
  325.     }
  326. }
  327.  
  328. /****************************************************************** UDR_GETPOS
  329. */
  330. char*    udr_getpos(udrs)
  331. UDR*    udrs;
  332. {
  333.     if(udrs->udr_op == UDR_ENCODE)
  334.     {
  335.     return udrs->putbytes;
  336.     }
  337.     else if(udrs->udr_op == UDR_DECODE)
  338.     {
  339.     return udrs->getbytes;
  340.     }
  341.     else
  342.     {    udr_errno =  UDIErrorIPCInternal;
  343.     return 0;
  344.     }
  345. }
  346.  
  347. /****************************************************************** UDR_SETPOS
  348. */
  349. int    udr_setpos(udrs, pos)
  350. UDR*    udrs;
  351. char*    pos;
  352. {
  353.     if( ((UDIUInt32)pos > (UDIUInt32)(udrs->buff) + (UDIUInt32)(udrs->bufsize))
  354.      || ((UDIUInt32)pos < (UDIUInt32)(udrs->buff) ) )
  355.     {    udr_errno =  UDIErrorIPCInternal;
  356.     return 0;
  357.     }
  358.     if(udrs->udr_op == UDR_ENCODE)
  359.     {
  360.     udrs->putbytes = pos;
  361.     return 1;
  362.     }
  363.     else if(udrs->udr_op == UDR_DECODE)
  364.     {
  365.     udrs->getbytes = pos;
  366.     return 1;
  367.     }
  368.     else
  369.     {    udr_errno =  UDIErrorIPCInternal;
  370.     return 0;
  371.     }
  372. }
  373.  
  374. /***************************************************************** UDR_READNOW
  375. * Try and ensure "size" bytes are available in the
  376. * receive buffer character stream.
  377. */
  378. int    udr_readnow(udrs, size)
  379. UDR*    udrs;
  380. int    size;
  381. {
  382.     int    cnt, remain;
  383.  
  384.     if(udrs->udr_op == UDR_ENCODE)
  385.     {
  386.     udr_errno =  UDIErrorIPCInternal;
  387.     return -1;
  388.     }
  389.     else if(udrs->udr_op == UDR_DECODE)
  390.     {
  391.         if( (UDIUInt32)(udrs->putbytes)-(UDIUInt32)(udrs->getbytes) < size )
  392.     {         /* need more data in character stream buffer */
  393.                remain = (UDIUInt32)(udrs->bufsize) -
  394.         ( (UDIUInt32)(udrs->putbytes)-(UDIUInt32)(udrs->buff) );
  395.             cnt = read(udrs->sd, (char*)udrs->putbytes, remain);
  396.         if(cnt == -1) perror("ERROR udr_work(),  read() failure: ");
  397.         udrs->putbytes += cnt;
  398.             if( (UDIUInt32)(udrs->putbytes)-(UDIUInt32)(udrs->getbytes) < size )
  399.             {  fprintf(stderr,"ERROR, udr_readnow() too few bytes in stream\n");
  400.            return -1;        /* return error code */
  401.             }
  402.         }        
  403.     }
  404.     else
  405.     {    udr_errno =  UDIErrorIPCInternal;
  406.     return -1;
  407.     }
  408.     return 0;
  409. }
  410.  
  411. /******************************************************************* UDR_ALIGN
  412. */
  413. int udr_align(udrs, size)
  414. UDR*    udrs;
  415. int    size;
  416. {
  417.     char*   align;
  418.     int        offset;    
  419.  
  420.     align = udr_getpos(udrs);
  421.     offset = size - ((int)align & (size -1));
  422.     offset = offset & (size -1);
  423.     if(offset) udr_setpos(udrs, align + offset);
  424. }
  425.