[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.1.1.2

1.1.1.2 ! christos    1: /*     $NetBSD: nsap_addr.c,v 1.1.1.4 2007/01/27 21:09:05 christos 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:
                     20: #if defined(LIBC_SCCS) && !defined(lint)
1.1.1.2 ! christos   21: static const char rcsid[] = "Id: nsap_addr.c,v 1.3.18.2 2005/07/28 07:38:08 marka Exp";
1.1       christos   22: #endif /* LIBC_SCCS and not lint */
                     23:
                     24: #include "port_before.h"
                     25:
                     26: #include <sys/types.h>
                     27: #include <sys/param.h>
                     28: #include <sys/socket.h>
                     29:
                     30: #include <netinet/in.h>
                     31: #include <arpa/inet.h>
                     32: #include <arpa/nameser.h>
                     33:
                     34: #include <ctype.h>
                     35: #include <resolv.h>
1.1.1.2 ! christos   36: #include <resolv_mt.h>
1.1       christos   37:
                     38: #include "port_after.h"
                     39:
                     40: static char
                     41: xtob(int c) {
                     42:        return (c - (((c >= '0') && (c <= '9')) ? '0' : '7'));
                     43: }
                     44:
                     45: u_int
                     46: inet_nsap_addr(const char *ascii, u_char *binary, int maxlen) {
                     47:        u_char c, nib;
                     48:        u_int len = 0;
                     49:
                     50:        if (ascii[0] != '0' || (ascii[1] != 'x' && ascii[1] != 'X'))
                     51:                return (0);
                     52:        ascii += 2;
                     53:
                     54:        while ((c = *ascii++) != '\0' && len < (u_int)maxlen) {
                     55:                if (c == '.' || c == '+' || c == '/')
                     56:                        continue;
                     57:                if (!isascii(c))
                     58:                        return (0);
                     59:                if (islower(c))
                     60:                        c = toupper(c);
                     61:                if (isxdigit(c)) {
                     62:                        nib = xtob(c);
                     63:                        c = *ascii++;
                     64:                        if (c != '\0') {
                     65:                                c = toupper(c);
                     66:                                if (isxdigit(c)) {
                     67:                                        *binary++ = (nib << 4) | xtob(c);
                     68:                                        len++;
                     69:                                } else
                     70:                                        return (0);
                     71:                        }
                     72:                        else
                     73:                                return (0);
                     74:                }
                     75:                else
                     76:                        return (0);
                     77:        }
                     78:        return (len);
                     79: }
                     80:
                     81: char *
                     82: inet_nsap_ntoa(int binlen, const u_char *binary, char *ascii) {
                     83:        int nib;
                     84:        int i;
1.1.1.2 ! christos   85:        char *tmpbuf = inet_nsap_ntoa_tmpbuf;
1.1       christos   86:        char *start;
                     87:
                     88:        if (ascii)
                     89:                start = ascii;
                     90:        else {
                     91:                ascii = tmpbuf;
                     92:                start = tmpbuf;
                     93:        }
                     94:
                     95:        *ascii++ = '0';
                     96:        *ascii++ = 'x';
                     97:
                     98:        if (binlen > 255)
                     99:                binlen = 255;
                    100:
                    101:        for (i = 0; i < binlen; i++) {
                    102:                nib = *binary >> 4;
                    103:                *ascii++ = nib + (nib < 10 ? '0' : '7');
                    104:                nib = *binary++ & 0x0f;
                    105:                *ascii++ = nib + (nib < 10 ? '0' : '7');
                    106:                if (((i % 2) == 0 && (i + 1) < binlen))
                    107:                        *ascii++ = '.';
                    108:        }
                    109:        *ascii = '\0';
                    110:        return (start);
                    111: }
1.1.1.2 ! christos  112:
        !           113: /*! \file */

CVSweb <webmaster@jp.NetBSD.org>