[BACK]Return to ns_ttl.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / nameser

Annotation of src/lib/libc/nameser/ns_ttl.c, Revision 1.6

1.6     ! christos    1: /*     $NetBSD: ns_ttl.c,v 1.5 2007/03/30 20:23:03 ghen 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:
1.2       christos   20: #include <sys/cdefs.h>
1.1       christos   21: #ifndef lint
1.2       christos   22: #ifdef notdef
1.6     ! christos   23: static const char rcsid[] = "Id: ns_ttl.c,v 1.4 2005/07/28 06:51:49 marka Exp";
1.2       christos   24: #else
1.6     ! christos   25: __RCSID("$NetBSD: ns_ttl.c,v 1.5 2007/03/30 20:23:03 ghen Exp $");
1.2       christos   26: #endif
1.1       christos   27: #endif
                     28:
                     29: /* Import. */
                     30:
                     31: #include "port_before.h"
                     32:
                     33: #include <arpa/nameser.h>
                     34:
                     35: #include <ctype.h>
                     36: #include <errno.h>
                     37: #include <stdio.h>
                     38: #include <string.h>
                     39:
                     40: #include "port_after.h"
                     41:
                     42: #ifdef SPRINTF_CHAR
                     43: # define SPRINTF(x) strlen(sprintf/**/x)
                     44: #else
                     45: # define SPRINTF(x) ((size_t)sprintf x)
                     46: #endif
                     47:
                     48: /* Forward. */
                     49:
                     50: static int     fmt1(int t, char s, char **buf, size_t *buflen);
                     51:
                     52: /* Macros. */
                     53:
1.3       christos   54: #define T(x) if ((x) < 0) return (-1)
1.1       christos   55:
                     56: /* Public. */
                     57:
                     58: int
                     59: ns_format_ttl(u_long src, char *dst, size_t dstlen) {
                     60:        char *odst = dst;
                     61:        int secs, mins, hours, days, weeks, x;
                     62:        char *p;
                     63:
                     64:        secs = src % 60;   src /= 60;
                     65:        mins = src % 60;   src /= 60;
                     66:        hours = src % 24;  src /= 24;
                     67:        days = src % 7;    src /= 7;
                     68:        weeks = src;       src = 0;
                     69:
                     70:        x = 0;
                     71:        if (weeks) {
                     72:                T(fmt1(weeks, 'W', &dst, &dstlen));
                     73:                x++;
                     74:        }
                     75:        if (days) {
                     76:                T(fmt1(days, 'D', &dst, &dstlen));
                     77:                x++;
                     78:        }
                     79:        if (hours) {
                     80:                T(fmt1(hours, 'H', &dst, &dstlen));
                     81:                x++;
                     82:        }
                     83:        if (mins) {
                     84:                T(fmt1(mins, 'M', &dst, &dstlen));
                     85:                x++;
                     86:        }
                     87:        if (secs || !(weeks || days || hours || mins)) {
                     88:                T(fmt1(secs, 'S', &dst, &dstlen));
                     89:                x++;
                     90:        }
                     91:
                     92:        if (x > 1) {
                     93:                int ch;
                     94:
                     95:                for (p = odst; (ch = *p) != '\0'; p++)
                     96:                        if (isascii(ch) && isupper(ch))
                     97:                                *p = tolower(ch);
                     98:        }
                     99:
                    100:        return (dst - odst);
                    101: }
                    102:
1.2       christos  103: #ifndef _LIBC
1.1       christos  104: int
                    105: ns_parse_ttl(const char *src, u_long *dst) {
                    106:        u_long ttl, tmp;
                    107:        int ch, digits, dirty;
                    108:
                    109:        ttl = 0;
                    110:        tmp = 0;
                    111:        digits = 0;
                    112:        dirty = 0;
                    113:        while ((ch = *src++) != '\0') {
                    114:                if (!isascii(ch) || !isprint(ch))
                    115:                        goto einval;
                    116:                if (isdigit(ch)) {
                    117:                        tmp *= 10;
                    118:                        tmp += (ch - '0');
                    119:                        digits++;
                    120:                        continue;
                    121:                }
                    122:                if (digits == 0)
                    123:                        goto einval;
                    124:                if (islower(ch))
                    125:                        ch = toupper(ch);
                    126:                switch (ch) {
1.2       christos  127:                case 'W':  tmp *= 7;    /*FALLTHROUGH*/
                    128:                case 'D':  tmp *= 24;   /*FALLTHROUGH*/
                    129:                case 'H':  tmp *= 60;   /*FALLTHROUGH*/
                    130:                case 'M':  tmp *= 60;   /*FALLTHROUGH*/
1.1       christos  131:                case 'S':  break;
                    132:                default:   goto einval;
                    133:                }
                    134:                ttl += tmp;
                    135:                tmp = 0;
                    136:                digits = 0;
                    137:                dirty = 1;
                    138:        }
                    139:        if (digits > 0) {
                    140:                if (dirty)
                    141:                        goto einval;
                    142:                else
                    143:                        ttl += tmp;
1.4       christos  144:        } else if (!dirty)
                    145:                goto einval;
1.1       christos  146:        *dst = ttl;
                    147:        return (0);
                    148:
                    149:  einval:
                    150:        errno = EINVAL;
                    151:        return (-1);
                    152: }
1.2       christos  153: #endif
1.1       christos  154:
                    155: /* Private. */
                    156:
                    157: static int
                    158: fmt1(int t, char s, char **buf, size_t *buflen) {
                    159:        char tmp[50];
                    160:        size_t len;
                    161:
                    162:        len = SPRINTF((tmp, "%d%c", t, s));
                    163:        if (len + 1 > *buflen)
                    164:                return (-1);
                    165:        strcpy(*buf, tmp);
                    166:        *buf += len;
                    167:        *buflen -= len;
                    168:        return (0);
                    169: }
1.4       christos  170:
                    171: /*! \file */

CVSweb <webmaster@jp.NetBSD.org>