attempt to regularize atoi mess.

This commit is contained in:
Denis Vlasenko
2006-10-08 12:49:22 +00:00
parent 5625415085
commit 1385899416
98 changed files with 814 additions and 860 deletions

3
TODO
View File

@ -295,9 +295,6 @@ Minor stuff:
-> fprintf(stderr, "unalias: %s not found\n", *argptr); -> fprintf(stderr, "unalias: %s not found\n", *argptr);
--- ---
possible code duplication ingroup() and is_a_group_member() possible code duplication ingroup() and is_a_group_member()
---
unify itoa: netstat.c, hush.c, lash.c, msh.c
Put one single, robust version into e.g. safe_strtol.c
--- ---
Move __get_hz() to a better place and (re)use it in route.c, ash.c, msh.c Move __get_hz() to a better place and (re)use it in route.c, ash.c, msh.c
--- ---

View File

@ -264,8 +264,8 @@ static void parse_config_file(void)
sct->m_uid = strtoul(s, &e2, 10); sct->m_uid = strtoul(s, &e2, 10);
if (*e2 || (s == e2)) { if (*e2 || (s == e2)) {
struct passwd *pwd; struct passwd *pwd = getpwnam(s);
if (!(pwd = getpwnam(s))) { if (!pwd) {
parse_error("user"); parse_error("user");
} }
sct->m_uid = pwd->pw_uid; sct->m_uid = pwd->pw_uid;

View File

@ -35,7 +35,7 @@ int cpio_main(int argc, char **argv)
/* Initialise */ /* Initialise */
archive_handle = init_handle(); archive_handle = init_handle();
archive_handle->src_fd = STDIN_FILENO; archive_handle->src_fd = STDIN_FILENO;
archive_handle->seek = seek_by_char; archive_handle->seek = seek_by_read;
archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE; archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE;
opt = getopt32(argc, argv, "ituvF:dm", &cpio_filename); opt = getopt32(argc, argv, "ituvF:dm", &cpio_filename);

View File

@ -21,7 +21,7 @@ lib-y:= \
\ \
archive_xread_all_eof.o \ archive_xread_all_eof.o \
\ \
seek_by_char.o \ seek_by_read.o \
seek_by_jump.o \ seek_by_jump.o \
\ \
data_align.o \ data_align.o \

View File

@ -46,14 +46,14 @@ char get_header_ar(archive_handle_t *archive_handle)
/* align the headers based on the header magic */ /* align the headers based on the header magic */
if ((ar.formatted.magic[0] != '`') || (ar.formatted.magic[1] != '\n')) { if ((ar.formatted.magic[0] != '`') || (ar.formatted.magic[1] != '\n')) {
bb_error_msg_and_die("Invalid ar header"); bb_error_msg_and_die("invalid ar header");
} }
typed->mode = strtol(ar.formatted.mode, NULL, 8); typed->mode = xstrtoul(ar.formatted.mode, 8);
typed->mtime = atoi(ar.formatted.date); typed->mtime = xatou(ar.formatted.date);
typed->uid = atoi(ar.formatted.uid); typed->uid = xatou(ar.formatted.uid);
typed->gid = atoi(ar.formatted.gid); typed->gid = xatou(ar.formatted.gid);
typed->size = atoi(ar.formatted.size); typed->size = xatoul(ar.formatted.size);
/* long filenames have '/' as the first character */ /* long filenames have '/' as the first character */
if (ar.formatted.name[0] == '/') { if (ar.formatted.name[0] == '/') {

View File

@ -62,10 +62,10 @@ char get_header_tar(archive_handle_t *archive_handle)
* Read until the end to empty the pipe from gz or bz2 * Read until the end to empty the pipe from gz or bz2
*/ */
while (full_read(archive_handle->src_fd, tar.raw, 512) == 512); while (full_read(archive_handle->src_fd, tar.raw, 512) == 512);
return(EXIT_FAILURE); return EXIT_FAILURE;
} }
end = 1; end = 1;
return(EXIT_SUCCESS); return EXIT_SUCCESS;
} }
end = 0; end = 0;
@ -76,19 +76,18 @@ char get_header_tar(archive_handle_t *archive_handle)
#ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY #ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY
if (strncmp(tar.formatted.magic, "\0\0\0\0\0", 5) != 0) if (strncmp(tar.formatted.magic, "\0\0\0\0\0", 5) != 0)
#endif #endif
bb_error_msg_and_die("Invalid tar magic"); bb_error_msg_and_die("invalid tar magic");
} }
/* Do checksum on headers */ /* Do checksum on headers */
for (i = 0; i < 148 ; i++) { for (i = 0; i < 148 ; i++) {
sum += tar.raw[i]; sum += tar.raw[i];
} }
sum += ' ' * 8; sum += ' ' * 8;
for (i = 156; i < 512 ; i++) { for (i = 156; i < 512 ; i++) {
sum += tar.raw[i]; sum += tar.raw[i];
} }
if (sum != strtol(tar.formatted.chksum, NULL, 8)) { if (sum != xstrtoul(tar.formatted.chksum, 8)) {
bb_error_msg("Invalid tar header checksum"); bb_error_msg_and_die("invalid tar header checksum");
return(EXIT_FAILURE);
} }
#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS #ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
@ -102,8 +101,7 @@ char get_header_tar(archive_handle_t *archive_handle)
} else } else
#endif #endif
{ {
file_header->name = xstrndup(tar.formatted.name,100); file_header->name = xstrndup(tar.formatted.name, 100);
if (tar.formatted.prefix[0]) { if (tar.formatted.prefix[0]) {
char *temp = file_header->name; char *temp = file_header->name;
file_header->name = concat_path_file(tar.formatted.prefix, temp); file_header->name = concat_path_file(tar.formatted.prefix, temp);
@ -111,17 +109,18 @@ char get_header_tar(archive_handle_t *archive_handle)
} }
} }
file_header->uid = strtol(tar.formatted.uid, NULL, 8); file_header->uid = xstrtoul(tar.formatted.uid, 8);
file_header->gid = strtol(tar.formatted.gid, NULL, 8); file_header->gid = xstrtoul(tar.formatted.gid, 8);
file_header->size = strtol(tar.formatted.size, NULL, 8); // TODO: LFS support
file_header->mtime = strtol(tar.formatted.mtime, NULL, 8); file_header->size = xstrtoul(tar.formatted.size, 8);
file_header->link_name = (tar.formatted.linkname[0] != '\0') ? file_header->mtime = xstrtoul(tar.formatted.mtime, 8);
xstrdup(tar.formatted.linkname) : NULL; file_header->link_name = tar.formatted.linkname[0] ?
file_header->device = makedev(strtol(tar.formatted.devmajor, NULL, 8), xstrdup(tar.formatted.linkname) : NULL;
strtol(tar.formatted.devminor, NULL, 8)); file_header->device = makedev(xstrtoul(tar.formatted.devmajor, 8),
xstrtoul(tar.formatted.devminor, 8));
/* Set bits 0-11 of the files mode */ /* Set bits 0-11 of the files mode */
file_header->mode = 07777 & strtol(tar.formatted.mode, NULL, 8); file_header->mode = 07777 & xstrtoul(tar.formatted.mode, 8);
/* Set bits 12-15 of the files mode */ /* Set bits 12-15 of the files mode */
switch (tar.formatted.typeflag) { switch (tar.formatted.typeflag) {
@ -161,7 +160,7 @@ char get_header_tar(archive_handle_t *archive_handle)
xread(archive_handle->src_fd, longname, file_header->size); xread(archive_handle->src_fd, longname, file_header->size);
archive_handle->offset += file_header->size; archive_handle->offset += file_header->size;
return(get_header_tar(archive_handle)); return get_header_tar(archive_handle);
} }
case 'K': { case 'K': {
linkname = xzalloc(file_header->size + 1); linkname = xzalloc(file_header->size + 1);
@ -169,7 +168,7 @@ char get_header_tar(archive_handle_t *archive_handle)
archive_handle->offset += file_header->size; archive_handle->offset += file_header->size;
file_header->name = linkname; file_header->name = linkname;
return(get_header_tar(archive_handle)); return get_header_tar(archive_handle);
} }
case 'D': /* GNU dump dir */ case 'D': /* GNU dump dir */
case 'M': /* Continuation of multi volume archive*/ case 'M': /* Continuation of multi volume archive*/
@ -179,10 +178,10 @@ char get_header_tar(archive_handle_t *archive_handle)
#endif #endif
case 'g': /* pax global header */ case 'g': /* pax global header */
case 'x': /* pax extended header */ case 'x': /* pax extended header */
bb_error_msg("Ignoring extension type %c", tar.formatted.typeflag); bb_error_msg("ignoring extension type %c", tar.formatted.typeflag);
break; break;
default: default:
bb_error_msg("Unknown typeflag: 0x%x", tar.formatted.typeflag); bb_error_msg("unknown typeflag: 0x%x", tar.formatted.typeflag);
} }
{ /* Strip trailing '/' in directories */ { /* Strip trailing '/' in directories */
/* Must be done after mode is set as '/' is used to check if its a directory */ /* Must be done after mode is set as '/' is used to check if its a directory */
@ -204,5 +203,5 @@ char get_header_tar(archive_handle_t *archive_handle)
free(file_header->link_name); free(file_header->link_name);
return(EXIT_SUCCESS); return EXIT_SUCCESS;
} }

View File

@ -16,12 +16,12 @@
char get_header_tar_bz2(archive_handle_t *archive_handle) char get_header_tar_bz2(archive_handle_t *archive_handle)
{ {
/* Cant lseek over pipe's */ /* Cant lseek over pipe's */
archive_handle->seek = seek_by_char; archive_handle->seek = seek_by_read;
archive_handle->src_fd = open_transformer(archive_handle->src_fd, uncompressStream); archive_handle->src_fd = open_transformer(archive_handle->src_fd, uncompressStream);
archive_handle->offset = 0; archive_handle->offset = 0;
while (get_header_tar(archive_handle) == EXIT_SUCCESS); while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
/* Can only do one file at a time */ /* Can only do one file at a time */
return(EXIT_FAILURE); return EXIT_FAILURE;
} }

View File

@ -13,7 +13,7 @@ char get_header_tar_gz(archive_handle_t *archive_handle)
unsigned char magic[2]; unsigned char magic[2];
/* Cant lseek over pipe's */ /* Cant lseek over pipe's */
archive_handle->seek = seek_by_char; archive_handle->seek = seek_by_read;
xread(archive_handle->src_fd, &magic, 2); xread(archive_handle->src_fd, &magic, 2);
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
@ -24,8 +24,8 @@ char get_header_tar_gz(archive_handle_t *archive_handle)
archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip); archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip);
archive_handle->offset = 0; archive_handle->offset = 0;
while (get_header_tar(archive_handle) == EXIT_SUCCESS); while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
/* Can only do one file at a time */ /* Can only do one file at a time */
return(EXIT_FAILURE); return EXIT_FAILURE;
} }

View File

@ -11,13 +11,12 @@
char get_header_tar_lzma(archive_handle_t * archive_handle) char get_header_tar_lzma(archive_handle_t * archive_handle)
{ {
/* Can't lseek over pipes */ /* Can't lseek over pipes */
archive_handle->seek = seek_by_char; archive_handle->seek = seek_by_read;
archive_handle->src_fd = open_transformer(archive_handle->src_fd, unlzma); archive_handle->src_fd = open_transformer(archive_handle->src_fd, unlzma);
archive_handle->offset = 0; archive_handle->offset = 0;
while (get_header_tar(archive_handle) == EXIT_SUCCESS); while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
/* Can only do one file at a time */ /* Can only do one file at a time */
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View File

@ -16,7 +16,7 @@ void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amo
if (lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1) { if (lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1) {
#ifdef CONFIG_FEATURE_UNARCHIVE_TAPE #ifdef CONFIG_FEATURE_UNARCHIVE_TAPE
if (errno == ESPIPE) { if (errno == ESPIPE) {
seek_by_char(archive_handle, amount); seek_by_read(archive_handle, amount);
} else } else
#endif #endif
bb_perror_msg_and_die("Seek failure"); bb_perror_msg_and_die("Seek failure");

View File

@ -8,14 +8,10 @@
#include "unarchive.h" #include "unarchive.h"
#include "libbb.h" #include "libbb.h"
/* If we are reading through a pipe(), or from stdin then we cant lseek,
/* If we are reading through a pipe(), or from stdin then we cant lseek,
* we must read and discard the data to skip over it. * we must read and discard the data to skip over it.
*
* TODO: rename to seek_by_read
*/ */
void seek_by_char(const archive_handle_t *archive_handle, const unsigned int jump_size) void seek_by_read(const archive_handle_t *archive_handle, const unsigned int jump_size)
{ {
if (jump_size) { if (jump_size) {
bb_copyfd_size(archive_handle->src_fd, -1, jump_size); bb_copyfd_size(archive_handle->src_fd, -1, jump_size);

View File

@ -173,7 +173,7 @@ static void extract_cpio_gz(int fd) {
/* Initialise */ /* Initialise */
archive_handle = init_handle(); archive_handle = init_handle();
archive_handle->seek = seek_by_char; archive_handle->seek = seek_by_read;
//archive_handle->action_header = header_list; //archive_handle->action_header = header_list;
archive_handle->action_data = data_extract_all; archive_handle->action_data = data_extract_all;
archive_handle->flags |= ARCHIVE_PRESERVE_DATE; archive_handle->flags |= ARCHIVE_PRESERVE_DATE;

View File

@ -541,7 +541,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
static char get_header_tar_Z(archive_handle_t *archive_handle) static char get_header_tar_Z(archive_handle_t *archive_handle)
{ {
/* Cant lseek over pipe's */ /* Cant lseek over pipe's */
archive_handle->seek = seek_by_char; archive_handle->seek = seek_by_read;
/* do the decompression, and cleanup */ /* do the decompression, and cleanup */
if (xread_char(archive_handle->src_fd) != 0x1f || if (xread_char(archive_handle->src_fd) != 0x1f ||
@ -805,7 +805,7 @@ int tar_main(int argc, char **argv)
if ((tar_filename[0] == '-') && (tar_filename[1] == '\0')) { if ((tar_filename[0] == '-') && (tar_filename[1] == '\0')) {
tar_handle->src_fd = fileno(tar_stream); tar_handle->src_fd = fileno(tar_stream);
tar_handle->seek = seek_by_char; tar_handle->seek = seek_by_read;
} else { } else {
tar_handle->src_fd = xopen3(tar_filename, flags, 0666); tar_handle->src_fd = xopen3(tar_filename, flags, 0666);
} }

View File

@ -51,11 +51,12 @@ typedef union {
} formatted ATTRIBUTE_PACKED; } formatted ATTRIBUTE_PACKED;
} zip_header_t; } zip_header_t;
/* This one never works with LARGEFILE-sized skips */
static void unzip_skip(int fd, off_t skip) static void unzip_skip(int fd, off_t skip)
{ {
if (lseek(fd, skip, SEEK_CUR) == (off_t)-1) { if (lseek(fd, skip, SEEK_CUR) == (off_t)-1) {
if ((errno != ESPIPE) || (bb_copyfd_size(fd, -1, skip) != skip)) { if ((errno != ESPIPE) || (bb_copyfd_size(fd, -1, skip) != skip)) {
bb_error_msg_and_die("Seek failure"); bb_error_msg_and_die("seek failure");
} }
} }
} }
@ -65,7 +66,7 @@ static void unzip_create_leading_dirs(char *fn)
/* Create all leading directories */ /* Create all leading directories */
char *name = xstrdup(fn); char *name = xstrdup(fn);
if (bb_make_directory(dirname(name), 0777, FILEUTILS_RECUR)) { if (bb_make_directory(dirname(name), 0777, FILEUTILS_RECUR)) {
bb_error_msg_and_die("Exiting"); /* bb_make_directory is noisy */ bb_error_msg_and_die("exiting"); /* bb_make_directory is noisy */
} }
free(name); free(name);
} }
@ -76,7 +77,7 @@ static int unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
/* Method 0 - stored (not compressed) */ /* Method 0 - stored (not compressed) */
int size = zip_header->formatted.ucmpsize; int size = zip_header->formatted.ucmpsize;
if (size && (bb_copyfd_size(src_fd, dst_fd, size) != size)) { if (size && (bb_copyfd_size(src_fd, dst_fd, size) != size)) {
bb_error_msg_and_die("Cannot complete extraction"); bb_error_msg_and_die("cannot complete extraction");
} }
} else { } else {
@ -86,12 +87,12 @@ static int unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
inflate_cleanup(); inflate_cleanup();
/* Validate decompression - crc */ /* Validate decompression - crc */
if (zip_header->formatted.crc32 != (gunzip_crc ^ 0xffffffffL)) { if (zip_header->formatted.crc32 != (gunzip_crc ^ 0xffffffffL)) {
bb_error_msg("Invalid compressed data--crc error"); bb_error_msg("invalid compressed data--%s error", "crc");
return 1; return 1;
} }
/* Validate decompression - size */ /* Validate decompression - size */
if (zip_header->formatted.ucmpsize != gunzip_bytes_out) { if (zip_header->formatted.ucmpsize != gunzip_bytes_out) {
bb_error_msg("Invalid compressed data--length error"); bb_error_msg("invalid compressed data--%s error", "length");
return 1; return 1;
} }
} }

View File

@ -7,11 +7,6 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/ */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include "busybox.h" #include "busybox.h"
/* From <linux/vt.h> */ /* From <linux/vt.h> */
@ -29,7 +24,7 @@ int chvt_main(int argc, char **argv)
} }
fd = get_console_fd(); fd = get_console_fd();
num = bb_xgetlarg(argv[1], 10, 0, INT_MAX); num = xatoul_range(argv[1], 1, 63);
if ((-1 == ioctl(fd, VT_ACTIVATE, num)) if ((-1 == ioctl(fd, VT_ACTIVATE, num))
|| (-1 == ioctl(fd, VT_WAITACTIVE, num))) { || (-1 == ioctl(fd, VT_WAITACTIVE, num))) {
bb_perror_msg_and_die("ioctl"); bb_perror_msg_and_die("ioctl");

View File

@ -10,11 +10,6 @@
/* no options, no getopt */ /* no options, no getopt */
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include "busybox.h" #include "busybox.h"
/* From <linux/vt.h> */ /* From <linux/vt.h> */
@ -26,15 +21,13 @@ int deallocvt_main(int argc, char *argv[])
int num = 0; int num = 0;
switch (argc) { switch (argc) {
case 2: case 2:
if ((num = bb_xgetlarg(argv[1], 10, 0, INT_MAX)) == 0) { num = xatoul_range(argv[1], 1, 63);
bb_error_msg_and_die("0: illegal VT number");
}
/* Fallthrough */ /* Fallthrough */
case 1: case 1:
break; break;
default: default:
bb_show_usage(); bb_show_usage();
} }
if (-1 == ioctl(get_console_fd(), VT_DISALLOCATE, num)) { if (-1 == ioctl(get_console_fd(), VT_DISALLOCATE, num)) {

View File

@ -10,14 +10,6 @@
/* getopt not needed */ /* getopt not needed */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <ctype.h>
#include "busybox.h" #include "busybox.h"
int openvt_main(int argc, char **argv) int openvt_main(int argc, char **argv)
@ -29,8 +21,8 @@ int openvt_main(int argc, char **argv)
if (argc < 3) { if (argc < 3) {
bb_show_usage(); bb_show_usage();
} }
/* check for Illegal vt number: < 1 or > 12 */ /* check for illegal vt number: < 1 or > 63 */
sprintf(vtname, VC_FORMAT, (int)bb_xgetlarg(argv[1], 10, 1, 12)); sprintf(vtname, VC_FORMAT, (int)xatoul_range(argv[1], 1, 63));
if (fork() == 0) { if (fork() == 0) {
/* leave current vt */ /* leave current vt */

View File

@ -27,7 +27,6 @@ enum {
extern int extern int
setkeycodes_main(int argc, char** argv) setkeycodes_main(int argc, char** argv)
{ {
char *ep;
int fd, sc; int fd, sc;
struct kbkeycode a; struct kbkeycode a;
@ -38,19 +37,13 @@ setkeycodes_main(int argc, char** argv)
fd = get_console_fd(); fd = get_console_fd();
while (argc > 2) { while (argc > 2) {
a.keycode = atoi(argv[2]); a.keycode = xatoul_range(argv[2], 0, 127);
a.scancode = sc = strtol(argv[1], &ep, 16); a.scancode = sc = xstrtoul_range(argv[1], 16, 0, 255);
if (*ep) {
bb_error_msg_and_die("error reading SCANCODE: '%s'", argv[1]);
}
if (a.scancode > 127) { if (a.scancode > 127) {
a.scancode -= 0xe000; a.scancode -= 0xe000;
a.scancode += 128; a.scancode += 128;
} }
if (a.scancode > 255 || a.keycode > 127) { if (ioctl(fd, KDSETKEYCODE, &a)) {
bb_error_msg_and_die("SCANCODE or KEYCODE outside bounds");
}
if (ioctl(fd,KDSETKEYCODE,&a)) {
bb_perror_msg_and_die("failed to set SCANCODE %x to KEYCODE %d", sc, a.keycode); bb_perror_msg_and_die("failed to set SCANCODE %x to KEYCODE %d", sc, a.keycode);
} }
argc -= 2; argc -= 2;

View File

@ -22,7 +22,7 @@ extern int setlogcons_main(int argc, char **argv)
arg.subarg = 0; /* to specified console (current as default) */ arg.subarg = 0; /* to specified console (current as default) */
if (argc == 2) if (argc == 2)
arg.subarg = atoi(argv[1]); arg.subarg = xatoul_range(argv[1], 0, 63);
if (ioctl(xopen(VC_1, O_RDONLY), TIOCLINUX, &arg)) if (ioctl(xopen(VC_1, O_RDONLY), TIOCLINUX, &arg))
bb_perror_msg_and_die("TIOCLINUX"); bb_perror_msg_and_die("TIOCLINUX");

View File

@ -112,9 +112,9 @@ int cal_main(int argc, char **argv)
} }
} else { } else {
if (argc == 2) { if (argc == 2) {
month = bb_xgetularg10_bnd(*argv++, 1, 12); month = xatoul_range(*argv++, 1, 12);
} }
year = bb_xgetularg10_bnd(*argv, 1, 9999); year = xatoul_range(*argv, 1, 9999);
} }
blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian); blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian);

View File

@ -163,17 +163,7 @@ static void cut_file(FILE * file)
} }
} }
static int getval(char *ntok) static const char _op_on_field[] = " only when operating on fields";
{
char *junk;
int i = strtoul(ntok, &junk, 10);
if (*junk != '\0' || i < 0)
bb_error_msg_and_die("invalid byte or field list");
return i;
}
static const char * const _op_on_field = " only when operating on fields";
int cut_main(int argc, char **argv) int cut_main(int argc, char **argv)
{ {
@ -231,7 +221,7 @@ int cut_main(int argc, char **argv)
} else if (strlen(ntok) == 0) { } else if (strlen(ntok) == 0) {
s = BOL; s = BOL;
} else { } else {
s = getval(ntok); s = xatoi_u(ntok);
/* account for the fact that arrays are zero based, while /* account for the fact that arrays are zero based, while
* the user expects the first char on the line to be char #1 */ * the user expects the first char on the line to be char #1 */
if (s != 0) if (s != 0)
@ -245,7 +235,7 @@ int cut_main(int argc, char **argv)
} else if (strlen(ntok) == 0) { } else if (strlen(ntok) == 0) {
e = EOL; e = EOL;
} else { } else {
e = getval(ntok); e = xatoi_u(ntok);
/* if the user specified and end position of 0, that means "til the /* if the user specified and end position of 0, that means "til the
* end of the line */ * end of the line */
if (e == 0) if (e == 0)

View File

@ -62,19 +62,19 @@ int dd_main(int argc, char **argv)
for (n = 1; n < argc; n++) { for (n = 1; n < argc; n++) {
// FIXME: make them capable of eating LARGE numbers // FIXME: make them capable of eating LARGE numbers
if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("ibs=", argv[n], 4)) { if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("ibs=", argv[n], 4)) {
ibs = bb_xparse_number(argv[n]+4, dd_suffixes); ibs = xatoul_sfx(argv[n]+4, dd_suffixes);
flags |= twobufs_flag; flags |= twobufs_flag;
} else if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("obs=", argv[n], 4)) { } else if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("obs=", argv[n], 4)) {
obs = bb_xparse_number(argv[n]+4, dd_suffixes); obs = xatoul_sfx(argv[n]+4, dd_suffixes);
flags |= twobufs_flag; flags |= twobufs_flag;
} else if (!strncmp("bs=", argv[n], 3)) } else if (!strncmp("bs=", argv[n], 3))
ibs = obs = bb_xparse_number(argv[n]+3, dd_suffixes); ibs = obs = xatoul_sfx(argv[n]+3, dd_suffixes);
else if (!strncmp("count=", argv[n], 6)) else if (!strncmp("count=", argv[n], 6))
count = bb_xparse_number(argv[n]+6, dd_suffixes); count = xatoul_sfx(argv[n]+6, dd_suffixes);
else if (!strncmp("seek=", argv[n], 5)) else if (!strncmp("seek=", argv[n], 5))
seek = bb_xparse_number(argv[n]+5, dd_suffixes); seek = xatoul_sfx(argv[n]+5, dd_suffixes);
else if (!strncmp("skip=", argv[n], 5)) else if (!strncmp("skip=", argv[n], 5))
skip = bb_xparse_number(argv[n]+5, dd_suffixes); skip = xatoul_sfx(argv[n]+5, dd_suffixes);
else if (!strncmp("if=", argv[n], 3)) else if (!strncmp("if=", argv[n], 3))
infile = argv[n]+3; infile = argv[n]+3;
else if (!strncmp("of=", argv[n], 3)) else if (!strncmp("of=", argv[n], 3))

View File

@ -1192,7 +1192,7 @@ int diff_main(int argc, char **argv)
context = 3; /* This is the default number of lines of context. */ context = 3; /* This is the default number of lines of context. */
if (cmd_flags & FLAG_U) { if (cmd_flags & FLAG_U) {
context = bb_xgetlarg(U_opt, 10, 1, INT_MAX); context = xatoul_range(U_opt, 1, INT_MAX);
} }
argc -= optind; argc -= optind;
argv += optind; argv += optind;

View File

@ -215,7 +215,7 @@ int du_main(int argc, char **argv)
one_file_system = opt & (1 << 5); /* -x opt */ one_file_system = opt & (1 << 5); /* -x opt */
if((opt & (1 << 6))) { if((opt & (1 << 6))) {
/* -d opt */ /* -d opt */
max_print_depth = bb_xgetularg10_bnd(smax_print_depth, 0, INT_MAX); max_print_depth = xatoi_u(smax_print_depth);
} }
if((opt & (1 << 7))) { if((opt & (1 << 7))) {
/* -l opt */ /* -l opt */

View File

@ -62,7 +62,7 @@ int fold_main(int argc, char **argv)
flags = getopt32(argc, argv, "bsw:", &w_opt); flags = getopt32(argc, argv, "bsw:", &w_opt);
if (flags & FLAG_WIDTH) if (flags & FLAG_WIDTH)
width = bb_xgetlarg(w_opt, 10, 1, 10000); width = xatoul_range(w_opt, 1, 10000);
argv += optind; argv += optind;
if (!*argv) { if (!*argv) {

View File

@ -64,32 +64,30 @@ int head_main(int argc, char **argv)
while ((opt = getopt(argc, argv, head_opts)) > 0) { while ((opt = getopt(argc, argv, head_opts)) > 0) {
switch (opt) { switch (opt) {
#if ENABLE_FEATURE_FANCY_HEAD #if ENABLE_FEATURE_FANCY_HEAD
case 'q': case 'q':
header_threshhold = INT_MAX; header_threshhold = INT_MAX;
break; break;
case 'v': case 'v':
header_threshhold = -1; header_threshhold = -1;
break; break;
case 'c': case 'c':
count_bytes = 1; count_bytes = 1;
/* fall through */ /* fall through */
#endif #endif
case 'n': case 'n':
p = optarg; p = optarg;
#if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_HEAD #if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_HEAD
GET_COUNT: GET_COUNT:
#endif #endif
#if !ENABLE_FEATURE_FANCY_HEAD #if !ENABLE_FEATURE_FANCY_HEAD
count = bb_xgetularg10(p); count = xatoul(p);
#else #else
count = bb_xgetularg_bnd_sfx(p, 10, count = xatoul_sfx(p, head_suffixes);
0, ULONG_MAX,
head_suffixes);
#endif #endif
break; break;
default: default:
bb_show_usage(); bb_show_usage();
} }
} }

View File

@ -163,8 +163,8 @@ static int list_single(struct dnode *);
static unsigned int all_fmt; static unsigned int all_fmt;
#ifdef CONFIG_FEATURE_AUTOWIDTH #ifdef CONFIG_FEATURE_AUTOWIDTH
static int terminal_width = TERMINAL_WIDTH; static unsigned terminal_width = TERMINAL_WIDTH;
static unsigned short tabstops = COLUMN_GAP; static unsigned tabstops = COLUMN_GAP;
#else #else
#define tabstops COLUMN_GAP #define tabstops COLUMN_GAP
#define terminal_width TERMINAL_WIDTH #define terminal_width TERMINAL_WIDTH
@ -915,10 +915,10 @@ int ls_main(int argc, char **argv)
#endif #endif
); );
if (tabstops_str) { if (tabstops_str) {
tabstops = atoi(tabstops_str); tabstops = xatou(tabstops_str);
} }
if (terminal_width_str) { if (terminal_width_str) {
terminal_width = atoi(terminal_width_str); terminal_width = xatou(terminal_width_str);
} }
#else #else
opt = getopt32(argc, argv, ls_options opt = getopt32(argc, argv, ls_options

View File

@ -9,11 +9,8 @@
/* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ /* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/sysmacros.h> // For makedev #include <sys/sysmacros.h> // For makedev
#include <unistd.h>
#include "busybox.h" #include "busybox.h"
#include "libcoreutils/coreutils.h" #include "libcoreutils/coreutils.h"
@ -37,8 +34,8 @@ int mknod_main(int argc, char **argv)
if ((*name != 'p') && ((argc -= 2) == 2)) { if ((*name != 'p') && ((argc -= 2) == 2)) {
/* Autodetect what the system supports; thexe macros should /* Autodetect what the system supports; thexe macros should
* optimize out to two constants. */ * optimize out to two constants. */
dev = makedev(bb_xgetularg10_bnd(argv[2], 0, major(UINT_MAX)), dev = makedev(xatoul_range(argv[2], 0, major(UINT_MAX)),
bb_xgetularg10_bnd(argv[3], 0, minor(UINT_MAX))); xatoul_range(argv[3], 0, minor(UINT_MAX)));
} }
if (argc == 2) { if (argc == 2) {

View File

@ -52,7 +52,7 @@ int nice_main(int argc, char **argv)
if (argc < 4) { /* Missing priority and/or utility! */ if (argc < 4) { /* Missing priority and/or utility! */
bb_show_usage(); bb_show_usage();
} }
adjustment = bb_xgetlarg(argv[1], 10, INT_MIN, INT_MAX); adjustment = xatoi(argv[1]);
argv += 2; argv += 2;
} }

View File

@ -30,7 +30,7 @@
%b = print an argument string, interpreting backslash escapes %b = print an argument string, interpreting backslash escapes
The `format' argument is re-used as many times as necessary The 'format' argument is re-used as many times as necessary
to convert all of the given arguments. to convert all of the given arguments.
David MacKenzie <djm@gnu.ai.mit.edu> */ David MacKenzie <djm@gnu.ai.mit.edu> */
@ -57,7 +57,7 @@ static void multiconvert(char *arg, void *result, converter convert)
fputs(arg, stderr); fputs(arg, stderr);
} }
static unsigned long xstrtoul(char *arg) static unsigned long my_xstrtoul(char *arg)
{ {
unsigned long result; unsigned long result;
@ -65,14 +65,14 @@ static unsigned long xstrtoul(char *arg)
return result; return result;
} }
static long xstrtol(char *arg) static long my_xstrtol(char *arg)
{ {
long result; long result;
multiconvert(arg, &result, (converter)safe_strtol); multiconvert(arg, &result, (converter)safe_strtol);
return result; return result;
} }
static double xstrtod(char *arg) static double my_xstrtod(char *arg)
{ {
double result; double result;
multiconvert(arg, &result, (converter)safe_strtod); multiconvert(arg, &result, (converter)safe_strtod);
@ -120,13 +120,13 @@ int printf_main(int argc, char **argv)
} }
/* Print the text in FORMAT, using ARGV (with ARGC elements) for /* Print the text in FORMAT, using ARGV (with ARGC elements) for
arguments to any `%' directives. arguments to any '%' directives.
Return the number of elements of ARGV used. */ Return the number of elements of ARGV used. */
static int print_formatted(char *format, int argc, char **argv) static int print_formatted(char *format, int argc, char **argv)
{ {
int save_argc = argc; /* Preserve original value. */ int save_argc = argc; /* Preserve original value. */
char *f; /* Pointer into `format'. */ char *f; /* Pointer into 'format'. */
char *direc_start; /* Start of % directive. */ char *direc_start; /* Start of % directive. */
size_t direc_length; /* Length of % directive. */ size_t direc_length; /* Length of % directive. */
int field_width; /* Arg to first '*', or -1 if none. */ int field_width; /* Arg to first '*', or -1 if none. */
@ -158,7 +158,7 @@ static int print_formatted(char *format, int argc, char **argv)
++f; ++f;
++direc_length; ++direc_length;
if (argc > 0) { if (argc > 0) {
field_width = xstrtoul(*argv); field_width = my_xstrtoul(*argv);
++argv; ++argv;
--argc; --argc;
} else } else
@ -175,7 +175,7 @@ static int print_formatted(char *format, int argc, char **argv)
++f; ++f;
++direc_length; ++direc_length;
if (argc > 0) { if (argc > 0) {
precision = xstrtoul(*argv); precision = my_xstrtoul(*argv);
++argv; ++argv;
--argc; --argc;
} else } else
@ -235,14 +235,14 @@ print_direc(char *start, size_t length, int field_width, int precision,
case 'i': case 'i':
if (field_width < 0) { if (field_width < 0) {
if (precision < 0) if (precision < 0)
printf(p, xstrtol(argument)); printf(p, my_xstrtol(argument));
else else
printf(p, precision, xstrtol(argument)); printf(p, precision, my_xstrtol(argument));
} else { } else {
if (precision < 0) if (precision < 0)
printf(p, field_width, xstrtol(argument)); printf(p, field_width, my_xstrtol(argument));
else else
printf(p, field_width, precision, xstrtol(argument)); printf(p, field_width, precision, my_xstrtol(argument));
} }
break; break;
@ -252,14 +252,14 @@ print_direc(char *start, size_t length, int field_width, int precision,
case 'X': case 'X':
if (field_width < 0) { if (field_width < 0) {
if (precision < 0) if (precision < 0)
printf(p, xstrtoul(argument)); printf(p, my_xstrtoul(argument));
else else
printf(p, precision, xstrtoul(argument)); printf(p, precision, my_xstrtoul(argument));
} else { } else {
if (precision < 0) if (precision < 0)
printf(p, field_width, xstrtoul(argument)); printf(p, field_width, my_xstrtoul(argument));
else else
printf(p, field_width, precision, xstrtoul(argument)); printf(p, field_width, precision, my_xstrtoul(argument));
} }
break; break;
@ -270,14 +270,14 @@ print_direc(char *start, size_t length, int field_width, int precision,
case 'G': case 'G':
if (field_width < 0) { if (field_width < 0) {
if (precision < 0) if (precision < 0)
printf(p, xstrtod(argument)); printf(p, my_xstrtod(argument));
else else
printf(p, precision, xstrtod(argument)); printf(p, precision, my_xstrtod(argument));
} else { } else {
if (precision < 0) if (precision < 0)
printf(p, field_width, xstrtod(argument)); printf(p, field_width, my_xstrtod(argument));
else else
printf(p, field_width, precision, xstrtod(argument)); printf(p, field_width, precision, my_xstrtod(argument));
} }
break; break;

View File

@ -24,7 +24,7 @@
#include "busybox.h" #include "busybox.h"
#ifdef CONFIG_FEATURE_FANCY_SLEEP #ifdef CONFIG_FEATURE_FANCY_SLEEP
static const struct suffix_mult sleep_suffixes[] = { static const struct suffix_mult sfx[] = {
{ "s", 1 }, { "s", 1 },
{ "m", 60 }, { "m", 60 },
{ "h", 60*60 }, { "h", 60*60 },
@ -46,9 +46,7 @@ int sleep_main(int argc, char **argv)
++argv; ++argv;
duration = 0; duration = 0;
do { do {
duration += bb_xgetularg_bnd_sfx(*argv, 10, duration += xatoul_range_sfx(*argv, 0, UINT_MAX-duration, sfx);
0, UINT_MAX-duration,
sleep_suffixes);
} while (*++argv); } while (*++argv);
#else /* CONFIG_FEATURE_FANCY_SLEEP */ #else /* CONFIG_FEATURE_FANCY_SLEEP */
@ -57,11 +55,7 @@ int sleep_main(int argc, char **argv)
bb_show_usage(); bb_show_usage();
} }
#if UINT_MAX == ULONG_MAX duration = xatou(argv[1]);
duration = bb_xgetularg10(argv[1]);
#else
duration = bb_xgetularg10_bnd(argv[1], 0, UINT_MAX);
#endif
#endif /* CONFIG_FEATURE_FANCY_SLEEP */ #endif /* CONFIG_FEATURE_FANCY_SLEEP */

View File

@ -370,9 +370,9 @@ enum {
}; };
/* The width of the screen, for output wrapping */ /* The width of the screen, for output wrapping */
static int max_col; static unsigned max_col = 80; /* default */
/* Current position, to know when to wrap */ /* Current position, to know when to wrap */
static int current_col; static unsigned current_col;
static const char *device_name = bb_msg_standard_input; static const char *device_name = bb_msg_standard_input;
/* Return a string that is the printable representation of character CH */ /* Return a string that is the printable representation of character CH */
@ -422,7 +422,7 @@ static tcflag_t *mode_type_flag(unsigned type, const struct termios *mode)
static speed_t string_to_baud_or_die(const char *arg) static speed_t string_to_baud_or_die(const char *arg)
{ {
return tty_value_to_baud(bb_xparse_number(arg, 0)); return tty_value_to_baud(xatou(arg));
} }
static void set_speed_or_die(enum speed_setting type, const char *arg, static void set_speed_or_die(enum speed_setting type, const char *arg,
@ -556,9 +556,8 @@ static inline void display_window_size(int fancy) {}
#endif /* !TIOCGWINSZ */ #endif /* !TIOCGWINSZ */
static int screen_columns(void) static int screen_columns_or_die(void)
{ {
int columns;
const char *s; const char *s;
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
@ -574,11 +573,10 @@ static int screen_columns(void)
return win.ws_col; return win.ws_col;
#endif #endif
columns = 80; s = getenv("COLUMNS");
if ((s = getenv("COLUMNS"))) { if (s)
columns = atoi(s); return xatoi_u(s);
} return 80;
return columns;
} }
static const struct suffix_mult stty_suffixes[] = { static const struct suffix_mult stty_suffixes[] = {
@ -745,14 +743,14 @@ end_option:
#ifdef HAVE_C_LINE #ifdef HAVE_C_LINE
case param_line: case param_line:
# ifndef TIOCGWINSZ # ifndef TIOCGWINSZ
bb_xparse_number(argnext, stty_suffixes); xatoul_range_sfx(argnext, 1, INT_MAX, stty_suffixes);
break; break;
# endif /* else fall-through */ # endif /* else fall-through */
#endif #endif
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
case param_rows: case param_rows:
case param_cols: case param_cols:
bb_xparse_number(argnext, stty_suffixes); xatoul_range_sfx(argnext, 1, INT_MAX, stty_suffixes);
break; break;
case param_size: case param_size:
#endif #endif
@ -802,7 +800,7 @@ end_option:
perror_on_device_and_die("%s"); perror_on_device_and_die("%s");
if (verbose_output || recoverable_output || noargs) { if (verbose_output || recoverable_output || noargs) {
max_col = screen_columns(); max_col = screen_columns_or_die();
output_func(&mode); output_func(&mode);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -846,24 +844,22 @@ end_option:
switch (param) { switch (param) {
#ifdef HAVE_C_LINE #ifdef HAVE_C_LINE
case param_line: case param_line:
mode.c_line = bb_xparse_number(argnext, stty_suffixes); mode.c_line = xatoul_sfx(argnext, stty_suffixes);
require_set_attr = 1; require_set_attr = 1;
break; break;
#endif #endif
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
case param_cols: case param_cols:
set_window_size(-1, (int) bb_xparse_number(argnext, stty_suffixes)); set_window_size(-1, xatoul_sfx(argnext, stty_suffixes));
break; break;
case param_size: case param_size:
max_col = screen_columns();
display_window_size(0); display_window_size(0);
break; break;
case param_rows: case param_rows:
set_window_size((int) bb_xparse_number(argnext, stty_suffixes), -1); set_window_size(xatoul_sfx(argnext, stty_suffixes), -1);
break; break;
#endif #endif
case param_speed: case param_speed:
max_col = screen_columns();
display_speed(&mode, 0); display_speed(&mode, 0);
break; break;
case param_ispeed: case param_ispeed:
@ -1096,7 +1092,7 @@ static void set_control_char_or_die(const struct control_info *info,
unsigned char value; unsigned char value;
if (info->name == stty_min || info->name == stty_time) if (info->name == stty_min || info->name == stty_time)
value = bb_xparse_number(arg, stty_suffixes); value = xatoul_range_sfx(arg, 0, 0xff, stty_suffixes);
else if (arg[0] == '\0' || arg[1] == '\0') else if (arg[0] == '\0' || arg[1] == '\0')
value = arg[0]; value = arg[0];
else if (streq(arg, "^-") || streq(arg, "undef")) else if (streq(arg, "^-") || streq(arg, "undef"))
@ -1106,7 +1102,7 @@ static void set_control_char_or_die(const struct control_info *info,
if (arg[1] == '?') if (arg[1] == '?')
value = 127; value = 127;
} else } else
value = bb_xparse_number(arg, stty_suffixes); value = xatoul_range_sfx(arg, 0, 0xff, stty_suffixes);
mode->c_cc[info->offset] = value; mode->c_cc[info->offset] = value;
} }

View File

@ -132,7 +132,7 @@ int tail_main(int argc, char **argv)
#if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_TAIL #if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_TAIL
GET_COUNT: GET_COUNT:
#endif #endif
count = bb_xgetlarg10_sfx(optarg, tail_suffixes); count = xatol_sfx(optarg, tail_suffixes);
/* Note: Leading whitespace is an error trapped above. */ /* Note: Leading whitespace is an error trapped above. */
if (*optarg == '+') { if (*optarg == '+') {
from_top = 1; from_top = 1;
@ -148,7 +148,7 @@ int tail_main(int argc, char **argv)
header_threshhold = INT_MAX; header_threshhold = INT_MAX;
break; break;
case 's': case 's':
sleep_period =bb_xgetularg10_bnd(optarg, 0, UINT_MAX); sleep_period = xatou(optarg);
break; break;
case 'v': case 'v':
header_threshhold = 0; header_threshhold = 0;

View File

@ -37,7 +37,7 @@ int uniq_main(int argc, char **argv)
while ((opt = getopt(argc, argv, uniq_opts)) > 0) { while ((opt = getopt(argc, argv, uniq_opts)) > 0) {
if ((opt == 'f') || (opt == 's')) { if ((opt == 'f') || (opt == 's')) {
int t = bb_xgetularg10(optarg); int t = xatoul(optarg);
if (opt == 'f') { if (opt == 'f') {
skip_fields = t; skip_fields = t;
} else { } else {

View File

@ -20,7 +20,7 @@ int usleep_main(int argc, char **argv)
bb_show_usage(); bb_show_usage();
} }
if (usleep(bb_xgetularg10_bnd(argv[1], 0, UINT_MAX))) { if (usleep(xatou(argv[1]))) {
bb_perror_nomsg_and_die(); bb_perror_nomsg_and_die();
} }

View File

@ -28,7 +28,7 @@ int watch_main(int argc, char **argv)
/* don't use getopt, because it permutes the arguments */ /* don't use getopt, because it permutes the arguments */
++argv; ++argv;
if ((argc > 3) && argv[0][0] == '-' && argv[0][1] == 'n') { if ((argc > 3) && argv[0][0] == '-' && argv[0][1] == 'n') {
period = bb_xgetularg10_bnd(argv[1], 1, UINT_MAX); period = xatou(argv[1]);
argv += 2; argv += 2;
} }
watched_argv = argv; watched_argv = argv;

View File

@ -60,31 +60,31 @@ int run_parts_main(int argc, char **argv)
umask(022); umask(022);
while ((opt = getopt_long (argc, argv, "tu:a:", while ((opt = getopt_long(argc, argv, "tu:a:",
runparts_long_options, NULL)) > 0) runparts_long_options, NULL)) > 0)
{ {
switch (opt) { switch (opt) {
/* Enable test mode */ /* Enable test mode */
case 't': case 't':
test_mode++; test_mode++;
break; break;
/* Set the umask of the programs executed */ /* Set the umask of the programs executed */
case 'u': case 'u':
/* Check and set the umask of the program executed. As stated in the original /* Check and set the umask of the program executed. As stated in the original
* run-parts, the octal conversion in libc is not foolproof; it will take the * run-parts, the octal conversion in libc is not foolproof; it will take the
* 8 and 9 digits under some circumstances. We'll just have to live with it. * 8 and 9 digits under some circumstances. We'll just have to live with it.
*/ */
umask(bb_xgetlarg(optarg, 8, 0, 07777)); umask(xstrtoul_range(optarg, 8, 0, 07777));
break; break;
/* Pass an argument to the programs */ /* Pass an argument to the programs */
case 'a': case 'a':
/* Add an argument to the commands that we will call. /* Add an argument to the commands that we will call.
* Called once for every argument. */ * Called once for every argument. */
args = xrealloc(args, (argcount + 2) * (sizeof(char *))); args = xrealloc(args, (argcount + 2) * (sizeof(char *)));
args[argcount++] = optarg; args[argcount++] = optarg;
break; break;
default: default:
bb_show_usage(); bb_show_usage();
} }
} }

View File

@ -260,7 +260,7 @@ int start_stop_daemon_main(int argc, char **argv)
// USE_FEATURE_START_STOP_DAEMON_FANCY( // USE_FEATURE_START_STOP_DAEMON_FANCY(
// if (retry_arg) // if (retry_arg)
// retries = bb_xgetlarg(retry_arg, 10, 0, INT_MAX); // retries = xatoi_u(retry_arg);
// ) // )
argc -= optind; argc -= optind;
argv += optind; argv += optind;

View File

@ -87,7 +87,7 @@ int patch_main(int argc, char **argv)
char *p, *i; char *p, *i;
ret = getopt32(argc, argv, "p:i:", &p, &i); ret = getopt32(argc, argv, "p:i:", &p, &i);
if (ret & 1) if (ret & 1)
patch_level = bb_xgetlarg(p, 10, -1, USHRT_MAX); patch_level = xatol_range(p, -1, USHRT_MAX);
if (ret & 2) { if (ret & 2) {
patch_file = xfopen(i, "r"); patch_file = xfopen(i, "r");
} else { } else {

View File

@ -216,53 +216,47 @@ int find_main(int argc, char **argv)
#endif #endif
#ifdef CONFIG_FEATURE_FIND_PERM #ifdef CONFIG_FEATURE_FIND_PERM
} else if (strcmp(argv[i], "-perm") == 0) { } else if (strcmp(argv[i], "-perm") == 0) {
char *end;
if (++i == argc) if (++i == argc)
bb_error_msg_and_die(bb_msg_requires_arg, "-perm"); bb_error_msg_and_die(bb_msg_requires_arg, "-perm");
perm_mask = strtol(argv[i], &end, 8); perm_mask = xstrtol_range(argv[i], 8, 0, 07777);
if ((end[0] != '\0') || (perm_mask > 07777)) perm_char = argv[i][0];
bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-perm"); if (perm_char == '-')
if ((perm_char = argv[i][0]) == '-')
perm_mask = -perm_mask; perm_mask = -perm_mask;
#endif #endif
#ifdef CONFIG_FEATURE_FIND_MTIME #ifdef CONFIG_FEATURE_FIND_MTIME
} else if (strcmp(argv[i], "-mtime") == 0) { } else if (strcmp(argv[i], "-mtime") == 0) {
char *end;
if (++i == argc) if (++i == argc)
bb_error_msg_and_die(bb_msg_requires_arg, "-mtime"); bb_error_msg_and_die(bb_msg_requires_arg, "-mtime");
mtime_days = strtol(argv[i], &end, 10); mtime_days = xatol(argv[i]);
if (end[0] != '\0') mtime_char = argv[i][0];
bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-mtime"); if (mtime_char == '-')
if ((mtime_char = argv[i][0]) == '-')
mtime_days = -mtime_days; mtime_days = -mtime_days;
#endif #endif
#ifdef CONFIG_FEATURE_FIND_MMIN #ifdef CONFIG_FEATURE_FIND_MMIN
} else if (strcmp(argv[i], "-mmin") == 0) { } else if (strcmp(argv[i], "-mmin") == 0) {
char *end;
if (++i == argc) if (++i == argc)
bb_error_msg_and_die(bb_msg_requires_arg, "-mmin"); bb_error_msg_and_die(bb_msg_requires_arg, "-mmin");
mmin_mins = strtol(argv[i], &end, 10); mmin_mins = xatol(argv[i]);
if (end[0] != '\0') mmin_char = argv[i][0];
bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-mmin"); if (mmin_char == '-')
if ((mmin_char = argv[i][0]) == '-')
mmin_mins = -mmin_mins; mmin_mins = -mmin_mins;
#endif #endif
#ifdef CONFIG_FEATURE_FIND_XDEV #ifdef CONFIG_FEATURE_FIND_XDEV
} else if (strcmp(argv[i], "-xdev") == 0) { } else if (strcmp(argv[i], "-xdev") == 0) {
struct stat stbuf; struct stat stbuf;
xdev_count = ( firstopt - 1 ) ? ( firstopt - 1 ) : 1; xdev_count = (firstopt - 1) ? (firstopt - 1) : 1;
xdev_dev = xmalloc ( xdev_count * sizeof( dev_t )); xdev_dev = xmalloc(xdev_count * sizeof(dev_t));
if ( firstopt == 1 ) { if (firstopt == 1) {
xstat ( ".", &stbuf ); xstat(".", &stbuf);
xdev_dev [0] = stbuf. st_dev; xdev_dev[0] = stbuf.st_dev;
} }
else { else {
for (i = 1; i < firstopt; i++) { for (i = 1; i < firstopt; i++) {
xstat ( argv [i], &stbuf ); xstat(argv[i], &stbuf);
xdev_dev [i-1] = stbuf. st_dev; xdev_dev[i-1] = stbuf.st_dev;
} }
} }
#endif #endif
@ -271,17 +265,14 @@ int find_main(int argc, char **argv)
struct stat stat_newer; struct stat stat_newer;
if (++i == argc) if (++i == argc)
bb_error_msg_and_die(bb_msg_requires_arg, "-newer"); bb_error_msg_and_die(bb_msg_requires_arg, "-newer");
xstat (argv[i], &stat_newer); xstat(argv[i], &stat_newer);
newer_mtime = stat_newer.st_mtime; newer_mtime = stat_newer.st_mtime;
#endif #endif
#ifdef CONFIG_FEATURE_FIND_INUM #ifdef CONFIG_FEATURE_FIND_INUM
} else if (strcmp(argv[i], "-inum") == 0) { } else if (strcmp(argv[i], "-inum") == 0) {
char *end;
if (++i == argc) if (++i == argc)
bb_error_msg_and_die(bb_msg_requires_arg, "-inum"); bb_error_msg_and_die(bb_msg_requires_arg, "-inum");
inode_num = strtol(argv[i], &end, 10); inode_num = xatoul(argv[i]);
if (end[0] != '\0')
bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-inum");
#endif #endif
#ifdef CONFIG_FEATURE_FIND_EXEC #ifdef CONFIG_FEATURE_FIND_EXEC
} else if (strcmp(argv[i], "-exec") == 0) { } else if (strcmp(argv[i], "-exec") == 0) {

View File

@ -426,7 +426,7 @@ int xargs_main(int argc, char **argv)
orig_arg_max -= 2048; /* POSIX.2 requires subtracting 2048 */ orig_arg_max -= 2048; /* POSIX.2 requires subtracting 2048 */
if (opt & OPT_UPTO_SIZE) { if (opt & OPT_UPTO_SIZE) {
n_max_chars = bb_xgetularg10_bnd(max_chars, 1, orig_arg_max); n_max_chars = xatoul_range(max_chars, 1, orig_arg_max);
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
n_chars += strlen(*argv) + 1; n_chars += strlen(*argv) + 1;
} }
@ -446,7 +446,7 @@ int xargs_main(int argc, char **argv)
max_chars = xmalloc(n_max_chars); max_chars = xmalloc(n_max_chars);
if (opt & OPT_UPTO_NUMBER) { if (opt & OPT_UPTO_NUMBER) {
n_max_arg = bb_xgetularg10_bnd(max_args, 1, INT_MAX); n_max_arg = xatoul_range(max_args, 1, INT_MAX);
} else { } else {
n_max_arg = n_max_chars; n_max_arg = n_max_chars;
} }

View File

@ -267,46 +267,68 @@ extern void *xmalloc(size_t size);
extern void *xrealloc(void *old, size_t size); extern void *xrealloc(void *old, size_t size);
extern void *xzalloc(size_t size); extern void *xzalloc(size_t size);
extern char *xstrdup (const char *s); extern char *xstrdup(const char *s);
extern char *xstrndup (const char *s, int n); extern char *xstrndup(const char *s, int n);
extern char *safe_strncpy(char *dst, const char *src, size_t size); extern char *safe_strncpy(char *dst, const char *src, size_t size);
extern int safe_strtoi(char *arg, int* value); // FIXME: the prototype doesn't match libc strtoXX -> confusion
extern int safe_strtod(char *arg, double* value); // FIXME: alot of unchecked strtoXXX are still in tree
extern int safe_strtol(char *arg, long* value); // FIXME: atoi_or_else(str, N)?
extern int safe_strtoll(char *arg, long long* value); extern int safe_strtoi(const char *arg, int* value);
extern int safe_strtoul(char *arg, unsigned long* value); extern int safe_strtou(const char *arg, unsigned* value);
extern int safe_strtoull(char *arg, unsigned long long* value); extern int safe_strtod(const char *arg, double* value);
extern int safe_strtol(const char *arg, long* value);
extern int safe_strtoll(const char *arg, long long* value);
extern int safe_strtoul(const char *arg, unsigned long* value);
extern int safe_strtoull(const char *arg, unsigned long long* value);
extern int safe_strtou32(const char *arg, uint32_t* value);
struct suffix_mult { struct suffix_mult {
const char *suffix; const char *suffix;
unsigned int mult; unsigned int mult;
}; };
extern unsigned long bb_xgetularg_bnd_sfx(const char *arg, int base, unsigned long xstrtoul_range_sfx(const char *numstr, int base,
unsigned long lower, unsigned long lower,
unsigned long upper, unsigned long upper,
const struct suffix_mult *suffixes); const struct suffix_mult *suffixes);
extern unsigned long bb_xgetularg_bnd(const char *arg, int base, unsigned long xstrtoul_range(const char *numstr, int base,
unsigned long lower, unsigned long lower,
unsigned long upper); unsigned long upper);
extern unsigned long bb_xgetularg10_bnd(const char *arg, unsigned long xstrtoul(const char *numstr, int base);
unsigned long xatoul_range_sfx(const char *numstr,
unsigned long lower,
unsigned long upper,
const struct suffix_mult *suffixes);
unsigned long xatoul_sfx(const char *numstr,
const struct suffix_mult *suffixes);
unsigned long xatoul_range(const char *numstr,
unsigned long lower, unsigned long lower,
unsigned long upper); unsigned long upper);
extern unsigned long bb_xgetularg10(const char *arg); unsigned long xatoul(const char *numstr);
unsigned long long xatoull(const char *numstr);
extern long bb_xgetlarg(const char *arg, int base, long xstrtol_range_sfx(const char *numstr, int base,
long lower,
long upper);
extern long bb_xgetlarg_bnd_sfx(const char *arg, int base,
long lower, long lower,
long upper, long upper,
const struct suffix_mult *suffixes); const struct suffix_mult *suffixes);
extern long bb_xgetlarg10_sfx(const char *arg, const struct suffix_mult *suffixes); long xstrtol_range(const char *numstr, int base, long lower, long upper);
long xatol_range_sfx(const char *numstr,
long lower,
extern unsigned long bb_xparse_number(const char *numstr, long upper,
const struct suffix_mult *suffixes); const struct suffix_mult *suffixes);
long xatol_range(const char *numstr, long lower, long upper);
long xatol_sfx(const char *numstr, const struct suffix_mult *suffixes);
long xatol(const char *numstr);
/* Specialized: */
unsigned xatou(const char *numstr);
int xatoi(const char *numstr);
/* Using xatoi() instead of naive atoi() is not always convenient -
* in many places people want *non-negative* values, but store them
* in signed int. Therefore we need this one:
* dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc */
int xatoi_u(const char *numstr);
uint32_t xatou32(const char *numstr);
/* Useful for reading port numbers */
uint16_t xatou16(const char *numstr);
/* These parse entries in /etc/passwd and /etc/group. This is desirable /* These parse entries in /etc/passwd and /etc/group. This is desirable
* for BusyBox since we want to avoid using the glibc NSS stuff, which * for BusyBox since we want to avoid using the glibc NSS stuff, which
@ -329,7 +351,7 @@ extern int device_open(const char *device, int mode);
extern char *query_loop(const char *device); extern char *query_loop(const char *device);
extern int del_loop(const char *device); extern int del_loop(const char *device);
extern int set_loop(char **device, const char *file, int offset); extern int set_loop(char **device, const char *file, unsigned long long offset);
#if (__GLIBC__ < 2) #if (__GLIBC__ < 2)
extern int vdprintf(int d, const char *format, va_list ap); extern int vdprintf(int d, const char *format, va_list ap);

View File

@ -92,7 +92,7 @@ extern char get_header_tar_lzma(archive_handle_t *archive_handle);
extern char get_header_tar_gz(archive_handle_t *archive_handle); extern char get_header_tar_gz(archive_handle_t *archive_handle);
extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount); extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount);
extern void seek_by_char(const archive_handle_t *archive_handle, const unsigned int amount); extern void seek_by_read(const archive_handle_t *archive_handle, const unsigned int amount);
extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count); extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count);

View File

@ -35,7 +35,7 @@ RB_AUTOBOOT
/* Parse and handle arguments */ /* Parse and handle arguments */
flags = getopt32(argc, argv, "d:nf", &delay); flags = getopt32(argc, argv, "d:nf", &delay);
if (flags&1) sleep(atoi(delay)); if (flags&1) sleep(xatou(delay));
if (!(flags&2)) sync(); if (!(flags&2)) sync();
/* Perform action. */ /* Perform action. */

View File

@ -15,7 +15,7 @@ lib-y:= \
human_readable.o inet_common.o inode_hash.o isdirectory.o \ human_readable.o inet_common.o inode_hash.o isdirectory.o \
kernel_version.o last_char_is.o login.o \ kernel_version.o last_char_is.o login.o \
make_directory.o md5.o mode_string.o mtab_file.o \ make_directory.o md5.o mode_string.o mtab_file.o \
obscure.o parse_mode.o parse_number.o perror_msg.o \ obscure.o parse_mode.o perror_msg.o \
perror_msg_and_die.o get_console.o \ perror_msg_and_die.o get_console.o \
process_escape_sequence.o procps.o \ process_escape_sequence.o procps.o \
recursive_action.o remove_file.o \ recursive_action.o remove_file.o \
@ -23,7 +23,7 @@ lib-y:= \
safe_strncpy.o setup_environment.o sha1.o simplify_path.o \ safe_strncpy.o setup_environment.o sha1.o simplify_path.o \
trim.o u_signal_names.o vdprintf.o verror_msg.o \ trim.o u_signal_names.o vdprintf.o verror_msg.o \
vherror_msg.o vperror_msg.o wfopen.o xconnect.o xgetcwd.o \ vherror_msg.o vperror_msg.o wfopen.o xconnect.o xgetcwd.o \
xgethostbyname.o xgethostbyname2.o xreadlink.o xgetlarg.o \ xgethostbyname.o xgethostbyname2.o xreadlink.o \
fclose_nonstdin.o fflush_stdout_and_exit.o \ fclose_nonstdin.o fflush_stdout_and_exit.o \
getopt32.o default_error_retval.o wfopen_input.o speed_table.o \ getopt32.o default_error_retval.o wfopen_input.o speed_table.o \
perror_nomsg_and_die.o perror_nomsg.o skip_whitespace.o bb_askpass.o \ perror_nomsg_and_die.o perror_nomsg.o skip_whitespace.o bb_askpass.o \
@ -55,7 +55,7 @@ lib-$(CONFIG_DEVFSD) += xregcomp.o
lib-y += messages.o lib-y += messages.o
lib-y += xfuncs.o lib-y += xfuncs.o
lib-y += printf.o lib-y += printf.o
lib-y += xgetularg.o lib-y += xatol.o
lib-y += safe_strtol.o lib-y += safe_strtol.o
lib-y += bb_pwd.o lib-y += bb_pwd.o
lib-y += llist.o lib-y += llist.o

View File

@ -48,11 +48,12 @@ char *query_loop(const char *device)
{ {
int fd; int fd;
bb_loop_info loopinfo; bb_loop_info loopinfo;
char *dev=0; char *dev = 0;
if ((fd = open(device, O_RDONLY)) < 0) return 0; fd = open(device, O_RDONLY);
if (fd < 0) return 0;
if (!ioctl(fd, BB_LOOP_GET_STATUS, &loopinfo)) if (!ioctl(fd, BB_LOOP_GET_STATUS, &loopinfo))
dev=xasprintf("%ld %s", (long) loopinfo.lo_offset, dev = xasprintf("%ld %s", (long) loopinfo.lo_offset,
(char *)loopinfo.lo_file_name); (char *)loopinfo.lo_file_name);
close(fd); close(fd);
@ -64,8 +65,9 @@ int del_loop(const char *device)
{ {
int fd, rc; int fd, rc;
if ((fd = open(device, O_RDONLY)) < 0) return 1; fd = open(device, O_RDONLY);
rc=ioctl(fd, LOOP_CLR_FD, 0); if (fd < 0) return 1;
rc = ioctl(fd, LOOP_CLR_FD, 0);
close(fd); close(fd);
return rc; return rc;
@ -77,7 +79,7 @@ int del_loop(const char *device)
search will re-use an existing loop device already bound to that search will re-use an existing loop device already bound to that
file/offset if it finds one. file/offset if it finds one.
*/ */
int set_loop(char **device, const char *file, int offset) int set_loop(char **device, const char *file, unsigned long long offset)
{ {
char dev[20], *try; char dev[20], *try;
bb_loop_info loopinfo; bb_loop_info loopinfo;
@ -85,34 +87,43 @@ int set_loop(char **device, const char *file, int offset)
int i, dfd, ffd, mode, rc=-1; int i, dfd, ffd, mode, rc=-1;
/* Open the file. Barf if this doesn't work. */ /* Open the file. Barf if this doesn't work. */
if((ffd = open(file, mode=O_RDWR))<0 && (ffd = open(file,mode=O_RDONLY))<0) mode = O_RDWR;
return -errno; ffd = open(file, mode);
if (ffd < 0) {
mode = O_RDONLY;
ffd = open(file, mode);
if (ffd < 0)
return -errno;
}
/* Find a loop device. */ /* Find a loop device. */
try=*device ? : dev; try = *device ? : dev;
for(i=0;rc;i++) { for (i=0;rc;i++) {
sprintf(dev, LOOP_FORMAT, i); sprintf(dev, LOOP_FORMAT, i);
/* Ran out of block devices, return failure. */ /* Ran out of block devices, return failure. */
if(stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) { if (stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) {
rc=-ENOENT; rc=-ENOENT;
break; break;
} }
/* Open the sucker and check its loopiness. */ /* Open the sucker and check its loopiness. */
if((dfd=open(try, mode))<0 && errno==EROFS) dfd = open(try, mode);
dfd=open(try, mode = O_RDONLY); if (dfd < 0 && errno == EROFS) {
if(dfd<0) goto try_again; mode = O_RDONLY;
dfd = open(try, mode);
}
if (dfd < 0) goto try_again;
rc=ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo); rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);
/* If device free, claim it. */ /* If device free, claim it. */
if(rc && errno==ENXIO) { if (rc && errno == ENXIO) {
memset(&loopinfo, 0, sizeof(loopinfo)); memset(&loopinfo, 0, sizeof(loopinfo));
safe_strncpy((char *)loopinfo.lo_file_name, file, LO_NAME_SIZE); safe_strncpy((char *)loopinfo.lo_file_name, file, LO_NAME_SIZE);
loopinfo.lo_offset = offset; loopinfo.lo_offset = offset;
/* Associate free loop device with file. */ /* Associate free loop device with file. */
if(!ioctl(dfd, LOOP_SET_FD, ffd)) { if (!ioctl(dfd, LOOP_SET_FD, ffd)) {
if (!ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo)) rc=0; if (!ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo)) rc = 0;
else ioctl(dfd, LOOP_CLR_FD, 0); else ioctl(dfd, LOOP_CLR_FD, 0);
} }
@ -121,15 +132,16 @@ int set_loop(char **device, const char *file, int offset)
file isn't pretty either. In general, mounting the same file twice file isn't pretty either. In general, mounting the same file twice
without using losetup manually is problematic.) without using losetup manually is problematic.)
*/ */
} else if(strcmp(file,(char *)loopinfo.lo_file_name) } else if (strcmp(file,(char *)loopinfo.lo_file_name)
|| offset!=loopinfo.lo_offset) rc=-1; || offset!=loopinfo.lo_offset) rc = -1;
close(dfd); close(dfd);
try_again: try_again:
if(*device) break; if (*device) break;
} }
close(ffd); close(ffd);
if(!rc) { if (!rc) {
if(!*device) *device=strdup(dev); if (!*device) *device = strdup(dev);
return mode==O_RDONLY ? 1 : 0; return mode==O_RDONLY ? 1 : 0;
} else return rc; }
return rc;
} }

View File

@ -1,50 +0,0 @@
/* vi: set sw=4 ts=4: */
/*
* bb_xparse_number implementation for busybox
*
* Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#include <assert.h>
#include "libbb.h"
unsigned long bb_xparse_number(const char *numstr,
const struct suffix_mult *suffixes)
{
unsigned long int r;
char *e;
int old_errno;
/* Since this is a lib function, we're not allowed to reset errno to 0.
* Doing so could break an app that is deferring checking of errno.
* So, save the old value so that we can restore it if successful. */
old_errno = errno;
errno = 0;
r = strtoul(numstr, &e, 10);
if ((numstr != e) && !errno) {
errno = old_errno; /* Ok. So restore errno. */
if (!*e) {
return r;
}
if (suffixes) {
assert(suffixes->suffix); /* No nul suffixes. */
do {
if (strcmp(suffixes->suffix, e) == 0) {
if (ULONG_MAX / suffixes->mult < r) { /* Overflow! */
break;
}
return r * suffixes->mult;
}
++suffixes;
} while (suffixes->suffix);
}
}
bb_error_msg_and_die("invalid number '%s'", numstr);
}

View File

@ -7,21 +7,10 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/ */
#include <stdlib.h>
#include <errno.h>
#include <assert.h> #include <assert.h>
#include "libbb.h" #include "libbb.h"
int safe_strtoi(char *arg, int* value) int safe_strtod(const char *arg, double* value)
{
int error;
long lvalue = *value;
error = safe_strtol(arg, &lvalue);
*value = (int) lvalue;
return error;
}
int safe_strtod(char *arg, double* value)
{ {
char *endptr; char *endptr;
int errno_save = errno; int errno_save = errno;
@ -29,44 +18,31 @@ int safe_strtod(char *arg, double* value)
assert(arg!=NULL); assert(arg!=NULL);
errno = 0; errno = 0;
*value = strtod(arg, &endptr); *value = strtod(arg, &endptr);
if (errno != 0 || *endptr!='\0' || endptr==arg) { if (errno != 0 || *endptr != '\0' || endptr == arg) {
return 1; return 1;
} }
errno = errno_save; errno = errno_save;
return 0; return 0;
} }
int safe_strtol(char *arg, long* value) int safe_strtoull(const char *arg, unsigned long long* value)
{ {
char *endptr; char *endptr;
int errno_save = errno; int errno_save = errno;
assert(arg!=NULL); assert(arg!=NULL);
if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
return 1;
errno = 0; errno = 0;
*value = strtol(arg, &endptr, 0); *value = strtoull(arg, &endptr, 0);
if (errno != 0 || *endptr!='\0' || endptr==arg) { if (errno != 0 || *endptr != '\0' || endptr == arg) {
return 1; return 1;
} }
errno = errno_save; errno = errno_save;
return 0; return 0;
} }
int safe_strtoul(char *arg, unsigned long* value) int safe_strtoll(const char *arg, long long* value)
{
char *endptr;
int errno_save = errno;
assert(arg!=NULL);
errno = 0;
*value = strtoul(arg, &endptr, 0);
if (errno != 0 || *endptr!='\0' || endptr==arg) {
return 1;
}
errno = errno_save;
return 0;
}
int safe_strtoll(char *arg, long long* value)
{ {
char *endptr; char *endptr;
int errno_save = errno; int errno_save = errno;
@ -74,24 +50,100 @@ int safe_strtoll(char *arg, long long* value)
assert(arg!=NULL); assert(arg!=NULL);
errno = 0; errno = 0;
*value = strtoll(arg, &endptr, 0); *value = strtoll(arg, &endptr, 0);
if (errno != 0 || *endptr!='\0' || endptr==arg) { if (errno != 0 || *endptr != '\0' || endptr == arg) {
return 1; return 1;
} }
errno = errno_save; errno = errno_save;
return 0; return 0;
} }
int safe_strtoull(char *arg, unsigned long long* value) int safe_strtoul(const char *arg, unsigned long* value)
{
char *endptr;
int errno_save = errno;
assert(arg!=NULL);
if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
return 1;
errno = 0;
*value = strtoul(arg, &endptr, 0);
if (errno != 0 || *endptr != '\0' || endptr == arg) {
return 1;
}
errno = errno_save;
return 0;
}
int safe_strtol(const char *arg, long* value)
{ {
char *endptr; char *endptr;
int errno_save = errno; int errno_save = errno;
assert(arg!=NULL); assert(arg!=NULL);
errno = 0; errno = 0;
*value = strtoull(arg, &endptr, 0); *value = strtol(arg, &endptr, 0);
if (errno != 0 || *endptr!='\0' || endptr==arg) { if (errno != 0 || *endptr != '\0' || endptr == arg) {
return 1; return 1;
} }
errno = errno_save; errno = errno_save;
return 0; return 0;
} }
/* TODO: This is what uclibc is doing. Try to do the same? */
#if 0
#if defined __HAVE_ELF__
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
#else /* !defined __HAVE_ELF__ */
# define strong_alias(name, aliasname) _strong_alias (name, aliasname)
# define _strong_alias(name, aliasname) \
__asm__(".global " __C_SYMBOL_PREFIX__ #aliasname "\n" \
".set " __C_SYMBOL_PREFIX__ #aliasname "," __C_SYMBOL_PREFIX__ #name);
#endif
#endif
int safe_strtoi(const char *arg, int* value)
{
if (sizeof(long) == sizeof(int)) {
return safe_strtol(arg, (long*)value);
} else {
int error;
long lvalue = *value;
error = safe_strtol(arg, &lvalue);
if (lvalue < INT_MIN || lvalue > INT_MAX)
return 1;
*value = (int) lvalue;
return error;
}
}
int safe_strtou(const char *arg, unsigned* value)
{
if (sizeof(unsigned long) == sizeof(unsigned)) {
return safe_strtoul(arg, (unsigned long*)value);
} else {
int error;
unsigned long lvalue = *value;
error = safe_strtoul(arg, &lvalue);
if (lvalue > UINT_MAX)
return 1;
*value = (unsigned) lvalue;
return error;
}
}
int BUG_safe_strtou32_unimplemented(void);
int safe_strtou32(const char *arg, uint32_t* value)
{
if (sizeof(uint32_t) == sizeof(unsigned))
return safe_strtou(arg, (unsigned*)value);
if (sizeof(uint32_t) == sizeof(unsigned long))
return safe_strtoul(arg, (unsigned long*)value);
return BUG_safe_strtou32_unimplemented();
}

210
libbb/xatol.c Normal file
View File

@ -0,0 +1,210 @@
/* vi: set sw=4 ts=4: */
/*
* ascii-to-numbers implementations for busybox
*
* Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
*
* Licensed under GPLv2, see file LICENSE in this tarball for details.
*/
#include "libbb.h"
unsigned long long xatoull(const char *numstr)
{
unsigned long long r;
int old_errno;
char *e;
if ((*numstr == '-') || (isspace)(*numstr))
bb_error_msg_and_die("invalid number '%s'", numstr);
old_errno = errno;
errno = 0;
r = strtoull(numstr, &e, 10);
if (errno || (numstr == e) || *e)
/* Error / no digits / illegal trailing chars */
bb_error_msg_and_die("invalid number '%s'", numstr);
/* No error. So restore errno. */
errno = old_errno;
return r;
}
unsigned long xstrtoul_range_sfx(const char *numstr, int base,
unsigned long lower,
unsigned long upper,
const struct suffix_mult *suffixes)
{
unsigned long r;
int old_errno;
char *e;
/* Disallow '-' and any leading whitespace. Speed isn't critical here
* since we're parsing commandline args. So make sure we get the
* actual isspace function rather than a lnumstrer macro implementaion. */
if ((*numstr == '-') || (isspace)(*numstr))
goto inval;
/* Since this is a lib function, we're not allowed to reset errno to 0.
* Doing so could break an app that is deferring checking of errno.
* So, save the old value so that we can restore it if successful. */
old_errno = errno;
errno = 0;
r = strtoul(numstr, &e, base);
/* Do the initial validity check. Note: The standards do not
* guarantee that errno is set if no digits were found. So we
* must test for this explicitly. */
if (errno || (numstr == e))
goto inval; /* error / no digits / illegal trailing chars */
errno = old_errno; /* Ok. So restore errno. */
/* Do optional suffix parsing. Allow 'empty' suffix tables.
* Note that we also allow nul suffixes with associated multipliers,
* to allow for scaling of the numstr by some default multiplier. */
if (suffixes) {
while (suffixes->suffix) {
if (strcmp(suffixes->suffix, e) == 0) {
if (ULONG_MAX / suffixes->mult < r)
goto range; /* overflow! */
++e;
r *= suffixes->mult;
break;
}
++suffixes;
}
}
/* Note: trailing space is an error.
It would be easy enough to allow though if desired. */
if (*e)
goto inval;
/* Finally, check for range limits. */
if (r >= lower && r <= upper)
return r;
range:
bb_error_msg_and_die("number %s is not in %lu..%lu range",
numstr, lower, upper);
inval:
bb_error_msg_and_die("invalid number '%s'", numstr);
}
unsigned long xstrtoul_range(const char *numstr, int base,
unsigned long lower,
unsigned long upper)
{
return xstrtoul_range_sfx(numstr, base, lower, upper, NULL);
}
unsigned long xstrtoul(const char *numstr, int base)
{
return xstrtoul_range_sfx(numstr, base, 0, ULONG_MAX, NULL);
}
unsigned long xatoul_range_sfx(const char *numstr,
unsigned long lower,
unsigned long upper,
const struct suffix_mult *suffixes)
{
return xstrtoul_range_sfx(numstr, 10, lower, upper, suffixes);
}
unsigned long xatoul_sfx(const char *numstr,
const struct suffix_mult *suffixes)
{
return xstrtoul_range_sfx(numstr, 10, 0, ULONG_MAX, suffixes);
}
unsigned long xatoul_range(const char *numstr,
unsigned long lower,
unsigned long upper)
{
return xstrtol_range_sfx(numstr, 10, lower, upper, NULL);
}
unsigned long xatoul(const char *numstr)
{
return xatoul_sfx(numstr, NULL);
}
/* Signed ones */
long xstrtol_range_sfx(const char *numstr, int base,
long lower,
long upper,
const struct suffix_mult *suffixes)
{
unsigned long u = LONG_MAX;
long r;
const char *p = numstr;
if ((p[0] == '-') && (p[1] != '+')) {
++p;
++u; /* two's complement */
}
r = xstrtoul_range_sfx(p, base, 0, u, suffixes);
if (*numstr == '-') {
r = -r;
}
if (r < lower || r > upper) {
bb_error_msg_and_die("number %s is not in %ld..%ld range",
numstr, lower, upper);
}
return r;
}
long xstrtol_range(const char *numstr, int base, long lower, long upper)
{
return xstrtol_range_sfx(numstr, base, lower, upper, NULL);
}
long xatol_range_sfx(const char *numstr,
long lower,
long upper,
const struct suffix_mult *suffixes)
{
return xstrtol_range_sfx(numstr, 10, lower, upper, suffixes);
}
long xatol_range(const char *numstr, long lower, long upper)
{
return xstrtol_range_sfx(numstr, 10, lower, upper, NULL);
}
long xatol_sfx(const char *numstr, const struct suffix_mult *suffixes)
{
return xstrtol_range_sfx(numstr, 10, LONG_MIN, LONG_MAX, suffixes);
}
long xatol(const char *numstr)
{
return xstrtol_range_sfx(numstr, 10, LONG_MIN, LONG_MAX, NULL);
}
/* Others */
unsigned xatou(const char *numstr)
{
return xatoul_range(numstr, 0, UINT_MAX);
}
int xatoi(const char *numstr)
{
return xatol_range(numstr, INT_MIN, INT_MAX);
}
int xatoi_u(const char *numstr)
{
return xatoul_range(numstr, 0, INT_MAX);
}
uint32_t xatou32(const char *numstr)
{
return xatoul_range(numstr, 0, 0xffffffff);
}
uint16_t xatou16(const char *numstr)
{
return xatoul_range(numstr, 0, 0xffff);
}

View File

@ -1,32 +0,0 @@
/* vi: set sw=4 ts=4: */
/*
* Copyright (C) 2003-2004 Erik Andersen <andersen@codepoet.org>
*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <errno.h>
#include <assert.h>
#include <ctype.h>
#include "libbb.h"
long bb_xgetlarg(const char *arg, int base, long lower, long upper)
{
long result;
char *endptr;
int errno_save = errno;
if (ENABLE_DEBUG && arg==NULL)
bb_error_msg_and_die("Null in xgetlarg.");
errno = 0;
result = strtol(arg, &endptr, base);
if (errno != 0 || *endptr!='\0' || endptr==arg || result < lower || result > upper)
bb_show_usage();
errno = errno_save;
return result;
}

View File

@ -1,127 +0,0 @@
/* vi: set sw=4 ts=4: */
/*
* xgetularg* implementations for busybox
*
* Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include "libbb.h"
unsigned long bb_xgetularg_bnd_sfx(const char *arg, int base,
unsigned long lower,
unsigned long upper,
const struct suffix_mult *suffixes)
{
unsigned long r;
int old_errno;
char *e;
assert(arg);
/* Disallow '-' and any leading whitespace. Speed isn't critical here
* since we're parsing commandline args. So make sure we get the
* actual isspace function rather than a larger macro implementaion. */
if ((*arg == '-') || (isspace)(*arg)) {
bb_show_usage();
}
/* Since this is a lib function, we're not allowed to reset errno to 0.
* Doing so could break an app that is deferring checking of errno.
* So, save the old value so that we can restore it if successful. */
old_errno = errno;
errno = 0;
r = strtoul(arg, &e, base);
/* Do the initial validity check. Note: The standards do not
* guarantee that errno is set if no digits were found. So we
* must test for this explicitly. */
if (errno || (arg == e)) { /* error or no digits */
bb_show_usage();
}
errno = old_errno; /* Ok. So restore errno. */
/* Do optional suffix parsing. Allow 'empty' suffix tables.
* Note that we also all nul suffixes with associated multipliers,
* to allow for scaling of the arg by some default multiplier. */
if (suffixes) {
while (suffixes->suffix) {
if (strcmp(suffixes->suffix, e) == 0) {
if (ULONG_MAX / suffixes->mult < r) { /* Overflow! */
bb_show_usage();
}
++e;
r *= suffixes->mult;
break;
}
++suffixes;
}
}
/* Finally, check for illegal trailing chars and range limits. */
/* Note: although we allow leading space (via stroul), trailing space
* is an error. It would be easy enough to allow though if desired. */
if (*e || (r < lower) || (r > upper)) {
bb_show_usage();
}
return r;
}
long bb_xgetlarg_bnd_sfx(const char *arg, int base,
long lower,
long upper,
const struct suffix_mult *suffixes)
{
unsigned long u = LONG_MAX;
long r;
const char *p = arg;
if ((*p == '-') && (p[1] != '+')) {
++p;
++u; /* two's complement */
}
r = bb_xgetularg_bnd_sfx(p, base, 0, u, suffixes);
if (*arg == '-') {
r = -r;
}
if ((r < lower) || (r > upper)) {
bb_show_usage();
}
return r;
}
long bb_xgetlarg10_sfx(const char *arg, const struct suffix_mult *suffixes)
{
return bb_xgetlarg_bnd_sfx(arg, 10, LONG_MIN, LONG_MAX, suffixes);
}
unsigned long bb_xgetularg_bnd(const char *arg, int base,
unsigned long lower,
unsigned long upper)
{
return bb_xgetularg_bnd_sfx(arg, base, lower, upper, NULL);
}
unsigned long bb_xgetularg10_bnd(const char *arg,
unsigned long lower,
unsigned long upper)
{
return bb_xgetularg_bnd(arg, 10, lower, upper);
}
unsigned long bb_xgetularg10(const char *arg)
{
return bb_xgetularg10_bnd(arg, 0, ULONG_MAX);
}

View File

@ -91,15 +91,14 @@ int addgroup_main(int argc, char **argv)
/* check for min, max and missing args and exit on error */ /* check for min, max and missing args and exit on error */
opt_complementary = "-1:?2:?"; opt_complementary = "-1:?2:?";
if (getopt32(argc, argv, "g:", &group)) { if (getopt32(argc, argv, "g:", &group)) {
gid = bb_xgetlarg(group, 10, 0, LONG_MAX); gid = xatoul_range(group, 0, (gid_t)ULONG_MAX);
} }
/* move past the commandline options */ /* move past the commandline options */
argv += optind; argv += optind;
/* need to be root */ /* need to be root */
if(geteuid()) { if (geteuid()) {
bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
} }

View File

@ -113,7 +113,7 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
struct options { struct options {
int flags; /* toggle switches, see below */ int flags; /* toggle switches, see below */
int timeout; /* time-out period */ unsigned timeout; /* time-out period */
char *login; /* login program */ char *login; /* login program */
char *tty; /* name of tty */ char *tty; /* name of tty */
char *initstring; /* modem init string */ char *initstring; /* modem init string */
@ -226,11 +226,12 @@ FILE *dbf;
static int bcode(const char *s) static int bcode(const char *s)
{ {
int r; int r;
unsigned long value; unsigned value;
if (safe_strtoul((char *)s, &value)) { if (safe_strtou((char *)s, &value)) {
return -1; return -1;
} }
if ((r = tty_value_to_baud(value)) > 0) { r = tty_value_to_baud(value);
if (r > 0) {
return r; return r;
} }
return 0; return 0;
@ -280,8 +281,7 @@ static void parse_args(int argc, char **argv, struct options *op)
} }
op->flags ^= F_ISSUE; /* revert flag show /etc/issue */ op->flags ^= F_ISSUE; /* revert flag show /etc/issue */
if(op->flags & F_TIMEOUT) { if(op->flags & F_TIMEOUT) {
if ((op->timeout = atoi(ts)) <= 0) op->timeout = xatoul_range(ts, 1, INT_MAX);
bb_error_msg_and_die("bad timeout value: %s", ts);
} }
debug("after getopt loop\n"); debug("after getopt loop\n");
if (argc < optind + 2) /* check parameter count */ if (argc < optind + 2) /* check parameter count */
@ -495,7 +495,8 @@ static void auto_baud(struct termio *tp)
buf[nread] = '\0'; buf[nread] = '\0';
for (bp = buf; bp < buf + nread; bp++) { for (bp = buf; bp < buf + nread; bp++) {
if (isascii(*bp) && isdigit(*bp)) { if (isascii(*bp) && isdigit(*bp)) {
if ((speed = bcode(bp))) { speed = bcode(bp);
if (speed) {
tp->c_cflag &= ~CBAUD; tp->c_cflag &= ~CBAUD;
tp->c_cflag |= speed; tp->c_cflag |= speed;
} }
@ -881,7 +882,7 @@ int getty_main(int argc, char **argv)
/* Set the optional timer. */ /* Set the optional timer. */
if (options.timeout) if (options.timeout)
(void) alarm((unsigned) options.timeout); (void) alarm(options.timeout);
/* optionally wait for CR or LF before writing /etc/issue */ /* optionally wait for CR or LF before writing /etc/issue */
if (options.flags & F_WAITCRLF) { if (options.flags & F_WAITCRLF) {

View File

@ -46,10 +46,8 @@ int sulogin_main(int argc, char **argv)
logmode = LOGMODE_BOTH; logmode = LOGMODE_BOTH;
openlog(applet_name, 0, LOG_AUTH); openlog(applet_name, 0, LOG_AUTH);
if (getopt32 (argc, argv, "t:", &timeout_arg)) { if (getopt32(argc, argv, "t:", &timeout_arg)) {
if (safe_strtoi(timeout_arg, &timeout)) { timeout = xatoi_u(timeout_arg);
timeout = 0;
}
} }
if (argv[optind]) { if (argv[optind]) {

View File

@ -55,7 +55,7 @@ int vlock_main(int argc, char **argv)
bb_show_usage(); bb_show_usage();
} }
o_lock_all = getopt32 (argc, argv, "a"); o_lock_all = getopt32(argc, argv, "a");
if((pw = getpwuid(getuid())) == NULL) { if((pw = getpwuid(getuid())) == NULL) {
bb_error_msg_and_die("Unknown uid %d", getuid()); bb_error_msg_and_die("Unknown uid %d", getuid());

View File

@ -12,10 +12,6 @@
*/ */
#include "busybox.h" #include "busybox.h"
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/timex.h> #include <sys/timex.h>
static const struct {int bit; const char *name;} statlist[] = { static const struct {int bit; const char *name;} statlist[] = {
@ -58,19 +54,19 @@ int adjtimex_main(int argc, char **argv)
&opt_o, &opt_f, &opt_p, &opt_t); &opt_o, &opt_f, &opt_p, &opt_t);
//if (opt & 0x1) // -q //if (opt & 0x1) // -q
if (opt & 0x2) { // -o if (opt & 0x2) { // -o
txc.offset = atoi(opt_o); txc.offset = xatoi(opt_o);
txc.modes |= ADJ_OFFSET_SINGLESHOT; txc.modes |= ADJ_OFFSET_SINGLESHOT;
} }
if (opt & 0x4) { // -f if (opt & 0x4) { // -f
txc.freq = atoi(opt_f); txc.freq = xatou(opt_f);
txc.modes |= ADJ_FREQUENCY; txc.modes |= ADJ_FREQUENCY;
} }
if (opt & 0x8) { // -p if (opt & 0x8) { // -p
txc.constant = atoi(opt_p); txc.constant = xatoi(opt_p);
txc.modes |= ADJ_TIMECONST; txc.modes |= ADJ_TIMECONST;
} }
if (opt & 0x10) { // -t if (opt & 0x10) { // -t
txc.tick = atoi(opt_t); txc.tick = xatoi(opt_t);
txc.modes |= ADJ_TICK; txc.modes |= ADJ_TICK;
} }
if (argc != optind) { /* no valid non-option parameters */ if (argc != optind) { /* no valid non-option parameters */

View File

@ -65,10 +65,10 @@ typedef struct CronLine {
#define DaemonUid 0 #define DaemonUid 0
#if ENABLE_DEBUG_CROND_OPTION #if ENABLE_DEBUG_CROND_OPTION
static short DebugOpt; static unsigned DebugOpt;
#endif #endif
static short LogLevel = 8; static unsigned LogLevel = 8;
static const char *LogFile; static const char *LogFile;
static const char *CDir = CRONTABS; static const char *CDir = CRONTABS;
@ -155,7 +155,7 @@ int crond_main(int ac, char **av)
#endif #endif
); );
if (opt & 1) { if (opt & 1) {
LogLevel = atoi(lopt); LogLevel = xatou(lopt);
} }
if (opt & 2) { if (opt & 2) {
if (*Lopt != 0) { if (*Lopt != 0) {
@ -169,7 +169,7 @@ int crond_main(int ac, char **av)
} }
#if ENABLE_DEBUG_CROND_OPTION #if ENABLE_DEBUG_CROND_OPTION
if (opt & 64) { if (opt & 64) {
DebugOpt = atoi(dopt); DebugOpt = xatou(dopt);
LogLevel = 0; LogLevel = 0;
} }
#endif #endif

View File

@ -171,7 +171,7 @@ static void stack_machine(const char *argument)
} }
o++; o++;
} }
bb_error_msg_and_die("%s: syntax error.", argument); bb_error_msg_and_die("%s: syntax error", argument);
} }
/* return pointer to next token in buffer and set *buffer to one char /* return pointer to next token in buffer and set *buffer to one char

View File

@ -2063,7 +2063,7 @@ static void parse_opts(unsigned long *get, unsigned long *set, unsigned long *va
} }
if (optarg) { if (optarg) {
*set = 1; *set = 1;
*value = bb_xgetlarg(optarg, 10, min, max); *value = xatol_range(optarg, min, max);
} }
} }
@ -2154,8 +2154,8 @@ int hdparm_main(int argc, char **argv)
#if ENABLE_FEATURE_HDPARM_HDIO_SCAN_HWIF #if ENABLE_FEATURE_HDPARM_HDIO_SCAN_HWIF
if (c == 'R') { if (c == 'R') {
parse_opts(NULL, &scan_hwif, &hwif_data, 0, INT_MAX); parse_opts(NULL, &scan_hwif, &hwif_data, 0, INT_MAX);
hwif_ctrl = bb_xgetlarg((argv[optind]) ? argv[optind] : "", 10, 0, INT_MAX); hwif_ctrl = xatoi_u((argv[optind]) ? argv[optind] : "");
hwif_irq = bb_xgetlarg((argv[optind+1]) ? argv[optind+1] : "", 10, 0, INT_MAX); hwif_irq = xatoi_u((argv[optind+1]) ? argv[optind+1] : "");
/* Move past the 2 additional arguments */ /* Move past the 2 additional arguments */
argv += 2; argv += 2;
argc -= 2; argc -= 2;

View File

@ -21,10 +21,10 @@ int makedevs_main(int argc, char **argv)
basedev = argv[1]; basedev = argv[1];
type = argv[2]; type = argv[2];
Smajor = atoi(argv[3]); Smajor = xatoi_u(argv[3]);
Sminor = atoi(argv[4]); Sminor = xatoi_u(argv[4]);
S = atoi(argv[5]); S = xatoi_u(argv[5]);
E = atoi(argv[6]); E = xatoi_u(argv[6]);
nodname = argc == 8 ? basedev : buf; nodname = argc == 8 ? basedev : buf;
mode = 0660; mode = 0660;

View File

@ -84,7 +84,7 @@ int mt_main(int argc, char **argv)
op.mt_op = code->value; op.mt_op = code->value;
if (argc >= 3) if (argc >= 3)
op.mt_count = atoi(argv[2]); op.mt_count = xatoi_u(argv[2]);
else else
op.mt_count = 1; /* One, not zero, right? */ op.mt_count = 1; /* One, not zero, right? */

View File

@ -34,7 +34,7 @@ int strings_main(int argc, char **argv)
argc -= optind; argc -= optind;
argv += optind; argv += optind;
n = bb_xgetlarg(n_arg, 10, 1, INT_MAX); n = xatoul_range(n_arg, 1, INT_MAX);
string = xzalloc(n + 1); string = xzalloc(n + 1);
n--; n--;
@ -45,7 +45,8 @@ int strings_main(int argc, char **argv)
} }
do { do {
if ((file = bb_wfopen(*argv, "r"))) { file = bb_wfopen(*argv, "r");
if (file) {
PIPE: PIPE:
count = 0; count = 0;
do { do {

View File

@ -26,13 +26,13 @@ static void watchdog_shutdown(int ATTRIBUTE_UNUSED unused)
int watchdog_main(int argc, char **argv) int watchdog_main(int argc, char **argv)
{ {
unsigned opts; unsigned opts;
unsigned long timer_duration = 30; /* Userspace timer duration, in seconds */ unsigned timer_duration = 30; /* Userspace timer duration, in seconds */
char *t_arg; char *t_arg;
opts = getopt32(argc, argv, "Ft:", &t_arg); opts = getopt32(argc, argv, "Ft:", &t_arg);
if (opts & OPT_TIMER) if (opts & OPT_TIMER)
timer_duration = bb_xgetlarg(t_arg, 10, 0, INT_MAX); timer_duration = xatou(t_arg);
/* We're only interested in the watchdog device .. */ /* We're only interested in the watchdog device .. */
if (optind < argc - 1 || argc == 1) if (optind < argc - 1 || argc == 1)

View File

@ -2652,7 +2652,7 @@ static int new_is_module_checksummed(struct obj_file *f)
{ {
const char *p = get_modinfo_value(f, "using_checksums"); const char *p = get_modinfo_value(f, "using_checksums");
if (p) if (p)
return atoi(p); return xatoi(p);
else else
return 0; return 0;
} }

View File

@ -41,8 +41,8 @@ enum cfg_e {
static int cfg; static int cfg;
static int s; static int s;
static int count = -1; static unsigned count = UINT_MAX;
static int timeout; static unsigned timeout;
static int sent; static int sent;
static int brd_sent; static int brd_sent;
static int received; static int received;
@ -276,9 +276,9 @@ int arping_main(int argc, char **argv)
&_count, &_timeout, &device, &source); &_count, &_timeout, &device, &source);
cfg |= opt & 0x3f; /* set respective flags */ cfg |= opt & 0x3f; /* set respective flags */
if (opt & 0x40) /* -c: count */ if (opt & 0x40) /* -c: count */
count = atoi(_count); count = xatou(_count);
if (opt & 0x80) /* -w: timeout */ if (opt & 0x80) /* -w: timeout */
timeout = atoi(_timeout); timeout = xatoul_range(_timeout, 0, INT_MAX/2000);
if (opt & 0x100) { /* -i: interface */ if (opt & 0x100) { /* -i: interface */
if (strlen(device) > IF_NAMESIZE) { if (strlen(device) > IF_NAMESIZE) {
bb_error_msg_and_die("interface name '%s' is too long", bb_error_msg_and_die("interface name '%s' is too long",

View File

@ -42,15 +42,15 @@ static int ftpcmd(const char *s1, const char *s2, FILE *stream, char *buf)
char *buf_ptr; char *buf_ptr;
if (fgets(buf, 510, stream) == NULL) { if (fgets(buf, 510, stream) == NULL) {
bb_perror_msg_and_die("fgets()"); bb_perror_msg_and_die("fgets");
} }
buf_ptr = strstr(buf, "\r\n"); buf_ptr = strstr(buf, "\r\n");
if (buf_ptr) { if (buf_ptr) {
*buf_ptr = '\0'; *buf_ptr = '\0';
} }
} while (! isdigit(buf[0]) || buf[3] != ' '); } while (!isdigit(buf[0]) || buf[3] != ' ');
return atoi(buf); return xatou(buf);
} }
static int xconnect_ftpdata(ftp_host_info_t *server, const char *buf) static int xconnect_ftpdata(ftp_host_info_t *server, const char *buf)
@ -60,14 +60,14 @@ static int xconnect_ftpdata(ftp_host_info_t *server, const char *buf)
buf_ptr = strrchr(buf, ','); buf_ptr = strrchr(buf, ',');
*buf_ptr = '\0'; *buf_ptr = '\0';
port_num = atoi(buf_ptr + 1); port_num = xatoul_range(buf_ptr + 1, 0, 255);
buf_ptr = strrchr(buf, ','); buf_ptr = strrchr(buf, ',');
*buf_ptr = '\0'; *buf_ptr = '\0';
port_num += atoi(buf_ptr + 1) * 256; port_num += xatoul_range(buf_ptr + 1, 0, 255) * 256;
server->s_in->sin_port=htons(port_num); server->s_in->sin_port = htons(port_num);
return(xconnect(server->s_in)); return xconnect(server->s_in);
} }
static FILE *ftp_login(ftp_host_info_t *server) static FILE *ftp_login(ftp_host_info_t *server)

View File

@ -1951,7 +1951,7 @@ int httpd_main(int argc, char *argv[])
#endif #endif
#if ENABLE_FEATURE_HTTPD_WITHOUT_INETD #if ENABLE_FEATURE_HTTPD_WITHOUT_INETD
if (opt & OPT_PORT) if (opt & OPT_PORT)
config->port = bb_xgetlarg(s_port, 10, 1, 0xffff); config->port = xatou16(s_port);
#if ENABLE_FEATURE_HTTPD_SETUID #if ENABLE_FEATURE_HTTPD_SETUID
if (opt & OPT_SETUID) { if (opt & OPT_SETUID) {
char *e; char *e;

View File

@ -379,7 +379,8 @@ int ifconfig_main(int argc, char **argv)
safe_strncpy(host, *argv, (sizeof host)); safe_strncpy(host, *argv, (sizeof host));
#ifdef CONFIG_FEATURE_IPV6 #ifdef CONFIG_FEATURE_IPV6
if ((prefix = strchr(host, '/'))) { prefix = strchr(host, '/');
if (prefix) {
if (safe_strtoi(prefix + 1, &prefix_len) || if (safe_strtoi(prefix + 1, &prefix_len) ||
(prefix_len < 0) || (prefix_len > 128)) (prefix_len < 0) || (prefix_len > 128))
{ {

View File

@ -149,8 +149,6 @@
#define _PATH_INETDPID "/var/run/inetd.pid" #define _PATH_INETDPID "/var/run/inetd.pid"
#define TOOMANY 0 /* don't start more than TOOMANY */
#define CNT_INTVL 60 /* servers in CNT_INTVL sec. */ #define CNT_INTVL 60 /* servers in CNT_INTVL sec. */
#define RETRYTIME (60*10) /* retry after bind or server fail */ #define RETRYTIME (60*10) /* retry after bind or server fail */
@ -297,7 +295,7 @@ static const struct builtin builtins[] = {
static int global_queuelen = 128; static int global_queuelen = 128;
static int nsock, maxsock; static int nsock, maxsock;
static fd_set allsock; static fd_set allsock;
static int toomany = TOOMANY; static int toomany;
static int timingout; static int timingout;
static struct servent *sp; static struct servent *sp;
static uid_t uid; static uid_t uid;
@ -588,10 +586,10 @@ static servtab_t *getconfigent(void)
sep = new_servtab(); sep = new_servtab();
/* memset(sep, 0, sizeof *sep); */ /* memset(sep, 0, sizeof *sep); */
more: more:
/* freeconfig(sep); */ /* freeconfig(sep); */
while ((cp = nextline()) && *cp == '#'); while ((cp = nextline()) && *cp == '#') /* skip comment line */;
if (cp == NULL) { if (cp == NULL) {
/* free(sep); */ /* free(sep); */
return NULL; return NULL;
@ -680,7 +678,7 @@ more:
} else if (*ccp != '\0') } else if (*ccp != '\0')
goto badafterall; goto badafterall;
#else #else
bb_error_msg("%s: rpc services not supported", sep->se_service); bb_error_msg("%s: rpc services not supported", sep->se_service);
#endif #endif
} }
} }
@ -692,7 +690,7 @@ more:
char *s = strchr(arg, '.'); char *s = strchr(arg, '.');
if (s) { if (s) {
*s++ = '\0'; *s++ = '\0';
sep->se_max = atoi(s); sep->se_max = xatoi(s);
} else } else
sep->se_max = toomany; sep->se_max = toomany;
} }
@ -928,7 +926,7 @@ static void config(int sig ATTRIBUTE_UNUSED)
*/ */
if ( if (
#ifdef INETD_FEATURE_ENABLED #ifdef INETD_FEATURE_ENABLED
cp->se_bi == 0 && cp->se_bi == 0 &&
#endif #endif
(sep->se_wait == 1 || cp->se_wait == 0)) (sep->se_wait == 1 || cp->se_wait == 0))
sep->se_wait = cp->se_wait; sep->se_wait = cp->se_wait;
@ -974,7 +972,7 @@ static void config(int sig ATTRIBUTE_UNUSED)
#ifdef CONFIG_FEATURE_INETD_RPC #ifdef CONFIG_FEATURE_INETD_RPC
if (isrpcservice(sep)) { if (isrpcservice(sep)) {
struct rpcent *rp; struct rpcent *rp;
// FIXME: atoi_or_else(str, 0) would be handy here
sep->se_rpcprog = atoi(sep->se_service); sep->se_rpcprog = atoi(sep->se_service);
if (sep->se_rpcprog == 0) { if (sep->se_rpcprog == 0) {
rp = getrpcbyname(sep->se_service); rp = getrpcbyname(sep->se_service);
@ -990,9 +988,9 @@ static void config(int sig ATTRIBUTE_UNUSED)
register_rpc(sep); register_rpc(sep);
} else } else
#endif #endif
{ {
u_short port = htons(atoi(sep->se_service)); u_short port = htons(atoi(sep->se_service));
// FIXME: atoi_or_else(str, 0) would be handy here
if (!port) { if (!port) {
/*XXX*/ strncpy(protoname, sep->se_proto, sizeof(protoname)); /*XXX*/ strncpy(protoname, sep->se_proto, sizeof(protoname));
if (isdigit(protoname[strlen(protoname) - 1])) if (isdigit(protoname[strlen(protoname) - 1]))
@ -1255,13 +1253,7 @@ inetd_main(int argc, char *argv[])
opt = getopt32(argc, argv, "R:f", &stoomany); opt = getopt32(argc, argv, "R:f", &stoomany);
if(opt & 1) { if(opt & 1) {
char *e; toomany = xatoi_u(stoomany);
toomany = strtoul(stoomany, &e, 0);
if (!(toomany >= 0 && *e == '\0')) {
toomany = TOOMANY;
bb_perror_msg("-R %s: bad value for service invocation rate", stoomany);
}
} }
argc -= optind; argc -= optind;
argv += optind; argv += optind;
@ -1317,7 +1309,6 @@ inetd_main(int argc, char *argv[])
sigaddset(&sa.sa_mask, SIGHUP); sigaddset(&sa.sa_mask, SIGHUP);
sa.sa_handler = retry; sa.sa_handler = retry;
sigaction(SIGALRM, &sa, NULL); sigaction(SIGALRM, &sa, NULL);
/* doconfig(); */
config(SIGHUP); config(SIGHUP);
sa.sa_handler = config; sa.sa_handler = config;
sigaction(SIGHUP, &sa, NULL); sigaction(SIGHUP, &sa, NULL);

View File

@ -363,7 +363,7 @@ static int nstrcmp(const char *a, const char *b)
} }
if (isdigit(*a) && isdigit(*b)) { if (isdigit(*a) && isdigit(*b)) {
return atoi(a_ptr) > atoi(b_ptr) ? 1 : -1; return xatoul(a_ptr) > xatoul(b_ptr) ? 1 : -1;
} }
return *a - *b; return *a - *b;
} }

View File

@ -18,8 +18,6 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#define IPCALC_MSG(CMD,ALTCMD) if (mode & SILENT) {ALTCMD;} else {CMD;}
#define CLASS_A_NETMASK ntohl(0xFF000000) #define CLASS_A_NETMASK ntohl(0xFF000000)
#define CLASS_B_NETMASK ntohl(0xFFFF0000) #define CLASS_B_NETMASK ntohl(0xFFFF0000)
#define CLASS_C_NETMASK ntohl(0xFFFFFF00) #define CLASS_C_NETMASK ntohl(0xFFFFFF00)
@ -56,6 +54,7 @@ static int get_prefix(unsigned long netmask)
int get_prefix(unsigned long netmask); int get_prefix(unsigned long netmask);
#endif #endif
#define NETMASK 0x01 #define NETMASK 0x01
#define BROADCAST 0x02 #define BROADCAST 0x02
#define NETWORK 0x04 #define NETWORK 0x04
@ -78,12 +77,9 @@ int get_prefix(unsigned long netmask);
#else #else
#define long_options 0 #define long_options 0
#endif #endif
int ipcalc_main(int argc, char **argv) int ipcalc_main(int argc, char **argv)
{ {
unsigned long mode; unsigned opt;
int have_netmask = 0; int have_netmask = 0;
in_addr_t netmask, broadcast, network, ipaddr; in_addr_t netmask, broadcast, network, ipaddr;
struct in_addr a; struct in_addr a;
@ -92,17 +88,18 @@ int ipcalc_main(int argc, char **argv)
if (ENABLE_FEATURE_IPCALC_LONG_OPTIONS) if (ENABLE_FEATURE_IPCALC_LONG_OPTIONS)
applet_long_options = long_options; applet_long_options = long_options;
mode = getopt32(argc, argv, "mbn" USE_FEATURE_IPCALC_FANCY("phs")); opt = getopt32(argc, argv, "mbn" USE_FEATURE_IPCALC_FANCY("phs"));
argc -= optind; argc -= optind;
argv += optind; argv += optind;
if (mode & (BROADCAST | NETWORK | NETPREFIX)) { if (opt & (BROADCAST | NETWORK | NETPREFIX)) {
if (argc > 2 || argc <= 0) if (argc > 2 || argc <= 0)
bb_show_usage(); bb_show_usage();
} else { } else {
if (argc != 1) if (argc != 1)
bb_show_usage(); bb_show_usage();
} }
if (opt & SILENT)
logmode = LOGMODE_NONE; /* Suppress error_msg() output */
ipstr = argv[0]; ipstr = argv[0];
if (ENABLE_FEATURE_IPCALC_FANCY) { if (ENABLE_FEATURE_IPCALC_FANCY) {
@ -111,17 +108,13 @@ int ipcalc_main(int argc, char **argv)
prefixstr = ipstr; prefixstr = ipstr;
while(*prefixstr) { while (*prefixstr) {
if (*prefixstr == '/') { if (*prefixstr == '/') {
*prefixstr = (char)0; *prefixstr = (char)0;
prefixstr++; prefixstr++;
if (*prefixstr) { if (*prefixstr) {
unsigned int msk; unsigned msk;
netprefix = xatoul_range(prefixstr, 0, 32);
if (safe_strtoul(prefixstr, &netprefix) || netprefix > 32) {
IPCALC_MSG(bb_error_msg_and_die("bad IP prefix: %s", prefixstr),
exit(EXIT_FAILURE));
}
netmask = 0; netmask = 0;
msk = 0x80000000; msk = 0x80000000;
while (netprefix > 0) { while (netprefix > 0) {
@ -142,21 +135,18 @@ int ipcalc_main(int argc, char **argv)
ipaddr = inet_aton(ipstr, &a); ipaddr = inet_aton(ipstr, &a);
if (ipaddr == 0) { if (ipaddr == 0) {
IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[0]), bb_error_msg_and_die("bad IP address: %s", argv[0]);
exit(EXIT_FAILURE));
} }
ipaddr = a.s_addr; ipaddr = a.s_addr;
if (argc == 2) { if (argc == 2) {
if (ENABLE_FEATURE_IPCALC_FANCY && have_netmask) { if (ENABLE_FEATURE_IPCALC_FANCY && have_netmask) {
IPCALC_MSG(bb_error_msg_and_die("Use prefix or netmask, not both"), bb_error_msg_and_die("use prefix or netmask, not both");
exit(EXIT_FAILURE));
} }
netmask = inet_aton(argv[1], &a); netmask = inet_aton(argv[1], &a);
if (netmask == 0) { if (netmask == 0) {
IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[1]), bb_error_msg_and_die("bad netmask: %s", argv[1]);
exit(EXIT_FAILURE));
} }
netmask = a.s_addr; netmask = a.s_addr;
} else { } else {
@ -166,34 +156,32 @@ int ipcalc_main(int argc, char **argv)
netmask = get_netmask(ipaddr); netmask = get_netmask(ipaddr);
} }
if (mode & NETMASK) { if (opt & NETMASK) {
printf("NETMASK=%s\n", inet_ntoa((*(struct in_addr *) &netmask))); printf("NETMASK=%s\n", inet_ntoa((*(struct in_addr *) &netmask)));
} }
if (mode & BROADCAST) { if (opt & BROADCAST) {
broadcast = (ipaddr & netmask) | ~netmask; broadcast = (ipaddr & netmask) | ~netmask;
printf("BROADCAST=%s\n", inet_ntoa((*(struct in_addr *) &broadcast))); printf("BROADCAST=%s\n", inet_ntoa((*(struct in_addr *) &broadcast)));
} }
if (mode & NETWORK) { if (opt & NETWORK) {
network = ipaddr & netmask; network = ipaddr & netmask;
printf("NETWORK=%s\n", inet_ntoa((*(struct in_addr *) &network))); printf("NETWORK=%s\n", inet_ntoa((*(struct in_addr *) &network)));
} }
if (ENABLE_FEATURE_IPCALC_FANCY) { if (ENABLE_FEATURE_IPCALC_FANCY) {
if (mode & NETPREFIX) { if (opt & NETPREFIX) {
printf("PREFIX=%i\n", get_prefix(netmask)); printf("PREFIX=%i\n", get_prefix(netmask));
} }
if (mode & HOSTNAME) { if (opt & HOSTNAME) {
struct hostent *hostinfo; struct hostent *hostinfo;
int x; int x;
hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET); hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET);
if (!hostinfo) { if (!hostinfo) {
IPCALC_MSG(bb_herror_msg_and_die( bb_herror_msg_and_die("cannot find hostname for %s", argv[0]);
"cannot find hostname for %s", argv[0]),);
exit(EXIT_FAILURE);
} }
for (x = 0; hostinfo->h_name[x]; x++) { for (x = 0; hostinfo->h_name[x]; x++) {
hostinfo->h_name[x] = tolower(hostinfo->h_name[x]); hostinfo->h_name[x] = tolower(hostinfo->h_name[x]);

View File

@ -11,13 +11,15 @@
static void timeout(int signum) static void timeout(int signum)
{ {
bb_error_msg_and_die("Timed out"); bb_error_msg_and_die("timed out");
} }
int nc_main(int argc, char **argv) int nc_main(int argc, char **argv)
{ {
int do_listen = 0, lport = 0, delay = 0, wsecs = 0, execflag = 0, opt, int sfd = 0, cfd;
sfd = 0, cfd; unsigned opt;
unsigned lport = 0, wsecs = 0, delay = 0;
unsigned do_listen = 0, execflag = 0;
struct sockaddr_in address; struct sockaddr_in address;
struct hostent *hostinfo; struct hostent *hostinfo;
fd_set readfds, testfds; fd_set readfds, testfds;
@ -30,8 +32,8 @@ int nc_main(int argc, char **argv)
if (ENABLE_NC_SERVER && opt=='l') do_listen++; if (ENABLE_NC_SERVER && opt=='l') do_listen++;
else if (ENABLE_NC_SERVER && opt=='p') else if (ENABLE_NC_SERVER && opt=='p')
lport = bb_lookup_port(optarg, "tcp", 0); lport = bb_lookup_port(optarg, "tcp", 0);
else if (ENABLE_NC_EXTRA && opt=='w') wsecs = atoi(optarg); else if (ENABLE_NC_EXTRA && opt=='w') wsecs = xatou(optarg);
else if (ENABLE_NC_EXTRA && opt=='i') delay = atoi(optarg); else if (ENABLE_NC_EXTRA && opt=='i') delay = xatou(optarg);
else if (ENABLE_NC_EXTRA && opt=='f') infile = optarg; else if (ENABLE_NC_EXTRA && opt=='f') infile = optarg;
else if (ENABLE_NC_EXTRA && opt=='e' && optind!=argc) { else if (ENABLE_NC_EXTRA && opt=='e' && optind!=argc) {
execflag++; execflag++;
@ -40,11 +42,10 @@ int nc_main(int argc, char **argv)
} }
} }
// For listen or file we need zero arguments, dialout is 2. // For listen or file we need zero arguments, dialout is 2.
// For exec we need at least one more argument at the end, more ok // For exec we need at least one more argument at the end, more ok
opt = (do_listen || infile) ? 0 : 2 + execflag; opt = (do_listen || infile) ? 0 : 2 + execflag;
if (execflag ? argc-optind < opt : argc-optind!=opt || if (execflag ? argc-optind < opt : argc-optind!=opt ||
(infile && do_listen)) (infile && do_listen))
bb_show_usage(); bb_show_usage();
@ -66,7 +67,6 @@ int nc_main(int argc, char **argv)
if (lport != 0) { if (lport != 0) {
address.sin_port = lport; address.sin_port = lport;
xbind(sfd, (struct sockaddr *) &address, sizeof(address)); xbind(sfd, (struct sockaddr *) &address, sizeof(address));
} }
@ -83,7 +83,8 @@ int nc_main(int argc, char **argv)
fdprintf(2, "%d\n", SWAP_BE16(address.sin_port)); fdprintf(2, "%d\n", SWAP_BE16(address.sin_port));
} }
repeatyness: repeatyness:
if ((cfd = accept(sfd, (struct sockaddr *) &address, &addrlen)) < 0) cfd = accept(sfd, (struct sockaddr *) &address, &addrlen);
if (cfd < 0)
bb_perror_msg_and_die("accept"); bb_perror_msg_and_die("accept");
if (!execflag) close(sfd); if (!execflag) close(sfd);
@ -116,10 +117,11 @@ repeatyness:
// With more than one -l, repeatedly act as server. // With more than one -l, repeatedly act as server.
if (do_listen>1 && vfork()) { if (do_listen > 1 && vfork()) {
// This is a bit weird as cleanup goes, since we wind up with no // This is a bit weird as cleanup goes, since we wind up with no
// stdin/stdout/stderr. But it's small and shouldn't hurt anything. // stdin/stdout/stderr. But it's small and shouldn't hurt anything.
// We check for cfd == 0 above. // We check for cfd == 0 above.
logmode = LOGMODE_NONE;
close(0); close(0);
close(1); close(1);
close(2); close(2);

View File

@ -157,9 +157,9 @@ int ping_main(int argc, char **argv)
static struct sockaddr_in pingaddr; static struct sockaddr_in pingaddr;
static struct sockaddr_in sourceaddr; static struct sockaddr_in sourceaddr;
static int pingsock = -1; static int pingsock = -1;
static int datalen; /* intentionally uninitialized to work around gcc bug */ static unsigned datalen; /* intentionally uninitialized to work around gcc bug */
static long ntransmitted, nreceived, nrepeats, pingcount; static unsigned long ntransmitted, nreceived, nrepeats, pingcount;
static int myid, options; static int myid, options;
static unsigned long tmin = ULONG_MAX, tmax, tsum; static unsigned long tmin = ULONG_MAX, tmax, tsum;
static char rcvd_tbl[MAX_DUP_CHK / 8]; static char rcvd_tbl[MAX_DUP_CHK / 8];
@ -179,12 +179,12 @@ static void pingstats(int junk)
signal(SIGINT, SIG_IGN); signal(SIGINT, SIG_IGN);
printf("\n--- %s ping statistics ---\n", hostent->h_name); printf("\n--- %s ping statistics ---\n", hostent->h_name);
printf("%ld packets transmitted, ", ntransmitted); printf("%lu packets transmitted, ", ntransmitted);
printf("%ld packets received, ", nreceived); printf("%lu packets received, ", nreceived);
if (nrepeats) if (nrepeats)
printf("%ld duplicates, ", nrepeats); printf("%lu duplicates, ", nrepeats);
if (ntransmitted) if (ntransmitted)
printf("%ld%% packet loss\n", printf("%lu%% packet loss\n",
(ntransmitted - nreceived) * 100 / ntransmitted); (ntransmitted - nreceived) * 100 / ntransmitted);
if (nreceived) if (nreceived)
printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n", printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n",
@ -427,13 +427,13 @@ int ping_main(int argc, char **argv)
if (--argc <= 0) if (--argc <= 0)
bb_show_usage(); bb_show_usage();
argv++; argv++;
pingcount = atoi(*argv); pingcount = xatoul(*argv);
break; break;
case 's': case 's':
if (--argc <= 0) if (--argc <= 0)
bb_show_usage(); bb_show_usage();
argv++; argv++;
datalen = atoi(*argv); datalen = xatou16(*argv);
break; break;
case 'I': case 'I':
if (--argc <= 0) if (--argc <= 0)

View File

@ -145,10 +145,10 @@ int ping6_main(int argc, char **argv)
/* full(er) version */ /* full(er) version */
static struct sockaddr_in6 pingaddr; static struct sockaddr_in6 pingaddr;
static int pingsock = -1; static int pingsock = -1;
static int datalen; /* intentionally uninitialized to work around gcc bug */ static unsigned datalen; /* intentionally uninitialized to work around gcc bug */
static int if_index; static int if_index;
static long ntransmitted, nreceived, nrepeats, pingcount; static unsigned long ntransmitted, nreceived, nrepeats, pingcount;
static int myid, options; static int myid, options;
static unsigned long tmin = ULONG_MAX, tmax, tsum; static unsigned long tmin = ULONG_MAX, tmax, tsum;
static char rcvd_tbl[MAX_DUP_CHK / 8]; static char rcvd_tbl[MAX_DUP_CHK / 8];
@ -168,12 +168,12 @@ static void pingstats(int junk)
signal(SIGINT, SIG_IGN); signal(SIGINT, SIG_IGN);
printf("\n--- %s ping statistics ---\n", hostent->h_name); printf("\n--- %s ping statistics ---\n", hostent->h_name);
printf("%ld packets transmitted, ", ntransmitted); printf("%lu packets transmitted, ", ntransmitted);
printf("%ld packets received, ", nreceived); printf("%lu packets received, ", nreceived);
if (nrepeats) if (nrepeats)
printf("%ld duplicates, ", nrepeats); printf("%lu duplicates, ", nrepeats);
if (ntransmitted) if (ntransmitted)
printf("%ld%% packet loss\n", printf("%lu%% packet loss\n",
(ntransmitted - nreceived) * 100 / ntransmitted); (ntransmitted - nreceived) * 100 / ntransmitted);
if (nreceived) if (nreceived)
printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n", printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n",
@ -439,13 +439,13 @@ int ping6_main(int argc, char **argv)
if (--argc <= 0) if (--argc <= 0)
bb_show_usage(); bb_show_usage();
argv++; argv++;
pingcount = atoi(*argv); pingcount = xatoul(*argv);
break; break;
case 's': case 's':
if (--argc <= 0) if (--argc <= 0)
bb_show_usage(); bb_show_usage();
argv++; argv++;
datalen = atoi(*argv); datalen = xatou16(*argv);
break; break;
case 'I': case 'I':
if (--argc <= 0) if (--argc <= 0)

View File

@ -178,7 +178,7 @@ static void INET_setroute(int action, char **args)
if(prefix) { if(prefix) {
int prefix_len; int prefix_len;
prefix_len = bb_xgetularg10_bnd(prefix+1, 0, 32); prefix_len = xatoul_range(prefix+1, 0, 32);
mask_in_addr(rt) = htonl( ~ (0xffffffffUL >> prefix_len)); mask_in_addr(rt) = htonl( ~ (0xffffffffUL >> prefix_len));
*prefix = '\0'; *prefix = '\0';
#if HAVE_NEW_ADDRT #if HAVE_NEW_ADDRT
@ -218,7 +218,7 @@ static void INET_setroute(int action, char **args)
#if HAVE_NEW_ADDRT #if HAVE_NEW_ADDRT
if (k == KW_IPVx_METRIC) { if (k == KW_IPVx_METRIC) {
rt.rt_metric = bb_xgetularg10(args_m1) + 1; rt.rt_metric = xatoul(args_m1) + 1;
continue; continue;
} }
#endif #endif
@ -259,20 +259,20 @@ static void INET_setroute(int action, char **args)
if (k == KW_IPVx_MSS) { /* Check valid MSS bounds. */ if (k == KW_IPVx_MSS) { /* Check valid MSS bounds. */
rt.rt_flags |= RTF_MSS; rt.rt_flags |= RTF_MSS;
rt.rt_mss = bb_xgetularg10_bnd(args_m1, 64, 32768); rt.rt_mss = xatoul_range(args_m1, 64, 32768);
continue; continue;
} }
if (k == KW_IPVx_WINDOW) { /* Check valid window bounds. */ if (k == KW_IPVx_WINDOW) { /* Check valid window bounds. */
rt.rt_flags |= RTF_WINDOW; rt.rt_flags |= RTF_WINDOW;
rt.rt_window = bb_xgetularg10_bnd(args_m1, 128, INT_MAX); rt.rt_window = xatoul_range(args_m1, 128, INT_MAX);
continue; continue;
} }
#ifdef RTF_IRTT #ifdef RTF_IRTT
if (k == KW_IPVx_IRTT) { if (k == KW_IPVx_IRTT) {
rt.rt_flags |= RTF_IRTT; rt.rt_flags |= RTF_IRTT;
rt.rt_irtt = bb_xgetularg10(args_m1); rt.rt_irtt = xatoul(args_m1);
rt.rt_irtt *= (sysconf(_SC_CLK_TCK) / 100); /* FIXME */ rt.rt_irtt *= (sysconf(_SC_CLK_TCK) / 100); /* FIXME */
#if 0 /* FIXME: do we need to check anything of this? */ #if 0 /* FIXME: do we need to check anything of this? */
if (rt.rt_irtt < 1 || rt.rt_irtt > (120 * HZ)) { if (rt.rt_irtt < 1 || rt.rt_irtt > (120 * HZ)) {
@ -353,7 +353,7 @@ static void INET6_setroute(int action, char **args)
char *cp; char *cp;
if ((cp = strchr(target, '/'))) { /* Yes... const to non is ok. */ if ((cp = strchr(target, '/'))) { /* Yes... const to non is ok. */
*cp = 0; *cp = 0;
prefix_len = bb_xgetularg10_bnd(cp+1, 0, 128); prefix_len = xatoul_range(cp+1, 0, 128);
} else { } else {
prefix_len = 128; prefix_len = 128;
} }
@ -384,7 +384,7 @@ static void INET6_setroute(int action, char **args)
} }
if (k == KW_IPVx_METRIC) { if (k == KW_IPVx_METRIC) {
rt.rtmsg_metric = bb_xgetularg10(args_m1); rt.rtmsg_metric = xatoul(args_m1);
continue; continue;
} }

View File

@ -369,7 +369,7 @@ telnetd_main(int argc, char **argv)
sockaddr_type sa; sockaddr_type sa;
int master_fd; int master_fd;
int on = 1; int on = 1;
int portnbr = 23; unsigned portnbr = 23;
struct in_addr bind_addr = { .s_addr = 0x0 }; struct in_addr bind_addr = { .s_addr = 0x0 };
char *opt_portnbr, *opt_bindaddr; char *opt_portnbr, *opt_bindaddr;
#endif /* CONFIG_FEATURE_TELNETD_INETD */ #endif /* CONFIG_FEATURE_TELNETD_INETD */
@ -393,7 +393,7 @@ telnetd_main(int argc, char **argv)
//if (opt & 1) // -f //if (opt & 1) // -f
//if (opt & 2) // -l //if (opt & 2) // -l
#ifndef CONFIG_FEATURE_TELNETD_INETD #ifndef CONFIG_FEATURE_TELNETD_INETD
if (opt & 4) portnbr = atoi(opt_portnbr); // -p if (opt & 4) portnbr = xatou16(opt_portnbr); // -p
if (opt & 8) // -b if (opt & 8) // -b
if (inet_aton(opt_bindaddr, &bind_addr) == 0) bb_show_usage(); if (inet_aton(opt_bindaddr, &bind_addr) == 0) bb_show_usage();
#endif /* CONFIG_FEATURE_TELNETD_INETD */ #endif /* CONFIG_FEATURE_TELNETD_INETD */

View File

@ -373,7 +373,7 @@ static int tftp(const int cmd, const struct hostent *host,
res = tftp_option_get(&buf[2], len - 2, OPTION_BLOCKSIZE); res = tftp_option_get(&buf[2], len - 2, OPTION_BLOCKSIZE);
if (res) { if (res) {
int blksize = atoi(res); int blksize = xatoi_u(res);
if (tftp_blocksize_check(blksize, tftp_bufsize - 4)) { if (tftp_blocksize_check(blksize, tftp_bufsize - 4)) {
@ -516,7 +516,7 @@ int tftp_main(int argc, char **argv)
#ifdef CONFIG_FEATURE_TFTP_BLOCKSIZE #ifdef CONFIG_FEATURE_TFTP_BLOCKSIZE
if (sblocksize) { if (sblocksize) {
blocksize = atoi(sblocksize); blocksize = xatoi_u(sblocksize);
if (!tftp_blocksize_check(blocksize, 0)) { if (!tftp_blocksize_check(blocksize, 0)) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View File

@ -416,7 +416,7 @@ ifaddrlist(struct IFADDRLIST **ipaddrp)
++al; ++al;
++nipaddr; ++nipaddr;
} }
if(nipaddr == 0) if (nipaddr == 0)
bb_error_msg_and_die ("Can't find any network interfaces"); bb_error_msg_and_die ("Can't find any network interfaces");
(void)close(fd); (void)close(fd);
@ -494,34 +494,6 @@ findsaddr(const struct sockaddr_in *to, struct sockaddr_in *from)
*/ */
/* String to value with optional min and max. Handles decimal and hex. */
static int
str2val(const char *str, const char *what, int mi, int ma)
{
const char *cp;
int val;
char *ep;
if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
cp = str + 2;
val = (int)strtol(cp, &ep, 16);
} else
val = (int)strtol(str, &ep, 10);
if (*ep != '\0') {
bb_error_msg_and_die("\"%s\" bad value for %s", str, what);
}
if (val < mi && mi >= 0) {
if (mi == 0)
bb_error_msg_and_die("%s must be >= %d", what, mi);
else
bb_error_msg_and_die("%s must be > %d", what, mi - 1);
}
if (val > ma && ma >= 0)
bb_error_msg_and_die("%s must be <= %d", what, ma);
return val;
}
/* /*
* Subtract 2 timeval structs: out = out - in. * Subtract 2 timeval structs: out = out - in.
* Out is assumed to be >= in. * Out is assumed to be >= in.
@ -828,7 +800,7 @@ inetname(struct sockaddr_in *from)
char name[257]; char name[257];
if (!nflag && from->sin_addr.s_addr != INADDR_ANY) { if (!nflag && from->sin_addr.s_addr != INADDR_ANY) {
if(INET_rresolve(name, sizeof(name), from, 0x4000, 0xffffffff) >= 0) if (INET_rresolve(name, sizeof(name), from, 0x4000, 0xffffffff) >= 0)
n = name; n = name;
} }
ina = inet_ntoa(from->sin_addr); ina = inet_ntoa(from->sin_addr);
@ -974,7 +946,7 @@ traceroute_main(int argc, char *argv[])
#endif #endif
); );
if(op & USAGE_OP_DONT_FRAGMNT) if (op & USAGE_OP_DONT_FRAGMNT)
off = IP_DF; off = IP_DF;
#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP #ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
useicmp = op & USAGE_OP_USE_ICMP; useicmp = op & USAGE_OP_USE_ICMP;
@ -983,34 +955,34 @@ traceroute_main(int argc, char *argv[])
#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE #ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
verbose = op & USAGE_OP_VERBOSE; verbose = op & USAGE_OP_VERBOSE;
#endif #endif
if(op & USAGE_OP_IP_CHKSUM) { if (op & USAGE_OP_IP_CHKSUM) {
doipcksum = 0; doipcksum = 0;
bb_error_msg("Warning: ip checksums disabled"); bb_error_msg("warning: ip checksums disabled");
} }
if (tos_str) if (tos_str)
tos = str2val(tos_str, "tos", 0, 255); tos = xatoul_range(tos_str, 0, 255);
if(max_ttl_str) if (max_ttl_str)
max_ttl = str2val(max_ttl_str, "max ttl", 1, 255); max_ttl = xatoul_range(max_ttl_str, 1, 255);
if(port_str) if (port_str)
port = (u_short)str2val(port_str, "port", 1, (1 << 16) - 1); port = xatou16(port_str);
if(nprobes_str) if (nprobes_str)
nprobes = str2val(nprobes_str, "nprobes", 1, -1); nprobes = xatoul_range(nprobes_str, 1, INT_MAX);
if(source) { if (source) {
/* /*
* set the ip source address of the outbound * set the ip source address of the outbound
* probe (e.g., on a multi-homed host). * probe (e.g., on a multi-homed host).
*/ */
if (getuid()) bb_error_msg_and_die("-s %s: permission denied", source); if (getuid()) bb_error_msg_and_die("-s %s: permission denied", source);
} }
if(waittime_str) if (waittime_str)
waittime = str2val(waittime_str, "wait time", 2, 24 * 60 * 60); waittime = xatoul_range(waittime_str, 2, 24 * 60 * 60);
if(pausemsecs_str) if (pausemsecs_str)
pausemsecs = str2val(pausemsecs_str, "pause msecs", 0, 60 * 60 * 1000); pausemsecs = xatoul_range(pausemsecs_str, 0, 60 * 60 * 1000);
if(first_ttl_str) if (first_ttl_str)
first_ttl = str2val(first_ttl_str, "first ttl", 1, 255); first_ttl = xatoul_range(first_ttl_str, 1, 255);
#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE #ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
if(sourse_route_list) { if (sourse_route_list) {
llist_t *l_sr; llist_t *l_sr;
for(l_sr = sourse_route_list; l_sr; ) { for(l_sr = sourse_route_list; l_sr; ) {
@ -1046,8 +1018,7 @@ traceroute_main(int argc, char *argv[])
switch (argc - optind) { switch (argc - optind) {
case 2: case 2:
packlen = str2val(argv[optind + 1], packlen = xatoul_range(argv[optind + 1], minpacket, maxpacket);
"packet length", minpacket, maxpacket);
/* Fall through */ /* Fall through */
case 1: case 1:
@ -1055,8 +1026,7 @@ traceroute_main(int argc, char *argv[])
hi = gethostinfo(hostname); hi = gethostinfo(hostname);
setsin(to, hi->addrs[0]); setsin(to, hi->addrs[0]);
if (hi->n > 1) if (hi->n > 1)
bb_error_msg( bb_error_msg("warning: %s has multiple addresses; using %s",
"Warning: %s has multiple addresses; using %s",
hostname, inet_ntoa(to->sin_addr)); hostname, inet_ntoa(to->sin_addr));
hostname = hi->name; hostname = hi->name;
hi->name = NULL; hi->name = NULL;

View File

@ -262,10 +262,10 @@ int udhcpc_main(int argc, char *argv[])
client_config.script = optarg; client_config.script = optarg;
break; break;
case 'T': case 'T':
client_config.timeout = atoi(optarg); client_config.timeout = xatoi_u(optarg);
break; break;
case 't': case 't':
client_config.retries = atoi(optarg); client_config.retries = xatoi_u(optarg);
break; break;
case 'v': case 'v':
printf("version %s\n\n", BB_VER); printf("version %s\n\n", BB_VER);

View File

@ -35,7 +35,8 @@ static int read_ip(const char *line, void *arg)
int retval = 1; int retval = 1;
if (!inet_aton(line, addr)) { if (!inet_aton(line, addr)) {
if ((host = gethostbyname(line))) host = gethostbyname(line);
if (host)
addr->s_addr = *((unsigned long *) host->h_addr_list[0]); addr->s_addr = *((unsigned long *) host->h_addr_list[0]);
else retval = 0; else retval = 0;
} }
@ -72,10 +73,7 @@ static int read_str(const char *line, void *arg)
static int read_u32(const char *line, void *arg) static int read_u32(const char *line, void *arg)
{ {
uint32_t *dest = arg; return safe_strtou32(line, (uint32_t*)arg) == 0;
char *endptr;
*dest = strtoul(line, &endptr, 0);
return endptr[0] == '\0';
} }

View File

@ -144,14 +144,14 @@ int vconfig_main(int argc, char **argv)
* doing so wouldn't save that much space and would also make maintainence * doing so wouldn't save that much space and would also make maintainence
* more of a pain. */ * more of a pain. */
if (ifr.cmd == SET_VLAN_FLAG_CMD) { /* set_flag */ if (ifr.cmd == SET_VLAN_FLAG_CMD) { /* set_flag */
ifr.u.flag = bb_xgetularg10_bnd(p, 0, 1); ifr.u.flag = xatoul_range(p, 0, 1);
/* DM: in order to set reorder header, qos must be set */ /* DM: in order to set reorder header, qos must be set */
ifr.vlan_qos = bb_xgetularg10_bnd(argv[3], 0, 7); ifr.vlan_qos = xatoul_range(argv[3], 0, 7);
} else if (ifr.cmd == ADD_VLAN_CMD) { /* add */ } else if (ifr.cmd == ADD_VLAN_CMD) { /* add */
ifr.u.VID = bb_xgetularg10_bnd(p, 0, VLAN_GROUP_ARRAY_LEN-1); ifr.u.VID = xatoul_range(p, 0, VLAN_GROUP_ARRAY_LEN-1);
} else if (ifr.cmd != DEL_VLAN_CMD) { /* set_{egress|ingress}_map */ } else if (ifr.cmd != DEL_VLAN_CMD) { /* set_{egress|ingress}_map */
ifr.u.skb_priority = bb_xgetularg10_bnd(p, 0, ULONG_MAX); ifr.u.skb_priority = xatou(p);
ifr.vlan_qos = bb_xgetularg10_bnd(argv[3], 0, 7); ifr.vlan_qos = xatoul_range(argv[3], 0, 7);
} }
} }

View File

@ -297,7 +297,7 @@ read_response:
s = buf; s = buf;
while (*s != '\0' && !isspace(*s)) ++s; while (*s != '\0' && !isspace(*s)) ++s;
while (isspace(*s)) ++s; while (isspace(*s)) ++s;
switch (status = atoi(s)) { switch (status = xatoi(s)) {
case 0: case 0:
case 100: case 100:
while (gethdr(buf, sizeof(buf), sfp, &n) != NULL) while (gethdr(buf, sizeof(buf), sfp, &n) != NULL)
@ -406,9 +406,9 @@ read_response:
bb_error_msg_and_die("PASV: %s", buf+4); bb_error_msg_and_die("PASV: %s", buf+4);
s = strrchr(buf, ','); s = strrchr(buf, ',');
*s = 0; *s = 0;
port = atoi(s+1); port = xatol_range(s+1, 0, 255);
s = strrchr(buf, ','); s = strrchr(buf, ',');
port += atoi(s+1) * 256; port += xatol_range(s+1, 0, 255) * 256;
s_in.sin_port = htons(port); s_in.sin_port = htons(port);
dfp = open_socket(&s_in); dfp = open_socket(&s_in);
@ -562,7 +562,7 @@ static void parse_url(char *src_url, struct host_info *h)
cp = strchr(pp, ':'); cp = strchr(pp, ':');
if (cp != NULL) { if (cp != NULL) {
*cp++ = '\0'; *cp++ = '\0';
h->port = htons(atoi(cp)); h->port = htons(xatou16(cp));
} }
} }
@ -646,7 +646,7 @@ static int ftpcmd(char *s1, char *s2, FILE *fp, char *buf)
} }
} while (!isdigit(buf[0]) || buf[3] != ' '); } while (!isdigit(buf[0]) || buf[3] != ' ');
return atoi(buf); return xatoi(buf);
} }
#ifdef CONFIG_FEATURE_WGET_STATUSBAR #ifdef CONFIG_FEATURE_WGET_STATUSBAR

View File

@ -47,7 +47,7 @@ int kill_main(int argc, char **argv)
} else { /* -l <sig list> */ } else { /* -l <sig list> */
while ((arg = *++argv)!=NULL) { while ((arg = *++argv)!=NULL) {
if (isdigit(arg[0])) { if (isdigit(arg[0])) {
signo = atoi(arg); signo = xatoi_u(arg);
name = get_signame(signo); name = get_signame(signo);
} else { } else {
signo = get_signum(arg); signo = get_signum(arg);
@ -140,7 +140,7 @@ do_it_now:
while (arg) { while (arg) {
if (!isdigit(arg[0]) && arg[0]!='-') if (!isdigit(arg[0]) && arg[0]!='-')
bb_error_msg_and_die("bad pid '%s'", arg); bb_error_msg_and_die("bad pid '%s'", arg);
pid = strtol(arg, NULL, 0); pid = xatou(arg);
/* FIXME: better overflow check? */ /* FIXME: better overflow check? */
if (kill(pid, signo)!=0) { if (kill(pid, signo)!=0) {
bb_perror_msg("cannot kill pid %ld", (long)pid); bb_perror_msg("cannot kill pid %ld", (long)pid);

View File

@ -14,7 +14,7 @@
#define SINGLE (1<<0) #define SINGLE (1<<0)
#else #else
#define _SINGLE_COMPL(a) #define _SINGLE_COMPL(a)
#define SINGLE (0) #define SINGLE 0
#endif #endif
#if ENABLE_FEATURE_PIDOF_OMIT #if ENABLE_FEATURE_PIDOF_OMIT
@ -56,7 +56,7 @@ int pidof_main(int argc, char **argv)
/* are we asked to exclude the parent's process ID? */ /* are we asked to exclude the parent's process ID? */
if (!strncmp(omits_p->data, "%PPID", 5)) { if (!strncmp(omits_p->data, "%PPID", 5)) {
llist_pop(&omits_p); llist_pop(&omits_p);
snprintf(getppid_str, sizeof(getppid_str), "%d", getppid()); snprintf(getppid_str, sizeof(getppid_str), "%ld", (long)getppid());
llist_add_to(&omits_p, getppid_str); llist_add_to(&omits_p, getppid_str);
} }
omits_p = omits_p->link; omits_p = omits_p->link;
@ -64,19 +64,19 @@ int pidof_main(int argc, char **argv)
} }
#endif #endif
/* Looks like everything is set to go. */ /* Looks like everything is set to go. */
while(optind < argc) { while (optind < argc) {
long *pidList; long *pidList;
long *pl; long *pl;
/* reverse the pidlist like GNU pidof does. */ /* reverse the pidlist like GNU pidof does. */
pidList = pidlist_reverse(find_pid_by_name(argv[optind])); pidList = pidlist_reverse(find_pid_by_name(argv[optind]));
for(pl = pidList; *pl > 0; pl++) { for (pl = pidList; *pl > 0; pl++) {
#if ENABLE_FEATURE_PIDOF_OMIT #if ENABLE_FEATURE_PIDOF_OMIT
unsigned omitted = 0; unsigned omitted = 0;
if (opt & OMIT) { if (opt & OMIT) {
llist_t *omits_p = omits; llist_t *omits_p = omits;
while (omits_p) while (omits_p)
if (strtol(omits_p->data, NULL, 10) == *pl) { if (xatoul(omits_p->data) == *pl) {
omitted = 1; break; omitted = 1; break;
} else } else
omits_p = omits_p->link; omits_p = omits_p->link;

View File

@ -53,13 +53,13 @@ static inline int int_add_no_wrap(int a, int b)
int renice_main(int argc, char **argv) int renice_main(int argc, char **argv)
{ {
static const char Xetpriority_msg[] = "%d : %cetpriority"; static const char Xetpriority_msg[] = "%d: %cetpriority";
int retval = EXIT_SUCCESS; int retval = EXIT_SUCCESS;
int which = PRIO_PROCESS; /* Default 'which' value. */ int which = PRIO_PROCESS; /* Default 'which' value. */
int use_relative = 0; int use_relative = 0;
int adjustment, new_priority; int adjustment, new_priority;
id_t who; unsigned who;
++argv; ++argv;
@ -74,15 +74,15 @@ int renice_main(int argc, char **argv)
} }
/* Get the priority adjustment (absolute or relative). */ /* Get the priority adjustment (absolute or relative). */
adjustment = bb_xgetlarg(*argv, 10, INT_MIN, INT_MAX); adjustment = xatoi(*argv);
while (*++argv) { while (*++argv) {
/* Check for a mode switch. */ /* Check for a mode switch. */
if ((argv[0][0] == '-') && argv[0][1] && !argv[0][2]) { if ((argv[0][0] == '-') && argv[0][1] && !argv[0][2]) {
static const char opts[] static const char opts[]
= { 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER }; = { 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER };
const char *p; const char *p = strchr(opts, argv[0][1]);
if ((p = strchr(opts, argv[0][1]))) { if (p) {
which = p[4]; which = p[4];
continue; continue;
} }
@ -91,16 +91,14 @@ int renice_main(int argc, char **argv)
/* Process an ID arg. */ /* Process an ID arg. */
if (which == PRIO_USER) { if (which == PRIO_USER) {
struct passwd *p; struct passwd *p;
if (!(p = getpwnam(*argv))) { p = getpwnam(*argv);
if (!p) {
bb_error_msg("unknown user: %s", *argv); bb_error_msg("unknown user: %s", *argv);
goto HAD_ERROR; goto HAD_ERROR;
} }
who = p->pw_uid; who = p->pw_uid;
} else { } else {
char *e; if (safe_strtou(*argv, &who)) {
errno = 0;
who = strtoul(*argv, &e, 10);
if (*e || (*argv == e) || errno) {
bb_error_msg("bad value: %s", *argv); bb_error_msg("bad value: %s", *argv);
goto HAD_ERROR; goto HAD_ERROR;
} }

View File

@ -384,8 +384,8 @@ static void sig_catcher(int sig ATTRIBUTE_UNUSED)
int top_main(int argc, char **argv) int top_main(int argc, char **argv)
{ {
int count, lines, col; int count, lines, col;
int interval = 5; /* default update rate is 5 seconds */ unsigned interval = 5; /* default update rate is 5 seconds */
int iterations = -1; /* 2^32 iterations by default :) */ unsigned iterations = UINT_MAX; /* 2^32 iterations by default :) */
char *sinterval, *siterations; char *sinterval, *siterations;
#ifdef CONFIG_FEATURE_USE_TERMIOS #ifdef CONFIG_FEATURE_USE_TERMIOS
struct termios new_settings; struct termios new_settings;
@ -399,8 +399,8 @@ int top_main(int argc, char **argv)
opt_complementary = "-"; opt_complementary = "-";
getopt32(argc, argv, "d:n:b", getopt32(argc, argv, "d:n:b",
&sinterval, &siterations); &sinterval, &siterations);
if (option_mask32 & 0x1) interval = atoi(sinterval); // -d if (option_mask32 & 0x1) interval = xatou(sinterval); // -d
if (option_mask32 & 0x2) iterations = atoi(siterations); // -n if (option_mask32 & 0x2) iterations = xatou(siterations); // -n
//if (option_mask32 & 0x4) // -b //if (option_mask32 & 0x4) // -b
/* change to /proc */ /* change to /proc */

View File

@ -22,7 +22,7 @@ static long limitf = -2;
static long limitc = -2; static long limitc = -2;
static long limitr = -2; static long limitr = -2;
static long limitt = -2; static long limitt = -2;
static long nicelvl; static int nicelvl;
static const char *root; static const char *root;
static void suidgid(char *user) static void suidgid(char *user)
@ -229,16 +229,16 @@ int chpst_main(int argc, char **argv)
// if (option_mask32 & 0x1) // -u // if (option_mask32 & 0x1) // -u
// if (option_mask32 & 0x2) // -U // if (option_mask32 & 0x2) // -U
// if (option_mask32 & 0x4) // -e // if (option_mask32 & 0x4) // -e
if (option_mask32 & 0x8) limits = limitl = limita = limitd = bb_xgetularg10(m); // -m if (option_mask32 & 0x8) limits = limitl = limita = limitd = xatoul(m); // -m
if (option_mask32 & 0x10) limitd = bb_xgetularg10(d); // -d if (option_mask32 & 0x10) limitd = xatoul(d); // -d
if (option_mask32 & 0x20) limito = bb_xgetularg10(o); // -o if (option_mask32 & 0x20) limito = xatoul(o); // -o
if (option_mask32 & 0x40) limitp = bb_xgetularg10(p); // -p if (option_mask32 & 0x40) limitp = xatoul(p); // -p
if (option_mask32 & 0x80) limitf = bb_xgetularg10(f); // -f if (option_mask32 & 0x80) limitf = xatoul(f); // -f
if (option_mask32 & 0x100) limitc = bb_xgetularg10(c); // -c if (option_mask32 & 0x100) limitc = xatoul(c); // -c
if (option_mask32 & 0x200) limitr = bb_xgetularg10(r); // -r if (option_mask32 & 0x200) limitr = xatoul(r); // -r
if (option_mask32 & 0x400) limitt = bb_xgetularg10(t); // -t if (option_mask32 & 0x400) limitt = xatoul(t); // -t
// if (option_mask32 & 0x800) // -/ // if (option_mask32 & 0x800) // -/
if (option_mask32 & 0x1000) nicelvl = bb_xgetlarg_bnd_sfx(n, 10, -20, 20, NULL); // -n if (option_mask32 & 0x1000) nicelvl = xatoi(n); // -n
// The below consts should match #defines at top! // The below consts should match #defines at top!
//if (option_mask32 & 0x2000) OPT_verbose = 1; // -v //if (option_mask32 & 0x2000) OPT_verbose = 1; // -v
//if (option_mask32 & 0x4000) OPT_pgrp = 1; // -P //if (option_mask32 & 0x4000) OPT_pgrp = 1; // -P
@ -312,17 +312,17 @@ static void softlimit(int argc, char **argv)
char *a,*c,*d,*f,*l,*m,*o,*p,*r,*s,*t; char *a,*c,*d,*f,*l,*m,*o,*p,*r,*s,*t;
getopt32(argc, argv, "a:c:d:f:l:m:o:p:r:s:t:", getopt32(argc, argv, "a:c:d:f:l:m:o:p:r:s:t:",
&a,&c,&d,&f,&l,&m,&o,&p,&r,&s,&t); &a,&c,&d,&f,&l,&m,&o,&p,&r,&s,&t);
if (option_mask32 & 0x001) limita = bb_xgetularg10(a); // -a if (option_mask32 & 0x001) limita = xatoul(a); // -a
if (option_mask32 & 0x002) limitc = bb_xgetularg10(c); // -c if (option_mask32 & 0x002) limitc = xatoul(c); // -c
if (option_mask32 & 0x004) limitd = bb_xgetularg10(d); // -d if (option_mask32 & 0x004) limitd = xatoul(d); // -d
if (option_mask32 & 0x008) limitf = bb_xgetularg10(f); // -f if (option_mask32 & 0x008) limitf = xatoul(f); // -f
if (option_mask32 & 0x010) limitl = bb_xgetularg10(l); // -l if (option_mask32 & 0x010) limitl = xatoul(l); // -l
if (option_mask32 & 0x020) limits = limitl = limita = limitd = bb_xgetularg10(m); // -m if (option_mask32 & 0x020) limits = limitl = limita = limitd = xatoul(m); // -m
if (option_mask32 & 0x040) limito = bb_xgetularg10(o); // -o if (option_mask32 & 0x040) limito = xatoul(o); // -o
if (option_mask32 & 0x080) limitp = bb_xgetularg10(p); // -p if (option_mask32 & 0x080) limitp = xatoul(p); // -p
if (option_mask32 & 0x100) limitr = bb_xgetularg10(r); // -r if (option_mask32 & 0x100) limitr = xatoul(r); // -r
if (option_mask32 & 0x200) limits = bb_xgetularg10(s); // -s if (option_mask32 & 0x200) limits = xatoul(s); // -s
if (option_mask32 & 0x400) limitt = bb_xgetularg10(t); // -t if (option_mask32 & 0x400) limitt = xatoul(t); // -t
argv += optind; argv += optind;
if (!argv[0]) bb_show_usage(); if (!argv[0]) bb_show_usage();
slimit(); slimit();

View File

@ -43,7 +43,6 @@ int klogd_main(int argc, char **argv)
int i, n, lastc; int i, n, lastc;
char *start; char *start;
{ {
unsigned opt; unsigned opt;
@ -52,7 +51,7 @@ int klogd_main(int argc, char **argv)
if (opt & OPT_LEVEL) { if (opt & OPT_LEVEL) {
/* Valid levels are between 1 and 8 */ /* Valid levels are between 1 and 8 */
console_log_level = bb_xgetlarg(start, 10, 1, 8); console_log_level = xatoul_range(start, 1, 8);
} }
if (!(opt & OPT_FOREGROUND)) { if (!(opt & OPT_FOREGROUND)) {

View File

@ -48,14 +48,14 @@ static int decode(char *name, CODE * codetab)
CODE *c; CODE *c;
if (isdigit(*name)) if (isdigit(*name))
return (atoi(name)); return atoi(name);
for (c = codetab; c->c_name; c++) { for (c = codetab; c->c_name; c++) {
if (!strcasecmp(name, c->c_name)) { if (!strcasecmp(name, c->c_name)) {
return (c->c_val); return c->c_val;
} }
} }
return (-1); return -1;
} }
/* Decode a symbolic name to a numeric value /* Decode a symbolic name to a numeric value
@ -177,6 +177,3 @@ int logger_main(int argc, char **argv)
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */

View File

@ -575,20 +575,20 @@ int syslogd_main(int argc, char **argv)
/* do normal option parsing */ /* do normal option parsing */
getopt32(argc, argv, OPTION_STR, OPTION_PARAM); getopt32(argc, argv, OPTION_STR, OPTION_PARAM);
if (option_mask32 & OPT_mark) MarkInterval = atoi(opt_m) * 60; // -m if (option_mask32 & OPT_mark) MarkInterval = xatoul_range(opt_m, 0, INT_MAX/60) * 60; // -m
//if (option_mask32 & OPT_nofork) // -n //if (option_mask32 & OPT_nofork) // -n
//if (option_mask32 & OPT_outfile) // -O //if (option_mask32 & OPT_outfile) // -O
if (option_mask32 & OPT_loglevel) { // -l if (option_mask32 & OPT_loglevel) { // -l
logLevel = atoi(opt_l); logLevel = xatoi_u(opt_l);
/* Valid levels are between 1 and 8 */ /* Valid levels are between 1 and 8 */
if (logLevel < 1 || logLevel > 8) if (logLevel < 1 || logLevel > 8)
bb_show_usage(); bb_show_usage();
} }
//if (option_mask32 & OPT_small) // -S //if (option_mask32 & OPT_small) // -S
#if ENABLE_FEATURE_ROTATE_LOGFILE #if ENABLE_FEATURE_ROTATE_LOGFILE
if (option_mask32 & OPT_filesize) logFileSize = atoi(opt_s) * 1024; // -s if (option_mask32 & OPT_filesize) logFileSize = xatoul_range(opt_s, 0, INT_MAX/1024) * 1024; // -s
if (option_mask32 & OPT_rotatecnt) { // -b if (option_mask32 & OPT_rotatecnt) { // -b
logFileRotate = atoi(opt_b); logFileRotate = xatoi_u(opt_b);
if (logFileRotate > 99) logFileRotate = 99; if (logFileRotate > 99) logFileRotate = 99;
} }
#endif #endif
@ -598,7 +598,7 @@ int syslogd_main(int argc, char **argv)
char *host = xstrdup(opt_R); char *host = xstrdup(opt_R);
p = strchr(host, ':'); p = strchr(host, ':');
if (p) { if (p) {
port = atoi(p + 1); port = xatou16(p + 1);
*p = '\0'; *p = '\0';
} }
remoteaddr.sin_family = AF_INET; remoteaddr.sin_family = AF_INET;
@ -612,9 +612,7 @@ int syslogd_main(int argc, char **argv)
#if ENABLE_FEATURE_IPC_SYSLOG #if ENABLE_FEATURE_IPC_SYSLOG
if (option_mask32 & OPT_circularlog) { // -C if (option_mask32 & OPT_circularlog) { // -C
if (opt_C) { if (opt_C) {
int buf_size = atoi(opt_C); shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
if (buf_size >= 4)
shm_size = buf_size * 1024;
} }
} }
#endif #endif

View File

@ -19,13 +19,13 @@ int dmesg_main(int argc, char *argv[])
int flags = getopt32(argc, argv, "cs:n:", &size, &level); int flags = getopt32(argc, argv, "cs:n:", &size, &level);
if (flags & 4) { if (flags & 4) {
if (klogctl(8, NULL, bb_xgetlarg(level, 10, 0, 10))) if (klogctl(8, NULL, xatoul_range(level, 0, 10)))
bb_perror_msg_and_die("klogctl"); bb_perror_msg_and_die("klogctl");
} else { } else {
int len; int len;
char *buf; char *buf;
len = (flags & 2) ? bb_xgetlarg(size, 10, 2, INT_MAX) : 16384; len = (flags & 2) ? xatoul_range(size, 2, INT_MAX) : 16384;
buf = xmalloc(len); buf = xmalloc(len);
if (0 > (len = klogctl(3 + (flags & 1), buf, len))) if (0 > (len = klogctl(3 + (flags & 1), buf, len)))
bb_perror_msg_and_die("klogctl"); bb_perror_msg_and_die("klogctl");

View File

@ -338,20 +338,20 @@ int fbset_main(int argc, char **argv)
modefile = argv[1]; modefile = argv[1];
break; break;
case CMD_GEOMETRY: case CMD_GEOMETRY:
varset.xres = strtoul(argv[1], 0, 0); varset.xres = xatou32(argv[1]);
varset.yres = strtoul(argv[2], 0, 0); varset.yres = xatou32(argv[2]);
varset.xres_virtual = strtoul(argv[3], 0, 0); varset.xres_virtual = xatou32(argv[3]);
varset.yres_virtual = strtoul(argv[4], 0, 0); varset.yres_virtual = xatou32(argv[4]);
varset.bits_per_pixel = strtoul(argv[5], 0, 0); varset.bits_per_pixel = xatou32(argv[5]);
break; break;
case CMD_TIMING: case CMD_TIMING:
varset.pixclock = strtoul(argv[1], 0, 0); varset.pixclock = xatou32(argv[1]);
varset.left_margin = strtoul(argv[2], 0, 0); varset.left_margin = xatou32(argv[2]);
varset.right_margin = strtoul(argv[3], 0, 0); varset.right_margin = xatou32(argv[3]);
varset.upper_margin = strtoul(argv[4], 0, 0); varset.upper_margin = xatou32(argv[4]);
varset.lower_margin = strtoul(argv[5], 0, 0); varset.lower_margin = xatou32(argv[5]);
varset.hsync_len = strtoul(argv[6], 0, 0); varset.hsync_len = xatou32(argv[6]);
varset.vsync_len = strtoul(argv[7], 0, 0); varset.vsync_len = xatou32(argv[7]);
break; break;
case CMD_ALL: case CMD_ALL:
g_options |= OPT_ALL; g_options |= OPT_ALL;
@ -361,13 +361,13 @@ int fbset_main(int argc, char **argv)
break; break;
#ifdef CONFIG_FEATURE_FBSET_FANCY #ifdef CONFIG_FEATURE_FBSET_FANCY
case CMD_XRES: case CMD_XRES:
varset.xres = strtoul(argv[1], 0, 0); varset.xres = xatou32(argv[1]);
break; break;
case CMD_YRES: case CMD_YRES:
varset.yres = strtoul(argv[1], 0, 0); varset.yres = xatou32(argv[1]);
break; break;
case CMD_DEPTH: case CMD_DEPTH:
varset.bits_per_pixel = strtoul(argv[1], 0, 0); varset.bits_per_pixel = xatou32(argv[1]);
break; break;
#endif #endif
} }

View File

@ -1222,8 +1222,7 @@ edit_int(int def, char *mesg)
printf(" (%d): ", def); printf(" (%d): ", def);
if (!read_line()) if (!read_line())
return def; return def;
} } while (!isdigit(*line_ptr));
while (!isdigit(*line_ptr)); /* FIXME: ?!! */
return atoi(line_ptr); return atoi(line_ptr);
} }
@ -5664,14 +5663,14 @@ int fdisk_main(int argc, char **argv)
#ifdef CONFIG_FEATURE_FDISK_BLKSIZE #ifdef CONFIG_FEATURE_FDISK_BLKSIZE
"s" "s"
#endif #endif
)) != -1) { )) != -1) {
switch (c) { switch (c) {
case 'b': case 'b':
/* Ugly: this sector size is really per device, /* Ugly: this sector size is really per device,
so cannot be combined with multiple disks, so cannot be combined with multiple disks,
and te same goes for the C/H/S options. and te same goes for the C/H/S options.
*/ */
sector_size = atoi(optarg); sector_size = xatoi_u(optarg);
if (sector_size != 512 && sector_size != 1024 && if (sector_size != 512 && sector_size != 1024 &&
sector_size != 2048) sector_size != 2048)
bb_show_usage(); bb_show_usage();
@ -5679,15 +5678,15 @@ int fdisk_main(int argc, char **argv)
user_set_sector_size = 1; user_set_sector_size = 1;
break; break;
case 'C': case 'C':
user_cylinders = atoi(optarg); user_cylinders = xatoi_u(optarg);
break; break;
case 'H': case 'H':
user_heads = atoi(optarg); user_heads = xatoi_u(optarg);
if (user_heads <= 0 || user_heads >= 256) if (user_heads <= 0 || user_heads >= 256)
user_heads = 0; user_heads = 0;
break; break;
case 'S': case 'S':
user_sectors = atoi(optarg); user_sectors = xatoi_u(optarg);
if (user_sectors <= 0 || user_sectors >= 64) if (user_sectors <= 0 || user_sectors >= 64)
user_sectors = 0; user_sectors = 0;
break; break;

View File

@ -79,10 +79,10 @@ int hexdump_main(int argc, char **argv)
bb_dump_addfile(optarg); bb_dump_addfile(optarg);
} /* else */ } /* else */
if (ch == 'n') { if (ch == 'n') {
bb_dump_length = bb_xgetularg10_bnd(optarg, 0, INT_MAX); bb_dump_length = xatoi_u(optarg);
} /* else */ } /* else */
if (ch == 's') { if (ch == 's') {
bb_dump_skip = bb_xgetularg_bnd_sfx(optarg, 10, 0, LONG_MAX, suffixes); bb_dump_skip = xatoul_range_sfx(optarg, 0, LONG_MAX, suffixes);
} /* else */ } /* else */
if (ch == 'v') { if (ch == 'v') {
bb_dump_vflag = ALL; bb_dump_vflag = ALL;

View File

@ -581,7 +581,7 @@ int ipcs_main(int argc, char **argv)
opt = getopt32(argc, argv, "i:aqsmtcplu", &opt_i); opt = getopt32(argc, argv, "i:aqsmtcplu", &opt_i);
if (opt & 0x1) { // -i if (opt & 0x1) { // -i
id = atoi(opt_i); id = xatoi(opt_i);
flags |= flag_print; flags |= flag_print;
} }
if (opt & 0x2) flags |= flag_msg | flag_sem | flag_shm; // -a if (opt & 0x2) flags |= flag_msg | flag_sem | flag_shm; // -a

View File

@ -16,7 +16,7 @@ int losetup_main(int argc, char **argv)
{ {
unsigned opt; unsigned opt;
char *opt_o; char *opt_o;
int offset = 0; unsigned long long offset = 0;
opt = getopt32(argc, argv, "do:", &opt_o); opt = getopt32(argc, argv, "do:", &opt_o);
argc -= optind; argc -= optind;
@ -35,7 +35,7 @@ int losetup_main(int argc, char **argv)
} }
if (opt == 0x2) // -o if (opt == 0x2) // -o
offset = bb_xparse_number(opt_o, NULL); offset = xatoull(opt_o);
/* -o or no option */ /* -o or no option */

View File

@ -856,7 +856,7 @@ static int nfsmount(struct mntent *mp, int vfsflags, char *filteropts)
for (opt = strtok(filteropts, ","); opt; opt = strtok(NULL, ",")) { for (opt = strtok(filteropts, ","); opt; opt = strtok(NULL, ",")) {
char *opteq = strchr(opt, '='); char *opteq = strchr(opt, '=');
if (opteq) { if (opteq) {
int val = atoi(opteq + 1); int val = xatoi_u(opteq + 1);
*opteq = '\0'; *opteq = '\0';
if (!strcmp(opt, "rsize")) if (!strcmp(opt, "rsize"))
data.rsize = val; data.rsize = val;

View File

@ -38,8 +38,8 @@
#define S_LEN 128 #define S_LEN 128
/* These are the defaults */ /* These are the defaults */
static const char defaultmap[]="/boot/System.map"; static const char defaultmap[] = "/boot/System.map";
static const char defaultpro[]="/proc/profile"; static const char defaultpro[] = "/proc/profile";
int readprofile_main(int argc, char **argv) int readprofile_main(int argc, char **argv)
{ {
@ -78,7 +78,7 @@ int readprofile_main(int argc, char **argv)
* not sizeof(int), the multiplier is not changed * not sizeof(int), the multiplier is not changed
*/ */
if (mult) { if (mult) {
multiplier = strtoul(mult, 0, 10); multiplier = xatoi_u(mult);
to_write = sizeof(int); to_write = sizeof(int);
} else { } else {
multiplier = 0; multiplier = 0;