Regenerated: /usr/bin/perl scripts/gen-FAQ.pl FAQ.in
[glibc.git] / resolv / nsap_addr.c
blob2222cda75afa220ff4286c66dad9e4c826c34016
1 /*
2 * Copyright (c) 1996 by Internet Software Consortium.
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.
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.
18 #if defined(LIBC_SCCS) && !defined(lint)
19 static char rcsid[] = "$Id$";
20 #endif /* LIBC_SCCS and not lint */
22 #include <sys/types.h>
23 #include <sys/param.h>
24 #include <sys/socket.h>
25 #include <netinet/in.h>
26 #include <arpa/inet.h>
27 #include <arpa/nameser.h>
28 #include <ctype.h>
29 #include <resolv.h>
31 #include "../conf/portability.h"
33 #if !defined(isxdigit) /* XXX - could be a function */
34 static int
35 isxdigit(c)
36 register int c;
38 return ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'F'));
40 #endif
42 static char
43 xtob(c)
44 register int c;
46 return (c - (((c >= '0') && (c <= '9')) ? '0' : '7'));
49 u_int
50 inet_nsap_addr(ascii, binary, maxlen)
51 const char *ascii;
52 u_char *binary;
53 int maxlen;
55 register u_char c, nib;
56 u_int len = 0;
58 while ((c = *ascii++) != '\0' && (int) len < maxlen) {
59 if (c == '.' || c == '+' || c == '/')
60 continue;
61 if (!isascii(c))
62 return (0);
63 if (islower(c))
64 c = toupper(c);
65 if (isxdigit(c)) {
66 nib = xtob(c);
67 if ((c = *ascii++)) {
68 c = toupper(c);
69 if (isxdigit(c)) {
70 *binary++ = (nib << 4) | xtob(c);
71 len++;
72 } else
73 return (0);
75 else
76 return (0);
78 else
79 return (0);
81 return (len);
84 char *
85 inet_nsap_ntoa(binlen, binary, ascii)
86 int binlen;
87 register const u_char *binary;
88 register char *ascii;
90 register int nib;
91 int i;
92 static char tmpbuf[255*3];
93 char *start;
95 if (ascii)
96 start = ascii;
97 else {
98 ascii = tmpbuf;
99 start = tmpbuf;
102 if (binlen > 255)
103 binlen = 255;
105 for (i = 0; i < binlen; i++) {
106 nib = *binary >> 4;
107 *ascii++ = nib + (nib < 10 ? '0' : '7');
108 nib = *binary++ & 0x0f;
109 *ascii++ = nib + (nib < 10 ? '0' : '7');
110 if (((i % 2) == 0 && (i + 1) < binlen))
111 *ascii++ = '.';
113 *ascii = '\0';
114 return (start);