home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume34 / fsp / part03 / udp_io.c < prev   
Encoding:
C/C++ Source or Header  |  1992-12-18  |  3.9 KB  |  160 lines

  1.     /*********************************************************************\
  2.     *  Copyright (c) 1991 by Wen-King Su (wen-king@vlsi.cs.caltech.edu)   *
  3.     *                                                                     *
  4.     *  You may copy or modify this file in any manner you wish, provided  *
  5.     *  that this notice is always included, and that you hold the author  *
  6.     *  harmless for any loss or damage resulting from the installation or *
  7.     *  use of this software.                                              *
  8.     \*********************************************************************/
  9.  
  10. #include "common_def.h"
  11.  
  12. static struct sockaddr_in INET_ZERO = { AF_INET };
  13.  
  14. extern int errno;
  15. #define DSIZE (sizeof(int)*8)
  16. #define SAVE(A) { int sav; sav = errno; A; errno = sav; }
  17.  
  18. #ifndef EXOS_IPC
  19.  
  20. #include <netdb.h>
  21.  
  22. extern unsigned long inet_addr();
  23.  
  24. _x_udp(port)
  25.     int *port;
  26. {
  27.     int f, len, zz;
  28.     struct sockaddr_in me ;
  29.     struct sockaddr_in sin;
  30.  
  31.     me = sin = INET_ZERO;
  32.  
  33.     me.sin_port = htons((unsigned short) *port);
  34.     me.sin_family = AF_INET;
  35.  
  36.     if((f=socket(AF_INET,SOCK_DGRAM,0)) == -1) return(-1);
  37.  
  38.     if( setsockopt(f,SOL_SOCKET,SO_REUSEADDR,(char *)&zz,sizeof(zz)) < 0 ||
  39.         bind(f,(struct sockaddr *) &me,(len = sizeof(me))) < 0 ||
  40.         getsockname(f,(char *)&sin,&len) < 0)
  41.                                 { SAVE(((void) close(f))); return(-1); }
  42.     if(!*port) *port = ntohs((unsigned short) sin.sin_port); return(f);
  43. }      
  44.  
  45. _x_adr(host,port,his)
  46.     struct sockaddr_in *his;
  47.     char *host;
  48.     int port;
  49. {
  50.     char myhost[128];
  51.     struct hostent *H;
  52.     int    i;
  53.     char *s, *d;
  54.  
  55.     *his = INET_ZERO;
  56.     if(!host) (void) gethostname(host = myhost,sizeof(myhost));
  57.  
  58.     if((his->sin_addr.s_addr = inet_addr(host)) != -1)
  59.     {   his->sin_family = AF_INET;
  60.     } else
  61.     if(H = gethostbyname(host))
  62.     {   for(s = (char *)H->h_addr, d = (char *)&his->sin_addr, i = H->h_length;
  63.                         i--; *d++ = *s++);
  64.         his->sin_family = H->h_addrtype;
  65.     } else return(-1);
  66.     his->sin_port = htons((unsigned short) port);
  67.  
  68.     return(0);
  69. }
  70.  
  71. _x_select(rf, tt)       /* tt is in unit of ms */
  72.     int *rf;
  73.     long tt;
  74. {
  75.     struct timeval timeout;
  76.  
  77.     if(tt != -1)
  78.     {
  79.         timeout.tv_sec  =  tt / 1000;
  80.         timeout.tv_usec = (tt % 1000)*1000;
  81.         return(select(DSIZE, rf, (int *) 0, (int *) 0, &timeout));
  82.     }
  83.        
  84.     return(select(DSIZE, rf, (int *) 0, (int *) 0, (struct timeval *) 0));
  85. }
  86. #endif  /* not EXOS_IPC */
  87.  
  88. #ifdef EXOS_IPC
  89.  
  90. extern long rhost();
  91.  
  92. _x_udp(port)
  93.     int *port;
  94. {
  95.     struct sockaddr_in sin; int f;
  96.  
  97.     sin = INET_ZERO;
  98.     sin.sin_family = AF_INET;
  99.     sin.sin_port   = htons((unsigned short) *port);
  100.     if((f = socket(SOCK_DGRAM, (struct sockproto *) 0, &sin, SO_REUSEADDR))
  101.                             == -1) return(-1);
  102.     sin = INET_ZERO;
  103.     if(socketaddr(f,&sin) == -1) { SAVE(((void) close(f))); return(-1); }
  104.     if(!*port) *port = ntohs((unsigned short) sin.sin_port); return(f);
  105. }
  106.  
  107. _x_adr(host,port,his)
  108.     char *host;
  109.     int port;
  110.     struct sockaddr_in *his;
  111. {
  112.     char myhost[128];
  113.     int f;
  114.  
  115.     *his = INET_ZERO;
  116.     if(!host) (void) gethostname(host = myhost,sizeof(myhost));
  117.  
  118.     his->sin_family = AF_INET;
  119.     his->sin_port   = htons((unsigned short) port);
  120.  
  121.     if((his->sin_addr.s_addr = rhost(&host)) == -1) return(-1);
  122.  
  123.     return(0);
  124. }
  125.  
  126. _x_select(readfds, tt)
  127.     int *readfds;
  128.     long tt;                /* Time to wait in miniseconds. */
  129. {
  130.     int  code;
  131.     long mask = *readfds;
  132.  
  133.     if(tt & 0xc0000000) tt = 0x3fffffff;/* It does not like 0x7fffffff. */
  134.  
  135.     code = select(DSIZE, &mask, (long *) 0, tt);
  136.  
  137.     *readfds = mask;
  138.  
  139.     return(code);
  140. }
  141.  
  142. recvfrom(s, msg, len, flags, from, fromlen)
  143.     char *msg;
  144.     int s, len, flags, *fromlen;
  145.     struct sockaddr_in *from;
  146. {
  147.     return(receive(s,from,msg,len));
  148. }
  149.  
  150. sendto(s, msg, len, flags, to, tolen)
  151.     char *msg;
  152.     int s, len, flags, tolen;
  153.     struct sockaddr_in *to;
  154. {
  155.      to->sin_family = AF_INET;
  156.      return(send(s,to,msg,len));
  157. }
  158.  
  159. #endif /* EXOS_IPC */
  160.