From 3da7fe8b4f5d6a41152d81bbfbd30b0ab3a9da1c Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 4 Jun 2024 12:51:12 -0400 Subject: bfstd: New xstrtoll() wrapper --- src/bfstd.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/bfstd.c') diff --git a/src/bfstd.c b/src/bfstd.c index 44eda7c..6d244ca 100644 --- a/src/bfstd.c +++ b/src/bfstd.c @@ -209,6 +209,35 @@ const char *xgetprogname(void) { return cmd; } +int xstrtoll(const char *str, char **end, int base, long long *value) { + // strtoll() skips leading spaces, but we want to reject them + if (xisspace(str[0])) { + errno = EINVAL; + return -1; + } + + // If end is NULL, make sure the entire string is valid + bool entire = !end; + char *endp; + if (!end) { + end = &endp; + } + + errno = 0; + long long result = strtoll(str, end, base); + if (errno != 0) { + return -1; + } + + if (*end == str || (entire && **end != '\0')) { + errno = EINVAL; + return -1; + } + + *value = result; + return 0; +} + /** Compile and execute a regular expression for xrpmatch(). */ static int xrpregex(nl_item item, const char *response) { const char *pattern = nl_langinfo(item); -- cgit v1.2.3