/ net / FreeBSD / nsap_addr.c
nsap_addr.c
  1  /*
  2   * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
  3   * Copyright (c) 1996-1999 by Internet Software Consortium.
  4   *
  5   * Permission to use, copy, modify, and distribute this software for any
  6   * purpose with or without fee is hereby granted, provided that the above
  7   * copyright notice and this permission notice appear in all copies.
  8   *
  9   * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
 10   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 11   * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
 12   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 13   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 14   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 15   * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 16   */
 17  
 18  #if defined(LIBC_SCCS) && !defined(lint)
 19  static const char rcsid[] = "$Id: nsap_addr.c,v 1.3.18.2 2005/07/28 07:38:08 marka Exp $";
 20  
 21  /* the algorithms only can deal with ASCII, so we optimize for it */
 22  #define USE_ASCII
 23  
 24  #endif /* LIBC_SCCS and not lint */
 25  #include <sys/cdefs.h>
 26  __FBSDID("$FreeBSD: src/lib/libc/inet/nsap_addr.c,v 1.3 2007/06/03 17:20:26 ume Exp $");
 27  
 28  #include "port_before.h"
 29  
 30  #include <sys/types.h>
 31  #include <sys/param.h>
 32  #include <sys/socket.h>
 33  
 34  #include <netinet/in.h>
 35  #include <arpa/inet.h>
 36  #include <arpa/nameser.h>
 37  
 38  #include <ctype.h>
 39  #include <resolv.h>
 40  //#include <resolv_mt.h>
 41  
 42  #include "port_after.h"
 43  
 44  #include <stdlib.h>
 45  
 46  static char
 47  xtob(int c) {
 48  	return (c - (((c >= '0') && (c <= '9')) ? '0' : '7'));
 49  }
 50  
 51  u_int
 52  inet_nsap_addr(const char *ascii, u_char *binary, int maxlen) {
 53  	u_char c, nib;
 54  	u_int len = 0;
 55  
 56  	if (ascii[0] != '0' || (ascii[1] != 'x' && ascii[1] != 'X'))
 57  		return (0);
 58  	ascii += 2;
 59  
 60  	while ((c = *ascii++) != '\0' && len < (u_int)maxlen) {
 61  		if (c == '.' || c == '+' || c == '/')
 62  			continue;
 63  		if (!isascii(c))
 64  			return (0);
 65  		if (islower(c))
 66  			c = toupper(c);
 67  		if (isxdigit(c)) {
 68  			nib = xtob(c);
 69  			c = *ascii++;
 70  			if (c != '\0') {
 71  				c = toupper(c);
 72  				if (isxdigit(c)) {
 73  					*binary++ = (nib << 4) | xtob(c);
 74  					len++;
 75  				} else
 76  					return (0);
 77  			}
 78  			else
 79  				return (0);
 80  		}
 81  		else
 82  			return (0);
 83  	}
 84  	return (len);
 85  }
 86  
 87  char *
 88  inet_nsap_ntoa(int binlen, const u_char *binary, char *ascii) {
 89  	int nib;
 90  	int i;
 91  	char *tmpbuf = NULL;
 92  	char *start;
 93  
 94  	if (tmpbuf == NULL) {
 95  		tmpbuf = malloc(255*3);
 96  		if (tmpbuf == NULL) return NULL;
 97  	}
 98  	if (ascii)
 99  		start = ascii;
100  	else {
101  		ascii = tmpbuf;
102  		start = tmpbuf;
103  	}
104  
105  	*ascii++ = '0';
106  	*ascii++ = 'x';
107  
108  	if (binlen > 255)
109  		binlen = 255;
110  
111  	for (i = 0; i < binlen; i++) {
112  		nib = *binary >> 4;
113  		*ascii++ = nib + (nib < 10 ? '0' : '7');
114  		nib = *binary++ & 0x0f;
115  		*ascii++ = nib + (nib < 10 ? '0' : '7');
116  		if (((i % 2) == 0 && (i + 1) < binlen))
117  			*ascii++ = '.';
118  	}
119  	*ascii = '\0';
120  	return (start);
121  }
122  
123  /*
124   * Weak aliases for applications that use certain private entry points,
125   * and fail to include <arpa/inet.h>.
126   */
127  #undef inet_nsap_addr
128  __weak_reference(__inet_nsap_addr, inet_nsap_addr);
129  #undef inet_nsap_ntoa
130  __weak_reference(__inet_nsap_ntoa, inet_nsap_ntoa);
131  
132  /*! \file */