ns_ttl.c revision 156952
1156952Sume/* 2156952Sume * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 3156952Sume * Copyright (c) 1996,1999 by Internet Software Consortium. 4156952Sume * 5156952Sume * Permission to use, copy, modify, and distribute this software for any 6156952Sume * purpose with or without fee is hereby granted, provided that the above 7156952Sume * copyright notice and this permission notice appear in all copies. 8156952Sume * 9156952Sume * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10156952Sume * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11156952Sume * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12156952Sume * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13156952Sume * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14156952Sume * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15156952Sume * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16156952Sume */ 17156952Sume 18156952Sume#ifndef lint 19156952Sumestatic const char rcsid[] = "$Id: ns_ttl.c,v 1.1.206.2 2005/07/28 07:43:21 marka Exp $"; 20156952Sume#endif 21156952Sume 22156952Sume/* Import. */ 23156952Sume 24156952Sume#include "port_before.h" 25156952Sume 26156952Sume#include <arpa/nameser.h> 27156952Sume 28156952Sume#include <ctype.h> 29156952Sume#include <errno.h> 30156952Sume#include <stdio.h> 31156952Sume#include <string.h> 32156952Sume 33156952Sume#include "port_after.h" 34156952Sume 35156952Sume#ifdef SPRINTF_CHAR 36156952Sume# define SPRINTF(x) strlen(sprintf/**/x) 37156952Sume#else 38156952Sume# define SPRINTF(x) ((size_t)sprintf x) 39156952Sume#endif 40156952Sume 41156952Sume/* Forward. */ 42156952Sume 43156952Sumestatic int fmt1(int t, char s, char **buf, size_t *buflen); 44156952Sume 45156952Sume/* Macros. */ 46156952Sume 47156952Sume#define T(x) if ((x) < 0) return (-1); else (void)NULL 48156952Sume 49156952Sume/* Public. */ 50156952Sume 51156952Sumeint 52156952Sumens_format_ttl(u_long src, char *dst, size_t dstlen) { 53156952Sume char *odst = dst; 54156952Sume int secs, mins, hours, days, weeks, x; 55156952Sume char *p; 56156952Sume 57156952Sume secs = src % 60; src /= 60; 58156952Sume mins = src % 60; src /= 60; 59156952Sume hours = src % 24; src /= 24; 60156952Sume days = src % 7; src /= 7; 61156952Sume weeks = src; src = 0; 62156952Sume 63156952Sume x = 0; 64156952Sume if (weeks) { 65156952Sume T(fmt1(weeks, 'W', &dst, &dstlen)); 66156952Sume x++; 67156952Sume } 68156952Sume if (days) { 69156952Sume T(fmt1(days, 'D', &dst, &dstlen)); 70156952Sume x++; 71156952Sume } 72156952Sume if (hours) { 73156952Sume T(fmt1(hours, 'H', &dst, &dstlen)); 74156952Sume x++; 75156952Sume } 76156952Sume if (mins) { 77156952Sume T(fmt1(mins, 'M', &dst, &dstlen)); 78156952Sume x++; 79156952Sume } 80156952Sume if (secs || !(weeks || days || hours || mins)) { 81156952Sume T(fmt1(secs, 'S', &dst, &dstlen)); 82156952Sume x++; 83156952Sume } 84156952Sume 85156952Sume if (x > 1) { 86156952Sume int ch; 87156952Sume 88156952Sume for (p = odst; (ch = *p) != '\0'; p++) 89156952Sume if (isascii(ch) && isupper(ch)) 90156952Sume *p = tolower(ch); 91156952Sume } 92156952Sume 93156952Sume return (dst - odst); 94156952Sume} 95156952Sume 96156952Sumeint 97156952Sumens_parse_ttl(const char *src, u_long *dst) { 98156952Sume u_long ttl, tmp; 99156952Sume int ch, digits, dirty; 100156952Sume 101156952Sume ttl = 0; 102156952Sume tmp = 0; 103156952Sume digits = 0; 104156952Sume dirty = 0; 105156952Sume while ((ch = *src++) != '\0') { 106156952Sume if (!isascii(ch) || !isprint(ch)) 107156952Sume goto einval; 108156952Sume if (isdigit(ch)) { 109156952Sume tmp *= 10; 110156952Sume tmp += (ch - '0'); 111156952Sume digits++; 112156952Sume continue; 113156952Sume } 114156952Sume if (digits == 0) 115156952Sume goto einval; 116156952Sume if (islower(ch)) 117156952Sume ch = toupper(ch); 118156952Sume switch (ch) { 119156952Sume case 'W': tmp *= 7; 120156952Sume case 'D': tmp *= 24; 121156952Sume case 'H': tmp *= 60; 122156952Sume case 'M': tmp *= 60; 123156952Sume case 'S': break; 124156952Sume default: goto einval; 125156952Sume } 126156952Sume ttl += tmp; 127156952Sume tmp = 0; 128156952Sume digits = 0; 129156952Sume dirty = 1; 130156952Sume } 131156952Sume if (digits > 0) { 132156952Sume if (dirty) 133156952Sume goto einval; 134156952Sume else 135156952Sume ttl += tmp; 136156952Sume } else if (!dirty) 137156952Sume goto einval; 138156952Sume *dst = ttl; 139156952Sume return (0); 140156952Sume 141156952Sume einval: 142156952Sume errno = EINVAL; 143156952Sume return (-1); 144156952Sume} 145156952Sume 146156952Sume/* Private. */ 147156952Sume 148156952Sumestatic int 149156952Sumefmt1(int t, char s, char **buf, size_t *buflen) { 150156952Sume char tmp[50]; 151156952Sume size_t len; 152156952Sume 153156952Sume len = SPRINTF((tmp, "%d%c", t, s)); 154156952Sume if (len + 1 > *buflen) 155156952Sume return (-1); 156156952Sume strcpy(*buf, tmp); 157156952Sume *buf += len; 158156952Sume *buflen -= len; 159156952Sume return (0); 160156952Sume} 161