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 19270838Sumestatic const char rcsid[] = "$Id: ns_ttl.c,v 1.4 2005/07/28 06:51:49 marka Exp $"; 20156952Sume#endif 21270838Sume#include <sys/cdefs.h> 22270838Sume__FBSDID("$FreeBSD$"); 23156952Sume 24156952Sume/* Import. */ 25156952Sume 26156952Sume#include "port_before.h" 27156952Sume 28156952Sume#include <arpa/nameser.h> 29156952Sume 30156952Sume#include <ctype.h> 31156952Sume#include <errno.h> 32156952Sume#include <stdio.h> 33156952Sume#include <string.h> 34156952Sume 35156952Sume#include "port_after.h" 36156952Sume 37156952Sume#ifdef SPRINTF_CHAR 38156952Sume# define SPRINTF(x) strlen(sprintf/**/x) 39156952Sume#else 40156952Sume# define SPRINTF(x) ((size_t)sprintf x) 41156952Sume#endif 42156952Sume 43156952Sume/* Forward. */ 44156952Sume 45156952Sumestatic int fmt1(int t, char s, char **buf, size_t *buflen); 46156952Sume 47156952Sume/* Macros. */ 48156952Sume 49156952Sume#define T(x) if ((x) < 0) return (-1); else (void)NULL 50156952Sume 51156952Sume/* Public. */ 52156952Sume 53156952Sumeint 54156952Sumens_format_ttl(u_long src, char *dst, size_t dstlen) { 55156952Sume char *odst = dst; 56156952Sume int secs, mins, hours, days, weeks, x; 57156952Sume char *p; 58156952Sume 59156952Sume secs = src % 60; src /= 60; 60156952Sume mins = src % 60; src /= 60; 61156952Sume hours = src % 24; src /= 24; 62156952Sume days = src % 7; src /= 7; 63156952Sume weeks = src; src = 0; 64156952Sume 65156952Sume x = 0; 66156952Sume if (weeks) { 67156952Sume T(fmt1(weeks, 'W', &dst, &dstlen)); 68156952Sume x++; 69156952Sume } 70156952Sume if (days) { 71156952Sume T(fmt1(days, 'D', &dst, &dstlen)); 72156952Sume x++; 73156952Sume } 74156952Sume if (hours) { 75156952Sume T(fmt1(hours, 'H', &dst, &dstlen)); 76156952Sume x++; 77156952Sume } 78156952Sume if (mins) { 79156952Sume T(fmt1(mins, 'M', &dst, &dstlen)); 80156952Sume x++; 81156952Sume } 82156952Sume if (secs || !(weeks || days || hours || mins)) { 83156952Sume T(fmt1(secs, 'S', &dst, &dstlen)); 84156952Sume x++; 85156952Sume } 86156952Sume 87156952Sume if (x > 1) { 88156952Sume int ch; 89156952Sume 90156952Sume for (p = odst; (ch = *p) != '\0'; p++) 91156952Sume if (isascii(ch) && isupper(ch)) 92156952Sume *p = tolower(ch); 93156952Sume } 94156952Sume 95156952Sume return (dst - odst); 96156952Sume} 97156952Sume 98156952Sumeint 99156952Sumens_parse_ttl(const char *src, u_long *dst) { 100156952Sume u_long ttl, tmp; 101156952Sume int ch, digits, dirty; 102156952Sume 103156952Sume ttl = 0; 104156952Sume tmp = 0; 105156952Sume digits = 0; 106156952Sume dirty = 0; 107156952Sume while ((ch = *src++) != '\0') { 108156952Sume if (!isascii(ch) || !isprint(ch)) 109156952Sume goto einval; 110156952Sume if (isdigit(ch)) { 111156952Sume tmp *= 10; 112156952Sume tmp += (ch - '0'); 113156952Sume digits++; 114156952Sume continue; 115156952Sume } 116156952Sume if (digits == 0) 117156952Sume goto einval; 118156952Sume if (islower(ch)) 119156952Sume ch = toupper(ch); 120156952Sume switch (ch) { 121156952Sume case 'W': tmp *= 7; 122156952Sume case 'D': tmp *= 24; 123156952Sume case 'H': tmp *= 60; 124156952Sume case 'M': tmp *= 60; 125156952Sume case 'S': break; 126156952Sume default: goto einval; 127156952Sume } 128156952Sume ttl += tmp; 129156952Sume tmp = 0; 130156952Sume digits = 0; 131156952Sume dirty = 1; 132156952Sume } 133156952Sume if (digits > 0) { 134156952Sume if (dirty) 135156952Sume goto einval; 136156952Sume else 137156952Sume ttl += tmp; 138156952Sume } else if (!dirty) 139156952Sume goto einval; 140156952Sume *dst = ttl; 141156952Sume return (0); 142156952Sume 143156952Sume einval: 144156952Sume errno = EINVAL; 145156952Sume return (-1); 146156952Sume} 147156952Sume 148156952Sume/* Private. */ 149156952Sume 150156952Sumestatic int 151156952Sumefmt1(int t, char s, char **buf, size_t *buflen) { 152156952Sume char tmp[50]; 153156952Sume size_t len; 154156952Sume 155156952Sume len = SPRINTF((tmp, "%d%c", t, s)); 156156952Sume if (len + 1 > *buflen) 157156952Sume return (-1); 158156952Sume strcpy(*buf, tmp); 159156952Sume *buf += len; 160156952Sume *buflen -= len; 161156952Sume return (0); 162156952Sume} 163170242Sume 164170242Sume/*! \file */ 165