11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: nsap_addr.c,v 1.2 2004/05/20 23:12:33 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1996-1999 by Internet Software Consortium. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(LIBC_SCCS) && !defined(lint) 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if 0 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: nsap_addr.c,v 1.2.206.1 2004/03/09 08:33:33 marka Exp"; 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: nsap_addr.c,v 1.2 2004/05/20 23:12:33 christos Exp $"); 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* LIBC_SCCS and not lint */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h> 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/socket.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h> 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <arpa/inet.h> 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "arpa_nameser.h" 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <assert.h> 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h> 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h" 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <resolv.h> 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectxtob(int c) { 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (c - (((c >= '0') && (c <= '9')) ? '0' : '7')); 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectinet_nsap_addr(const char *ascii, u_char *binary, int maxlen) { 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char c, nib; 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int len = 0; 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project assert(ascii != NULL); 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project assert(binary != NULL); 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ascii[0] != '0' || (ascii[1] != 'x' && ascii[1] != 'X')) 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ascii += 2; 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while ((c = *ascii++) != '\0' && len < (u_int)maxlen) { 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (c == '.' || c == '+' || c == '/') 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!isascii(c)) 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (islower(c)) 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project c = toupper(c); 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isxdigit(c)) { 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nib = xtob(c); 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project c = *ascii++; 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (c != '\0') { 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project c = toupper(c); 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isxdigit(c)) { 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *binary++ = (nib << 4) | xtob(c); 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len++; 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (len); 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar * 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectinet_nsap_ntoa(int binlen, const u_char *binary, char *ascii) { 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nib; 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char tmpbuf[2+255*3]; 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *start; 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project assert(binary != NULL); 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ascii) 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project start = ascii; 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ascii = tmpbuf; 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project start = tmpbuf; 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *ascii++ = '0'; 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *ascii++ = 'x'; 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (binlen > 255) 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project binlen = 255; 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < binlen; i++) { 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nib = (u_int32_t)*binary >> 4; 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *ascii++ = nib + (nib < 10 ? '0' : '7'); 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nib = *binary++ & 0x0f; 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *ascii++ = nib + (nib < 10 ? '0' : '7'); 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (((i % 2) == 0 && (i + 1) < binlen)) 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *ascii++ = '.'; 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *ascii = '\0'; 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (start); 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 122