1279524Sbapt#include "config.h"
2279524Sbapt
3279524Sbapt#if HAVE_STRTONUM
4279524Sbapt
5279524Sbaptint dummy;
6279524Sbapt
7279524Sbapt#else
8279524Sbapt
9279524Sbapt/*	$Id: compat_strtonum.c,v 1.1 2015/02/16 14:56:22 schwarze Exp $	*/
10279524Sbapt/*	$OpenBSD: strtonum.c,v 1.7 2013/04/17 18:40:58 tedu Exp $	*/
11279524Sbapt
12279524Sbapt/*
13279524Sbapt * Copyright (c) 2004 Ted Unangst and Todd Miller
14279524Sbapt * All rights reserved.
15279524Sbapt *
16279524Sbapt * Permission to use, copy, modify, and distribute this software for any
17279524Sbapt * purpose with or without fee is hereby granted, provided that the above
18279524Sbapt * copyright notice and this permission notice appear in all copies.
19279524Sbapt *
20279524Sbapt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
21279524Sbapt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
22279524Sbapt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
23279524Sbapt * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24279524Sbapt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
25279524Sbapt * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
26279524Sbapt * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
27279524Sbapt */
28279524Sbapt
29279524Sbapt#include <errno.h>
30279524Sbapt#include <limits.h>
31279524Sbapt#include <stdlib.h>
32279524Sbapt
33279524Sbapt#define	INVALID		1
34279524Sbapt#define	TOOSMALL	2
35279524Sbapt#define	TOOLARGE	3
36279524Sbapt
37279524Sbaptlong long
38279524Sbaptstrtonum(const char *numstr, long long minval, long long maxval,
39279524Sbapt    const char **errstrp)
40279524Sbapt{
41279524Sbapt	long long ll = 0;
42279524Sbapt	int error = 0;
43279524Sbapt	char *ep;
44279524Sbapt	struct errval {
45279524Sbapt		const char *errstr;
46279524Sbapt		int err;
47279524Sbapt	} ev[4] = {
48279524Sbapt		{ NULL,		0 },
49279524Sbapt		{ "invalid",	EINVAL },
50279524Sbapt		{ "too small",	ERANGE },
51279524Sbapt		{ "too large",	ERANGE },
52279524Sbapt	};
53279524Sbapt
54279524Sbapt	ev[0].err = errno;
55279524Sbapt	errno = 0;
56279524Sbapt	if (minval > maxval) {
57279524Sbapt		error = INVALID;
58279524Sbapt	} else {
59279524Sbapt		ll = strtoll(numstr, &ep, 10);
60279524Sbapt		if (numstr == ep || *ep != '\0')
61279524Sbapt			error = INVALID;
62279524Sbapt		else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
63279524Sbapt			error = TOOSMALL;
64279524Sbapt		else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
65279524Sbapt			error = TOOLARGE;
66279524Sbapt	}
67279524Sbapt	if (errstrp != NULL)
68279524Sbapt		*errstrp = ev[error].errstr;
69279524Sbapt	errno = ev[error].err;
70279524Sbapt	if (error)
71279524Sbapt		ll = 0;
72279524Sbapt
73279524Sbapt	return (ll);
74279524Sbapt}
75279524Sbapt
76279524Sbapt#endif /* !HAVE_STRTONUM */
77