home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.7z / ftp.whtech.com / emulators / v9t9 / linux / sources / V9t9 / source / Modules / Unix / clisrv.c < prev    next >
Encoding:
C/C++ Source or Header  |  2006-10-19  |  1.8 KB  |  80 lines

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <limits.h>
  4. #include <errno.h>
  5. #include <fcntl.h>
  6.  
  7. #include "16bit.h"
  8. #include "oss_error.h"
  9. #include "clisrv.h"
  10.  
  11. #define MAXPIPE    _POSIX_PIPE_BUF
  12.  
  13. int
  14. send_packet(int handle, void *packet, int size)
  15. {
  16.     int         ptr;
  17.  
  18. //  log("send_packet: [%d]  size=%d\n", handle, size);
  19.     ptr = 0;
  20.     while (ptr < size) {
  21.         int         sent = 0;
  22.         int         send =
  23.  
  24.             size - ptr < MAXPIPE / 2 ? size - ptr : MAXPIPE / 2;
  25.  
  26.         if (fcntl(handle, F_GETFL) == -1 && errno == EBADF) {
  27.             error("pipe was closed");
  28.             return 0;
  29.         }
  30. //      log("sending %d of %d bytes...\n", send, size);
  31.         sent = write(handle, ((u8 *) packet + ptr), send);
  32.         if (sent < send) {
  33.             if (errno && errno != EINTR) {
  34.                 error("packet write (%d/%d bytes): %s",
  35.                       ptr, size, strerror(errno));
  36.                 return 0;
  37.             }
  38. //          else
  39. //              error("unexpected short write of %d / %d bytes [%s]\n",
  40. //                   sent, send, strerror(errno));
  41.         }
  42.         if (sent > 0)
  43.             ptr += sent;
  44.     }
  45.     return 1;
  46. }
  47.  
  48. int
  49. recv_packet(int handle, void *data, int size)
  50. {
  51.     int         ptr;
  52.  
  53. //  log("recv_packet: [%d]  size=%d\n", handle, size);
  54.     ptr = 0;
  55.     while (ptr < size) {
  56.         int         red = 0;
  57.         int         blk = size - ptr < MAXPIPE / 2 ? size - ptr : MAXPIPE / 2;
  58.  
  59.         if (fcntl(handle, F_GETFL) == -1 && errno == EBADF) {
  60.             error("pipe was closed");
  61.             return 0;
  62.         }
  63. //      log("awaiting %d of %d bytes...\n", blk, size);
  64.         red = read(handle, ((u8 *) data + ptr), blk);
  65.         if (red < blk) {
  66.             if (errno && errno != EINTR) {
  67.                 error("packet read (%d/%d bytes): %s",
  68.                       ptr, size, strerror(errno));
  69.                 return 0;
  70.             }
  71. //          else
  72. //              error("unexpected short read of %d / %d bytes [%s]\n", 
  73. //                  red, blk, strerror(errno));
  74.         }
  75.         if (red > 0)
  76.             ptr += red;
  77.     }
  78.     return 1;
  79. }
  80.