/* * nanobbs, a tiny forums software. * Copyright (C) 2025-2026 Xavier Del Campo Romero * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #define _POSIX_C_SOURCE 200809L #include "utils.h" #include #include #include #include #include int getul(const char **const s, unsigned long *const out) { char *end; unsigned long v; errno = 0; v = strtoul(*s, &end, 10); if (errno) { fprintf(stderr, "%s: strtoul(3) %s: %s\n", __func__, *s, strerror(errno)); return -1; } else if ((*end != '/' && *end) || v > LONG_MAX || !v) { fprintf(stderr, "%s: invalid number: %.*s\n", __func__, (int)(end - *s), *s); return -1; } *out = v; *s = *end ? end + 1 : end; return 0; }