home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / hamradio / s920603.zip / SOCKUSER.C < prev    next >
C/C++ Source or Header  |  1992-05-02  |  3KB  |  99 lines

  1. /* Higher level user subroutines built on top of the socket primitives
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #ifdef    ANSIPROTO
  6. #include <stdarg.h>
  7. #endif
  8. #include <errno.h>
  9. #include "mbuf.h"
  10. #include "proc.h"
  11. #include "socket.h"
  12. #include "usock.h"
  13. #include "session.h"
  14. #include "nr4.h"
  15.  
  16.  
  17. /* Higher-level receive routine, intended for connection-oriented sockets.
  18.  * Can be used with datagram sockets, although the sender id is lost.
  19.  */
  20. int
  21. recv(s,buf,len,flags)
  22. int s;        /* Socket index */
  23. char *buf;    /* User buffer */
  24. int len;    /* Max length to receive */
  25. int flags;    /* Unused; will eventually select oob data, etc */
  26. {
  27.     struct mbuf *bp;
  28.     int cnt;
  29.  
  30.     if(len == 0)
  31.         return 0;    /* Otherwise would be interp as "all" */
  32.  
  33.     cnt = recv_mbuf(s,&bp,flags,NULLCHAR,(int *)NULL);
  34.     if(cnt > 0){
  35.         cnt = min(cnt,len);
  36.         pullup(&bp,buf,(int16)cnt);
  37.         free_p(bp);
  38.     }
  39.     return cnt;
  40. }
  41. /* Higher level receive routine, intended for datagram sockets. Can also
  42.  * be used for connection-oriented sockets, although from and fromlen are
  43.  * ignored.
  44.  */
  45. int
  46. recvfrom(s,buf,len,flags,from,fromlen)
  47. int s;        /* Socket index */
  48. char *buf;    /* User buffer */
  49. int len;    /* Maximum length */
  50. int flags;    /* Unused; will eventually select oob data, etc */
  51. char *from;    /* Source address, only for datagrams */
  52. int *fromlen;    /* Length of source address */
  53. {
  54.     struct mbuf *bp;
  55.     register int cnt;
  56.  
  57.     cnt = recv_mbuf(s,&bp,flags,from,fromlen);
  58.     if(cnt > 0){
  59.         cnt = min(cnt,len);
  60.         pullup(&bp,buf,(int16)cnt);
  61.         free_p(bp);
  62.     }
  63.     return cnt;
  64. }
  65. /* High level send routine */
  66. int
  67. send(s,buf,len,flags)
  68. int s;        /* Socket index */
  69. char *buf;    /* User buffer */
  70. int len;    /* Length of buffer */
  71. int flags;    /* Unused; will eventually select oob data, etc */
  72. {
  73.     register struct mbuf *bp;
  74.     char sock[MAXSOCKSIZE];
  75.     int i = MAXSOCKSIZE;
  76.  
  77.     if(getpeername(s,sock,&i) == -1)
  78.         return -1;
  79.     bp = qdata(buf,(int16)len);
  80.     return send_mbuf(s,bp,flags,sock,i);
  81. }
  82. /* High level send routine, intended for datagram sockets. Can be used on
  83.  * connection-oriented sockets, but "to" and "tolen" are ignored.
  84.  */
  85. int
  86. sendto(s,buf,len,flags,to,tolen)
  87. int s;        /* Socket index */
  88. char *buf;    /* User buffer */
  89. int len;    /* Length of buffer */
  90. int flags;    /* Unused; will eventually select oob data, etc */
  91. char *to;    /* Destination, only for datagrams */
  92. int tolen;    /* Length of destination */
  93. {
  94.     register struct mbuf *bp;
  95.  
  96.     bp = qdata(buf,(int16)len);
  97.     return send_mbuf(s,bp,flags,to,tolen);
  98. }
  99.