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