[BACK]Return to nsap_addr.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / inet

Annotation of src/lib/libc/inet/nsap_addr.c, Revision 1.4

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

CVSweb <webmaster@jp.NetBSD.org>