home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / mint / netlib / lib / recvfrom.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-27  |  1.5 KB  |  79 lines

  1. /*
  2.  *    recvfrom() emulation for MiNT-Net, (w) '93, kay roemer
  3.  */
  4.  
  5. #include "socklib.h"
  6. #ifdef KERNEL
  7. #undef UNX2DOS
  8. #include "kerbind.h"
  9. #else
  10. #include <mintbind.h>
  11. #endif
  12. #include "sys/socket.h"
  13. #include "mintsock.h"
  14.  
  15. #ifdef UNX2DOS
  16. #include "sys/un.h"
  17. #define UN_OFFSET    ((short)((struct sockaddr_un *)0)->sun_path)
  18. #endif
  19.  
  20. #ifndef KERNEL
  21. extern int errno;
  22. #endif
  23.  
  24. int
  25. recvfrom (fd, buf, buflen, flags, addr, addrlen)
  26.     int fd;
  27.     void *buf;
  28.     _SIZE_T buflen;
  29.     int flags;
  30.     struct sockaddr *addr;
  31.     _SIZE_T *addrlen;
  32. {
  33.     struct recvfrom_cmd cmd;
  34.     short addrlen16;
  35.     int r;
  36. #ifdef UNX2DOS
  37.     _SIZE_T oaddrlen = addrlen ? *addrlen : 0;
  38. #endif
  39.     
  40.     if (addrlen) addrlen16 = (short)*addrlen;
  41.     
  42.     cmd.cmd =    RECVFROM_CMD;
  43.     cmd.buf =    buf;
  44.     cmd.buflen =    buflen;
  45.     cmd.flags =    flags;
  46.     cmd.addr =    addr;
  47.     cmd.addrlen =    &addrlen16;
  48.  
  49. #ifdef KERNEL
  50.     r = f_cntl (fd, (long)&cmd, SOCKETCALL);
  51. #else
  52.     r = Fcntl (fd, (long)&cmd, SOCKETCALL);
  53. #endif
  54.     if (addrlen) *addrlen = addrlen16;
  55.     
  56. #ifdef UNX2DOS
  57.     if (addr && addrlen && addr->sa_family == AF_UNIX && r >= 0) {
  58.         struct sockaddr_un *unp = (struct sockaddr_un *)addr;
  59.         char name[sizeof (unp->sun_path)];
  60.         extern int _dos2unx (const char *, char *);
  61.         extern int _sncpy (char *, const char *, _SIZE_T);
  62.         
  63.         if (addrlen16 > UN_OFFSET) {
  64.             _dos2unx (unp->sun_path, name);
  65.             *addrlen = UN_OFFSET + _sncpy (unp->sun_path, name,
  66.                 oaddrlen - UN_OFFSET);
  67.         }
  68.     }
  69. #endif
  70.  
  71. #ifndef KERNEL
  72.     if (r < 0) {
  73.         errno = -r;
  74.         return -1;
  75.     }
  76. #endif
  77.     return r;
  78. }
  79.