home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1995 April / Internet Tools.iso / osi / isode / vmsisode / vmsisode80_tar.Z / vmsisode80_tar / sockit / source / inet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-05  |  2.9 KB  |  140 lines

  1. #include <sys/types.h>
  2. #include <netinet/in.h>
  3. #include <ctype.h>
  4.  
  5. unsigned long inet_addr(cp)
  6. char *cp;
  7. {
  8.   int i,j,ti[4];
  9.   unsigned long k;
  10.   char *q;
  11.   char s[10];
  12.  
  13.   q = cp;
  14.   j = 0;
  15.   while (!isspace(*q) && *q != '\0') {
  16.     if (*q == '.') q++;
  17.     i = 0;
  18.     while ((*q >= '0') && (*q <= '9')) {
  19.       s[i++] = *q;
  20.       q++;
  21.     }
  22.     if ((*q != '.') && (*q != '\0') && !isspace(*q)) return(0xffffffff);
  23.     s[i] = '\0';
  24.     if (j > 3) return(0xffffffff);
  25.     ti[j++] = atoi(s);
  26.   }
  27.   switch (j) {
  28.   case 1:
  29.     k = ti[0];
  30.     break;
  31.   case 2:
  32.     k = (ti[0] * 0x01000000) + ti[1];
  33.     break;
  34.   case 3:
  35.     k = (ti[0] * 0x01000000) + (ti[1] * 0x00010000) + ti[2];
  36.     break;
  37.   case 4:
  38.     k = (ti[0] * 0x01000000) + (ti[1] * 0x00010000) + (ti[2] * 0x00000100) + ti[3];
  39.     break;
  40.   }
  41.   k = htonl(k);
  42.   return(k);
  43. }
  44.  
  45. char *inet_ntoa(in)
  46. struct in_addr in;
  47. {
  48.    char *s;
  49.    unsigned char *p;
  50.  
  51.    p = (unsigned char *)∈
  52.    s = (char *)malloc(16);
  53. /*   sprintf(s,"%d.%d.%d.%d",in.s_net,in.s_host,in.s_lh,in.s_impno);*/
  54.    sprintf(s,"%d.%d.%d.%d",p[0],p[1],p[2],p[3]);
  55.    return(s);
  56. }
  57. inet_network(name)
  58.   char *name;
  59. {
  60.   long bytes[4];
  61.   int byte_ctr = -1;
  62.   int i;
  63.   int state = 0;  /* init bytes jobber */
  64.   int base;
  65.   unsigned long value;
  66.  
  67.   while (*name != '\0') {
  68.     if (state == 0) { /* at beginning of byte */
  69.       byte_ctr++;
  70.       if (byte_ctr > 4)
  71.          return (-1);
  72.       bytes[byte_ctr] = 0;
  73.       if (*name == '0') {
  74.          base = 8;
  75.      name++;
  76.       }
  77.       if ((*name == 'x') || (*name == 'X')) {
  78.          base = 16;
  79.      name++;
  80.       }
  81.       state = 1;
  82.     }
  83.     else {  /* state != 0 */
  84.       if (*name == '.') {
  85.          name++;
  86.          state = 0;
  87.          continue;
  88.       }
  89.       if (isdigit(*name)) {
  90.      bytes[byte_ctr] = (bytes[byte_ctr] * base) + (*name - '0');
  91.      name++;
  92.      continue;
  93.       }
  94.       if ((base == 16) && isxdigit(*name)) { /* a-f,A-F */
  95.          toupper(*name);
  96.          bytes[byte_ctr] = (bytes[byte_ctr] * base) + (10 + (*name - 'A'));
  97.      name++;
  98.      continue;
  99.       }
  100.       if (*name && (!isspace(*name)))
  101.          return(-1);
  102.     } /* end of state != 0 */
  103.   } /* end of while loop */
  104.  
  105.   for(value = 0,i=0; i < byte_ctr; i++) {
  106.      value = value << 8;
  107.      value = value | (bytes[i] & 0xFF);
  108.   }
  109.  
  110.   return(value);
  111.  
  112. } /* end of inet_network */
  113.  
  114. inet_lnaof(in)
  115.         struct in_addr in;
  116. {
  117.         unsigned long addr = ntohl(in.s_addr);
  118.  
  119.         if ((addr & 0x80000000) == 0 ) /* class A */
  120.            return(addr & 0x00FFFFFF);
  121.         else if ((addr & 0xC0000000) == 0x80000000) /* class B */
  122.            return(addr & 0x0000FFFF);
  123.         else  /* class C */
  124.            return(addr & 0x000000FF);
  125. }
  126.  
  127. inet_netof(in)
  128.     struct in_addr in;
  129. {
  130.         unsigned long addr = ntohl(in.s_addr);
  131.  
  132.         if ((addr & 0x80000000) == 0 ) /* class A */
  133.            return(addr & 0xFF000000);
  134.         else if ((addr & 0xC0000000) == 0x80000000) /* class B */
  135.            return(addr & 0xFFFF0000);
  136.         else  /* class C */
  137.            return(addr & 0xFFFFFF00);
  138. }
  139.  
  140.