⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loc_ntoa.c

📁 bind 源码 最新实现 linux/unix/windows平台
💻 C
字号:
/* Stolen from BIND *//* * Copyright (c) 1985 *    The Regents of the University of California.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: * 	This product includes software developed by the University of * 	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. *  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. *//* * Portions Copyright (c) 1993 by Digital Equipment Corporation. *  * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies, and that * the name of Digital Equipment Corporation not be used in advertising or * publicity pertaining to distribution of the document or software without * specific, written prior permission. *  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. *//* * Portions Copyright (c) 1995 by International Business Machines, Inc. * * International Business Machines, Inc. (hereinafter called IBM) grants * permission under its copyrights to use, copy, modify, and distribute this * Software with or without fee, provided that the above copyright notice and * all paragraphs of this notice appear in all copies, and that the name of IBM * not be used in connection with the marketing of any product incorporating * the Software or modifications thereof, without specific, written prior * permission. * * To the extent it has a right to do so, IBM grants an immunity from suit * under its patents, if any, for the use, sale or manufacture of products to * the extent that such products are used for performing Domain Name System * dynamic updates in TCP/IP networks by means of the Software.  No immunity is * granted for any product per se or for any other function of any product. * * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. *//* * Portions Copyright (c) 1996-1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */#include <sys/types.h>#include <sys/param.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <arpa/nameser.h>#include <ctype.h>#include <errno.h>#include <math.h>#include <netdb.h>#include <resolv.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "loc.h"const char *precsize_ntoa();/* takes an on-the-wire LOC RR and formats it in a human readable format. */const char *loc_ntoa(binary, ascii)	const u_char *binary;	char *ascii;{	static char *error = "?";	static char tmpbuf[sizeof"1000 60 60.000 N 1000 60 60.000 W -12345678.00m 90000000.00m 90000000.00m 90000000.00m"];	const u_char *cp = binary;	int latdeg, latmin, latsec, latsecfrac;	int longdeg, longmin, longsec, longsecfrac;	char northsouth, eastwest;	int altmeters, altfrac, altsign;	const u_int32_t referencealt = 100000 * 100;	int32_t latval, longval, altval;	u_int32_t templ;	u_int8_t sizeval, hpval, vpval, versionval;    	char *sizestr, *hpstr, *vpstr;	versionval = *cp++;	if (ascii == NULL)		ascii = tmpbuf;	if (versionval) {		(void) sprintf(ascii, "; error: unknown LOC RR version");		return (ascii);	}	sizeval = *cp++;	hpval = *cp++;	vpval = *cp++;	GETLONG(templ, cp);	latval = (templ - ((unsigned)1<<31));	GETLONG(templ, cp);	longval = (templ - ((unsigned)1<<31));	GETLONG(templ, cp);	if (templ < referencealt) { /* below WGS 84 spheroid */		altval = referencealt - templ;		altsign = -1;	} else {		altval = templ - referencealt;		altsign = 1;	}	if (latval < 0) {		northsouth = 'S';		latval = -latval;	} else		northsouth = 'N';	latsecfrac = latval % 1000;	latval = latval / 1000;	latsec = latval % 60;	latval = latval / 60;	latmin = latval % 60;	latval = latval / 60;	latdeg = latval;	if (longval < 0) {		eastwest = 'W';		longval = -longval;	} else		eastwest = 'E';	longsecfrac = longval % 1000;	longval = longval / 1000;	longsec = longval % 60;	longval = longval / 60;	longmin = longval % 60;	longval = longval / 60;	longdeg = longval;	altfrac = altval % 100;	altmeters = (altval / 100) * altsign;	if ((sizestr = strdup(precsize_ntoa(sizeval))) == NULL)		sizestr = error;	if ((hpstr = strdup(precsize_ntoa(hpval))) == NULL)		hpstr = error;	if ((vpstr = strdup(precsize_ntoa(vpval))) == NULL)		vpstr = error;	sprintf(ascii,	      "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm",		latdeg, latmin, latsec, latsecfrac, northsouth,		longdeg, longmin, longsec, longsecfrac, eastwest,		altmeters, altfrac, sizestr, hpstr, vpstr);	if (sizestr != error)		free(sizestr);	if (hpstr != error)		free(hpstr);	if (vpstr != error)		free(vpstr);	return (ascii);}static unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000,				      1000000,10000000,100000000,1000000000};/* takes an XeY precision/size value, returns a string representation. */const char *precsize_ntoa(prec)	u_int8_t prec;{	static char retbuf[sizeof "90000000.00"];	/* XXX nonreentrant */	unsigned long val;	int mantissa, exponent;	mantissa = (int)((prec >> 4) & 0x0f) % 10;	exponent = (int)((prec >> 0) & 0x0f) % 10;	val = mantissa * poweroften[exponent];	(void) sprintf(retbuf, "%ld.%.2ld", val/100, val%100);	return (retbuf);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -