Home | History | Annotate | Download | only in BsdSocketLib
      1 /*
      2  * Copyright (c) 1996, 1998 by Internet Software Consortium.
      3  *
      4  * Permission to use, copy, modify, and distribute this software for any
      5  * purpose with or without fee is hereby granted, provided that the above
      6  * copyright notice and this permission notice appear in all copies.
      7  *
      8  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
      9  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
     10  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
     11  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
     12  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
     13  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
     14  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
     15  * SOFTWARE.
     16  */
     17 
     18 #include <sys/types.h>
     19 #include <sys/param.h>
     20 #include <sys/socket.h>
     21 #include <netinet/in.h>
     22 #include <arpa/inet.h>
     23 #include <arpa/nameser.h>
     24 #include <ctype.h>
     25 #include <resolv.h>
     26 
     27 static char
     28 xtob(
     29 	register int c
     30 	)
     31 {
     32 	return (char)(c - (((c >= '0') && (c <= '9')) ? '0' : '7'));
     33 }
     34 
     35 u_int
     36 inet_nsap_addr(
     37 	const char *ascii,
     38 	u_char *binary,
     39 	int maxlen
     40 	)
     41 {
     42 	u_char c, nib;
     43 	u_int len = 0;
     44 
     45 	while ((c = *ascii++) != '\0' && len < (u_int)maxlen) {
     46 		if (c == '.' || c == '+' || c == '/')
     47 			continue;
     48 		if (!isascii(c))
     49 			return (0);
     50 		if (islower(c))
     51 			c = (u_char)( toupper(c));
     52 		if (isxdigit(c)) {
     53 			nib = xtob(c);
     54 			c = *ascii++;
     55 			if (c != '\0') {
     56 				c = (u_char)( toupper(c));
     57 				if (isxdigit(c)) {
     58 					*binary++ = (nib << 4) | xtob(c);
     59 					len++;
     60 				} else
     61 					return (0);
     62 			}
     63 			else
     64 				return (0);
     65 		}
     66 		else
     67 			return (0);
     68 	}
     69 	return (len);
     70 }
     71 
     72 char *
     73 inet_nsap_ntoa(
     74 	int binlen,
     75 	register const u_char *binary,
     76 	register char *ascii
     77 	)
     78 {
     79 	register int nib;
     80 	int i;
     81 	static char tmpbuf[255*3];
     82 	char *start;
     83 
     84 	if (ascii)
     85 		start = ascii;
     86 	else {
     87 		ascii = tmpbuf;
     88 		start = tmpbuf;
     89 	}
     90 
     91 	if (binlen > 255)
     92 		binlen = 255;
     93 
     94 	for (i = 0; i < binlen; i++) {
     95 		nib = *binary >> 4;
     96 		*ascii++ = (char)( nib + (nib < 10 ? '0' : '7'));
     97 		nib = *binary++ & 0x0f;
     98 		*ascii++ = (char)( nib + (nib < 10 ? '0' : '7'));
     99 		if (((i % 2) == 0 && (i + 1) < binlen))
    100 			*ascii++ = '.';
    101 	}
    102 	*ascii = '\0';
    103 	return (start);
    104 }
    105