source: rtems/cpukit/libnetworking/libc/ns_ttl.c @ 0e16fa45

5
Last change on this file since 0e16fa45 was cb68253, checked in by Sebastian Huber <sebastian.huber@…>, on 09/07/18 at 04:19:02

network: Use kernel/user space header files

Add and use <machine/rtems-bsd-kernel-space.h> and
<machine/rtems-bsd-user-space.h> similar to the libbsd to avoid command
line defines and defines scattered throught the code base.

Simplify cpukit/libnetworking/Makefile.am.

Update #3375.

  • Property mode set to 100644
File size: 2.9 KB
Line 
1#include <machine/rtems-bsd-user-space.h>
2
3/*
4 * Copyright (c) 1996 by Internet Software Consortium.
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
11 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
12 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
13 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
16 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
17 * SOFTWARE.
18 */
19
20/* Import. */
21
22#if HAVE_CONFIG_H
23#include "config.h"
24#endif
25
26#include <arpa/nameser.h>
27
28#include <ctype.h>
29#include <errno.h>
30#include <stdio.h>
31#include <string.h>
32
33#define SPRINTF(x) ((size_t)sprintf x)
34
35/* Forward. */
36
37static int      fmt1(int t, char s, char **buf, size_t *buflen);
38
39/* Macros. */
40
41#define T(x) if ((x) < 0) return (-1); else (void)NULL
42
43/* Public. */
44
45int
46ns_format_ttl(u_long src, char *dst, size_t dstlen) {
47        char *odst = dst;
48        int secs, mins, hours, days, weeks, x;
49        char *p;
50
51        secs = src % 60;   src /= 60;
52        mins = src % 60;   src /= 60;
53        hours = src % 24;  src /= 24;
54        days = src % 7;    src /= 7;
55        weeks = src;       src = 0;
56
57        x = 0;
58        if (weeks) {
59                T(fmt1(weeks, 'W', &dst, &dstlen));
60                x++;
61        }
62        if (days) {
63                T(fmt1(days, 'D', &dst, &dstlen));
64                x++;
65        }
66        if (hours) {
67                T(fmt1(hours, 'H', &dst, &dstlen));
68                x++;
69        }
70        if (mins) {
71                T(fmt1(mins, 'M', &dst, &dstlen));
72                x++;
73        }
74        if (secs || !(weeks || days || hours || mins)) {
75                T(fmt1(secs, 'S', &dst, &dstlen));
76                x++;
77        }
78
79        if (x > 1) {
80                int ch;
81
82                for (p = odst; (ch = *p) != '\0'; p++)
83                        if (isascii(ch) && isupper(ch))
84                                *p = tolower(ch);
85        }
86
87        return (dst - odst);
88}
89
90int
91ns_parse_ttl(const char *src, u_long *dst) {
92        u_long ttl, tmp;
93        int ch, digits, dirty;
94
95        ttl = 0;
96        tmp = 0;
97        digits = 0;
98        dirty = 0;
99        while ((ch = *src++) != '\0') {
100                if (!isascii(ch) || !isprint(ch))
101                        goto einval;
102                if (isdigit(ch)) {
103                        tmp *= 10;
104                        tmp += (ch - '0');
105                        digits++;
106                        continue;
107                }
108                if (digits == 0)
109                        goto einval;
110                if (islower(ch))
111                        ch = toupper(ch);
112                switch (ch) {
113                case 'W':  tmp *= 7;
114                case 'D':  tmp *= 24;
115                case 'H':  tmp *= 60;
116                case 'M':  tmp *= 60;
117                case 'S':  break;
118                default:   goto einval;
119                }
120                ttl += tmp;
121                tmp = 0;
122                digits = 0;
123                dirty = 1;
124        }
125        if (digits > 0) {
126                if (dirty)
127                        goto einval;
128                else
129                        ttl += tmp;
130        }
131        *dst = ttl;
132        return (0);
133
134 einval:
135        errno = EINVAL;
136        return (-1);
137}
138
139/* Private. */
140
141static int
142fmt1(int t, char s, char **buf, size_t *buflen) {
143        char tmp[50];
144        size_t len;
145
146        len = SPRINTF((tmp, "%d%c", t, s));
147        if (len + 1 > *buflen)
148                return (-1);
149        strcpy(*buf, tmp);
150        *buf += len;
151        *buflen -= len;
152        return (0);
153}
Note: See TracBrowser for help on using the repository browser.