aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-10-08 12:49:22 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-10-08 12:49:22 +0000
commit87d25a2b8535dc627a02eb539fa3946be2a24647 (patch)
treefc4d14a910593d1235318bb36abe5e9f72d2039e
parent81177b14907e73f11560f69e0b4ec34371f1a7d5 (diff)
downloadbusybox-w32-87d25a2b8535dc627a02eb539fa3946be2a24647.tar.gz
busybox-w32-87d25a2b8535dc627a02eb539fa3946be2a24647.tar.bz2
busybox-w32-87d25a2b8535dc627a02eb539fa3946be2a24647.zip
attempt to regularize atoi mess.
git-svn-id: svn://busybox.net/trunk/busybox@16342 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r--TODO3
-rw-r--r--applets/applets.c4
-rw-r--r--archival/cpio.c2
-rw-r--r--archival/libunarchive/Kbuild2
-rw-r--r--archival/libunarchive/get_header_ar.c12
-rw-r--r--archival/libunarchive/get_header_tar.c45
-rw-r--r--archival/libunarchive/get_header_tar_bz2.c6
-rw-r--r--archival/libunarchive/get_header_tar_gz.c6
-rw-r--r--archival/libunarchive/get_header_tar_lzma.c5
-rw-r--r--archival/libunarchive/seek_by_jump.c2
-rw-r--r--archival/libunarchive/seek_by_read.c (renamed from archival/libunarchive/seek_by_char.c)8
-rw-r--r--archival/rpm.c2
-rw-r--r--archival/tar.c4
-rw-r--r--archival/unzip.c11
-rw-r--r--console-tools/chvt.c7
-rw-r--r--console-tools/deallocvt.c19
-rw-r--r--console-tools/openvt.c12
-rw-r--r--console-tools/setkeycodes.c13
-rw-r--r--console-tools/setlogcons.c2
-rw-r--r--coreutils/cal.c4
-rw-r--r--coreutils/cut.c16
-rw-r--r--coreutils/dd.c12
-rw-r--r--coreutils/diff.c2
-rw-r--r--coreutils/du.c2
-rw-r--r--coreutils/fold.c2
-rw-r--r--coreutils/head.c36
-rw-r--r--coreutils/ls.c8
-rw-r--r--coreutils/mknod.c9
-rw-r--r--coreutils/nice.c2
-rw-r--r--coreutils/printf.c40
-rw-r--r--coreutils/sleep.c12
-rw-r--r--coreutils/stty.c36
-rw-r--r--coreutils/tail.c4
-rw-r--r--coreutils/uniq.c2
-rw-r--r--coreutils/usleep.c2
-rw-r--r--coreutils/watch.c2
-rw-r--r--debianutils/run_parts.c44
-rw-r--r--debianutils/start_stop_daemon.c2
-rw-r--r--editors/patch.c2
-rw-r--r--findutils/find.c45
-rw-r--r--findutils/xargs.c4
-rw-r--r--include/libbb.h68
-rw-r--r--include/unarchive.h2
-rw-r--r--init/halt.c2
-rw-r--r--libbb/Kbuild6
-rw-r--r--libbb/loop.c60
-rw-r--r--libbb/parse_number.c50
-rw-r--r--libbb/safe_strtol.c102
-rw-r--r--libbb/xatol.c210
-rw-r--r--libbb/xgetlarg.c32
-rw-r--r--libbb/xgetularg.c127
-rw-r--r--loginutils/addgroup.c5
-rw-r--r--loginutils/getty.c17
-rw-r--r--loginutils/sulogin.c6
-rw-r--r--loginutils/vlock.c2
-rw-r--r--miscutils/adjtimex.c12
-rw-r--r--miscutils/crond.c8
-rw-r--r--miscutils/dc.c2
-rw-r--r--miscutils/hdparm.c6
-rw-r--r--miscutils/makedevs.c8
-rw-r--r--miscutils/mt.c2
-rw-r--r--miscutils/strings.c5
-rw-r--r--miscutils/watchdog.c4
-rw-r--r--modutils/insmod.c2
-rw-r--r--networking/arping.c8
-rw-r--r--networking/ftpgetput.c14
-rw-r--r--networking/httpd.c2
-rw-r--r--networking/ifconfig.c3
-rw-r--r--networking/inetd.c29
-rw-r--r--networking/interface.c2
-rw-r--r--networking/ipcalc.c48
-rw-r--r--networking/nc.c22
-rw-r--r--networking/ping.c16
-rw-r--r--networking/ping6.c16
-rw-r--r--networking/route.c14
-rw-r--r--networking/telnetd.c4
-rw-r--r--networking/tftp.c4
-rw-r--r--networking/traceroute.c74
-rw-r--r--networking/udhcp/dhcpc.c4
-rw-r--r--networking/udhcp/files.c8
-rw-r--r--networking/vconfig.c10
-rw-r--r--networking/wget.c10
-rw-r--r--procps/kill.c4
-rw-r--r--procps/pidof.c10
-rw-r--r--procps/renice.c18
-rw-r--r--procps/top.c8
-rw-r--r--runit/chpst.c42
-rw-r--r--sysklogd/klogd.c3
-rw-r--r--sysklogd/logger.c9
-rw-r--r--sysklogd/syslogd.c14
-rw-r--r--util-linux/dmesg.c4
-rw-r--r--util-linux/fbset.c30
-rw-r--r--util-linux/fdisk.c13
-rw-r--r--util-linux/hexdump.c4
-rw-r--r--util-linux/ipcs.c2
-rw-r--r--util-linux/losetup.c4
-rw-r--r--util-linux/mount.c2
-rw-r--r--util-linux/readprofile.c6
98 files changed, 803 insertions, 849 deletions
diff --git a/TODO b/TODO
index 844a504d7..937302522 100644
--- a/TODO
+++ b/TODO
@@ -296,9 +296,6 @@ Minor stuff:
296--- 296---
297 possible code duplication ingroup() and is_a_group_member() 297 possible code duplication ingroup() and is_a_group_member()
298--- 298---
299 unify itoa: netstat.c, hush.c, lash.c, msh.c
300 Put one single, robust version into e.g. safe_strtol.c
301---
302 Move __get_hz() to a better place and (re)use it in route.c, ash.c, msh.c 299 Move __get_hz() to a better place and (re)use it in route.c, ash.c, msh.c
303--- 300---
304 301
diff --git a/applets/applets.c b/applets/applets.c
index b1f580953..5d8b80881 100644
--- a/applets/applets.c
+++ b/applets/applets.c
@@ -264,8 +264,8 @@ static void parse_config_file(void)
264 264
265 sct->m_uid = strtoul(s, &e2, 10); 265 sct->m_uid = strtoul(s, &e2, 10);
266 if (*e2 || (s == e2)) { 266 if (*e2 || (s == e2)) {
267 struct passwd *pwd; 267 struct passwd *pwd = getpwnam(s);
268 if (!(pwd = getpwnam(s))) { 268 if (!pwd) {
269 parse_error("user"); 269 parse_error("user");
270 } 270 }
271 sct->m_uid = pwd->pw_uid; 271 sct->m_uid = pwd->pw_uid;
diff --git a/archival/cpio.c b/archival/cpio.c
index d0d3288ff..751e87952 100644
--- a/archival/cpio.c
+++ b/archival/cpio.c
@@ -35,7 +35,7 @@ int cpio_main(int argc, char **argv)
35 /* Initialise */ 35 /* Initialise */
36 archive_handle = init_handle(); 36 archive_handle = init_handle();
37 archive_handle->src_fd = STDIN_FILENO; 37 archive_handle->src_fd = STDIN_FILENO;
38 archive_handle->seek = seek_by_char; 38 archive_handle->seek = seek_by_read;
39 archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE; 39 archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE;
40 40
41 opt = getopt32(argc, argv, "ituvF:dm", &cpio_filename); 41 opt = getopt32(argc, argv, "ituvF:dm", &cpio_filename);
diff --git a/archival/libunarchive/Kbuild b/archival/libunarchive/Kbuild
index c5f1bfbfe..4e1454184 100644
--- a/archival/libunarchive/Kbuild
+++ b/archival/libunarchive/Kbuild
@@ -21,7 +21,7 @@ lib-y:= \
21\ 21\
22 archive_xread_all_eof.o \ 22 archive_xread_all_eof.o \
23\ 23\
24 seek_by_char.o \ 24 seek_by_read.o \
25 seek_by_jump.o \ 25 seek_by_jump.o \
26\ 26\
27 data_align.o \ 27 data_align.o \
diff --git a/archival/libunarchive/get_header_ar.c b/archival/libunarchive/get_header_ar.c
index cabb4101b..7372ada32 100644
--- a/archival/libunarchive/get_header_ar.c
+++ b/archival/libunarchive/get_header_ar.c
@@ -46,14 +46,14 @@ char get_header_ar(archive_handle_t *archive_handle)
46 46
47 /* align the headers based on the header magic */ 47 /* align the headers based on the header magic */
48 if ((ar.formatted.magic[0] != '`') || (ar.formatted.magic[1] != '\n')) { 48 if ((ar.formatted.magic[0] != '`') || (ar.formatted.magic[1] != '\n')) {
49 bb_error_msg_and_die("Invalid ar header"); 49 bb_error_msg_and_die("invalid ar header");
50 } 50 }
51 51
52 typed->mode = strtol(ar.formatted.mode, NULL, 8); 52 typed->mode = xstrtoul(ar.formatted.mode, 8);
53 typed->mtime = atoi(ar.formatted.date); 53 typed->mtime = xatou(ar.formatted.date);
54 typed->uid = atoi(ar.formatted.uid); 54 typed->uid = xatou(ar.formatted.uid);
55 typed->gid = atoi(ar.formatted.gid); 55 typed->gid = xatou(ar.formatted.gid);
56 typed->size = atoi(ar.formatted.size); 56 typed->size = xatoul(ar.formatted.size);
57 57
58 /* long filenames have '/' as the first character */ 58 /* long filenames have '/' as the first character */
59 if (ar.formatted.name[0] == '/') { 59 if (ar.formatted.name[0] == '/') {
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index 0c622f44a..d3cd96d0c 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -62,10 +62,10 @@ char get_header_tar(archive_handle_t *archive_handle)
62 * Read until the end to empty the pipe from gz or bz2 62 * Read until the end to empty the pipe from gz or bz2
63 */ 63 */
64 while (full_read(archive_handle->src_fd, tar.raw, 512) == 512); 64 while (full_read(archive_handle->src_fd, tar.raw, 512) == 512);
65 return(EXIT_FAILURE); 65 return EXIT_FAILURE;
66 } 66 }
67 end = 1; 67 end = 1;
68 return(EXIT_SUCCESS); 68 return EXIT_SUCCESS;
69 } 69 }
70 end = 0; 70 end = 0;
71 71
@@ -76,19 +76,18 @@ char get_header_tar(archive_handle_t *archive_handle)
76#ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY 76#ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY
77 if (strncmp(tar.formatted.magic, "\0\0\0\0\0", 5) != 0) 77 if (strncmp(tar.formatted.magic, "\0\0\0\0\0", 5) != 0)
78#endif 78#endif
79 bb_error_msg_and_die("Invalid tar magic"); 79 bb_error_msg_and_die("invalid tar magic");
80 } 80 }
81 /* Do checksum on headers */ 81 /* Do checksum on headers */
82 for (i = 0; i < 148 ; i++) { 82 for (i = 0; i < 148 ; i++) {
83 sum += tar.raw[i]; 83 sum += tar.raw[i];
84 } 84 }
85 sum += ' ' * 8; 85 sum += ' ' * 8;
86 for (i = 156; i < 512 ; i++) { 86 for (i = 156; i < 512 ; i++) {
87 sum += tar.raw[i]; 87 sum += tar.raw[i];
88 } 88 }
89 if (sum != strtol(tar.formatted.chksum, NULL, 8)) { 89 if (sum != xstrtoul(tar.formatted.chksum, 8)) {
90 bb_error_msg("Invalid tar header checksum"); 90 bb_error_msg_and_die("invalid tar header checksum");
91 return(EXIT_FAILURE);
92 } 91 }
93 92
94#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS 93#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
@@ -102,8 +101,7 @@ char get_header_tar(archive_handle_t *archive_handle)
102 } else 101 } else
103#endif 102#endif
104 { 103 {
105 file_header->name = xstrndup(tar.formatted.name,100); 104 file_header->name = xstrndup(tar.formatted.name, 100);
106
107 if (tar.formatted.prefix[0]) { 105 if (tar.formatted.prefix[0]) {
108 char *temp = file_header->name; 106 char *temp = file_header->name;
109 file_header->name = concat_path_file(tar.formatted.prefix, temp); 107 file_header->name = concat_path_file(tar.formatted.prefix, temp);
@@ -111,17 +109,18 @@ char get_header_tar(archive_handle_t *archive_handle)
111 } 109 }
112 } 110 }
113 111
114 file_header->uid = strtol(tar.formatted.uid, NULL, 8); 112 file_header->uid = xstrtoul(tar.formatted.uid, 8);
115 file_header->gid = strtol(tar.formatted.gid, NULL, 8); 113 file_header->gid = xstrtoul(tar.formatted.gid, 8);
116 file_header->size = strtol(tar.formatted.size, NULL, 8); 114 // TODO: LFS support
117 file_header->mtime = strtol(tar.formatted.mtime, NULL, 8); 115 file_header->size = xstrtoul(tar.formatted.size, 8);
118 file_header->link_name = (tar.formatted.linkname[0] != '\0') ? 116 file_header->mtime = xstrtoul(tar.formatted.mtime, 8);
119 xstrdup(tar.formatted.linkname) : NULL; 117 file_header->link_name = tar.formatted.linkname[0] ?
120 file_header->device = makedev(strtol(tar.formatted.devmajor, NULL, 8), 118 xstrdup(tar.formatted.linkname) : NULL;
121 strtol(tar.formatted.devminor, NULL, 8)); 119 file_header->device = makedev(xstrtoul(tar.formatted.devmajor, 8),
120 xstrtoul(tar.formatted.devminor, 8));
122 121
123 /* Set bits 0-11 of the files mode */ 122 /* Set bits 0-11 of the files mode */
124 file_header->mode = 07777 & strtol(tar.formatted.mode, NULL, 8); 123 file_header->mode = 07777 & xstrtoul(tar.formatted.mode, 8);
125 124
126 /* Set bits 12-15 of the files mode */ 125 /* Set bits 12-15 of the files mode */
127 switch (tar.formatted.typeflag) { 126 switch (tar.formatted.typeflag) {
@@ -161,7 +160,7 @@ char get_header_tar(archive_handle_t *archive_handle)
161 xread(archive_handle->src_fd, longname, file_header->size); 160 xread(archive_handle->src_fd, longname, file_header->size);
162 archive_handle->offset += file_header->size; 161 archive_handle->offset += file_header->size;
163 162
164 return(get_header_tar(archive_handle)); 163 return get_header_tar(archive_handle);
165 } 164 }
166 case 'K': { 165 case 'K': {
167 linkname = xzalloc(file_header->size + 1); 166 linkname = xzalloc(file_header->size + 1);
@@ -169,7 +168,7 @@ char get_header_tar(archive_handle_t *archive_handle)
169 archive_handle->offset += file_header->size; 168 archive_handle->offset += file_header->size;
170 169
171 file_header->name = linkname; 170 file_header->name = linkname;
172 return(get_header_tar(archive_handle)); 171 return get_header_tar(archive_handle);
173 } 172 }
174 case 'D': /* GNU dump dir */ 173 case 'D': /* GNU dump dir */
175 case 'M': /* Continuation of multi volume archive*/ 174 case 'M': /* Continuation of multi volume archive*/
@@ -179,10 +178,10 @@ char get_header_tar(archive_handle_t *archive_handle)
179#endif 178#endif
180 case 'g': /* pax global header */ 179 case 'g': /* pax global header */
181 case 'x': /* pax extended header */ 180 case 'x': /* pax extended header */
182 bb_error_msg("Ignoring extension type %c", tar.formatted.typeflag); 181 bb_error_msg("ignoring extension type %c", tar.formatted.typeflag);
183 break; 182 break;
184 default: 183 default:
185 bb_error_msg("Unknown typeflag: 0x%x", tar.formatted.typeflag); 184 bb_error_msg("unknown typeflag: 0x%x", tar.formatted.typeflag);
186 } 185 }
187 { /* Strip trailing '/' in directories */ 186 { /* Strip trailing '/' in directories */
188 /* Must be done after mode is set as '/' is used to check if its a directory */ 187 /* 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)
204 203
205 free(file_header->link_name); 204 free(file_header->link_name);
206 205
207 return(EXIT_SUCCESS); 206 return EXIT_SUCCESS;
208} 207}
diff --git a/archival/libunarchive/get_header_tar_bz2.c b/archival/libunarchive/get_header_tar_bz2.c
index a8b630814..e3cb328fc 100644
--- a/archival/libunarchive/get_header_tar_bz2.c
+++ b/archival/libunarchive/get_header_tar_bz2.c
@@ -16,12 +16,12 @@
16char get_header_tar_bz2(archive_handle_t *archive_handle) 16char get_header_tar_bz2(archive_handle_t *archive_handle)
17{ 17{
18 /* Cant lseek over pipe's */ 18 /* Cant lseek over pipe's */
19 archive_handle->seek = seek_by_char; 19 archive_handle->seek = seek_by_read;
20 20
21 archive_handle->src_fd = open_transformer(archive_handle->src_fd, uncompressStream); 21 archive_handle->src_fd = open_transformer(archive_handle->src_fd, uncompressStream);
22 archive_handle->offset = 0; 22 archive_handle->offset = 0;
23 while (get_header_tar(archive_handle) == EXIT_SUCCESS); 23 while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
24 24
25 /* Can only do one file at a time */ 25 /* Can only do one file at a time */
26 return(EXIT_FAILURE); 26 return EXIT_FAILURE;
27} 27}
diff --git a/archival/libunarchive/get_header_tar_gz.c b/archival/libunarchive/get_header_tar_gz.c
index 24e4f9c9f..af059a187 100644
--- a/archival/libunarchive/get_header_tar_gz.c
+++ b/archival/libunarchive/get_header_tar_gz.c
@@ -13,7 +13,7 @@ char get_header_tar_gz(archive_handle_t *archive_handle)
13 unsigned char magic[2]; 13 unsigned char magic[2];
14 14
15 /* Cant lseek over pipe's */ 15 /* Cant lseek over pipe's */
16 archive_handle->seek = seek_by_char; 16 archive_handle->seek = seek_by_read;
17 17
18 xread(archive_handle->src_fd, &magic, 2); 18 xread(archive_handle->src_fd, &magic, 2);
19 if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { 19 if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
@@ -24,8 +24,8 @@ char get_header_tar_gz(archive_handle_t *archive_handle)
24 24
25 archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip); 25 archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip);
26 archive_handle->offset = 0; 26 archive_handle->offset = 0;
27 while (get_header_tar(archive_handle) == EXIT_SUCCESS); 27 while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
28 28
29 /* Can only do one file at a time */ 29 /* Can only do one file at a time */
30 return(EXIT_FAILURE); 30 return EXIT_FAILURE;
31} 31}
diff --git a/archival/libunarchive/get_header_tar_lzma.c b/archival/libunarchive/get_header_tar_lzma.c
index e38583fef..06b8daa0f 100644
--- a/archival/libunarchive/get_header_tar_lzma.c
+++ b/archival/libunarchive/get_header_tar_lzma.c
@@ -11,13 +11,12 @@
11char get_header_tar_lzma(archive_handle_t * archive_handle) 11char get_header_tar_lzma(archive_handle_t * archive_handle)
12{ 12{
13 /* Can't lseek over pipes */ 13 /* Can't lseek over pipes */
14 archive_handle->seek = seek_by_char; 14 archive_handle->seek = seek_by_read;
15 15
16 archive_handle->src_fd = open_transformer(archive_handle->src_fd, unlzma); 16 archive_handle->src_fd = open_transformer(archive_handle->src_fd, unlzma);
17 archive_handle->offset = 0; 17 archive_handle->offset = 0;
18 while (get_header_tar(archive_handle) == EXIT_SUCCESS); 18 while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
19 19
20 /* Can only do one file at a time */ 20 /* Can only do one file at a time */
21 return EXIT_FAILURE; 21 return EXIT_FAILURE;
22} 22}
23
diff --git a/archival/libunarchive/seek_by_jump.c b/archival/libunarchive/seek_by_jump.c
index 231360fa3..e1917dd2a 100644
--- a/archival/libunarchive/seek_by_jump.c
+++ b/archival/libunarchive/seek_by_jump.c
@@ -16,7 +16,7 @@ void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amo
16 if (lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1) { 16 if (lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1) {
17#ifdef CONFIG_FEATURE_UNARCHIVE_TAPE 17#ifdef CONFIG_FEATURE_UNARCHIVE_TAPE
18 if (errno == ESPIPE) { 18 if (errno == ESPIPE) {
19 seek_by_char(archive_handle, amount); 19 seek_by_read(archive_handle, amount);
20 } else 20 } else
21#endif 21#endif
22 bb_perror_msg_and_die("Seek failure"); 22 bb_perror_msg_and_die("Seek failure");
diff --git a/archival/libunarchive/seek_by_char.c b/archival/libunarchive/seek_by_read.c
index f4d8c2f2b..03cbb9ecc 100644
--- a/archival/libunarchive/seek_by_char.c
+++ b/archival/libunarchive/seek_by_read.c
@@ -8,14 +8,10 @@
8#include "unarchive.h" 8#include "unarchive.h"
9#include "libbb.h" 9#include "libbb.h"
10 10
11 11/* If we are reading through a pipe(), or from stdin then we cant lseek,
12
13/* If we are reading through a pipe(), or from stdin then we cant lseek,
14 * we must read and discard the data to skip over it. 12 * we must read and discard the data to skip over it.
15 *
16 * TODO: rename to seek_by_read
17 */ 13 */
18void seek_by_char(const archive_handle_t *archive_handle, const unsigned int jump_size) 14void seek_by_read(const archive_handle_t *archive_handle, const unsigned int jump_size)
19{ 15{
20 if (jump_size) { 16 if (jump_size) {
21 bb_copyfd_size(archive_handle->src_fd, -1, jump_size); 17 bb_copyfd_size(archive_handle->src_fd, -1, jump_size);
diff --git a/archival/rpm.c b/archival/rpm.c
index dc37e0edb..448a479a0 100644
--- a/archival/rpm.c
+++ b/archival/rpm.c
@@ -173,7 +173,7 @@ static void extract_cpio_gz(int fd) {
173 173
174 /* Initialise */ 174 /* Initialise */
175 archive_handle = init_handle(); 175 archive_handle = init_handle();
176 archive_handle->seek = seek_by_char; 176 archive_handle->seek = seek_by_read;
177 //archive_handle->action_header = header_list; 177 //archive_handle->action_header = header_list;
178 archive_handle->action_data = data_extract_all; 178 archive_handle->action_data = data_extract_all;
179 archive_handle->flags |= ARCHIVE_PRESERVE_DATE; 179 archive_handle->flags |= ARCHIVE_PRESERVE_DATE;
diff --git a/archival/tar.c b/archival/tar.c
index 3775598cc..b2ae3b2af 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -541,7 +541,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
541static char get_header_tar_Z(archive_handle_t *archive_handle) 541static char get_header_tar_Z(archive_handle_t *archive_handle)
542{ 542{
543 /* Cant lseek over pipe's */ 543 /* Cant lseek over pipe's */
544 archive_handle->seek = seek_by_char; 544 archive_handle->seek = seek_by_read;
545 545
546 /* do the decompression, and cleanup */ 546 /* do the decompression, and cleanup */
547 if (xread_char(archive_handle->src_fd) != 0x1f || 547 if (xread_char(archive_handle->src_fd) != 0x1f ||
@@ -805,7 +805,7 @@ int tar_main(int argc, char **argv)
805 805
806 if ((tar_filename[0] == '-') && (tar_filename[1] == '\0')) { 806 if ((tar_filename[0] == '-') && (tar_filename[1] == '\0')) {
807 tar_handle->src_fd = fileno(tar_stream); 807 tar_handle->src_fd = fileno(tar_stream);
808 tar_handle->seek = seek_by_char; 808 tar_handle->seek = seek_by_read;
809 } else { 809 } else {
810 tar_handle->src_fd = xopen3(tar_filename, flags, 0666); 810 tar_handle->src_fd = xopen3(tar_filename, flags, 0666);
811 } 811 }
diff --git a/archival/unzip.c b/archival/unzip.c
index f63925739..f70baebf9 100644
--- a/archival/unzip.c
+++ b/archival/unzip.c
@@ -51,11 +51,12 @@ typedef union {
51 } formatted ATTRIBUTE_PACKED; 51 } formatted ATTRIBUTE_PACKED;
52} zip_header_t; 52} zip_header_t;
53 53
54/* This one never works with LARGEFILE-sized skips */
54static void unzip_skip(int fd, off_t skip) 55static void unzip_skip(int fd, off_t skip)
55{ 56{
56 if (lseek(fd, skip, SEEK_CUR) == (off_t)-1) { 57 if (lseek(fd, skip, SEEK_CUR) == (off_t)-1) {
57 if ((errno != ESPIPE) || (bb_copyfd_size(fd, -1, skip) != skip)) { 58 if ((errno != ESPIPE) || (bb_copyfd_size(fd, -1, skip) != skip)) {
58 bb_error_msg_and_die("Seek failure"); 59 bb_error_msg_and_die("seek failure");
59 } 60 }
60 } 61 }
61} 62}
@@ -65,7 +66,7 @@ static void unzip_create_leading_dirs(char *fn)
65 /* Create all leading directories */ 66 /* Create all leading directories */
66 char *name = xstrdup(fn); 67 char *name = xstrdup(fn);
67 if (bb_make_directory(dirname(name), 0777, FILEUTILS_RECUR)) { 68 if (bb_make_directory(dirname(name), 0777, FILEUTILS_RECUR)) {
68 bb_error_msg_and_die("Exiting"); /* bb_make_directory is noisy */ 69 bb_error_msg_and_die("exiting"); /* bb_make_directory is noisy */
69 } 70 }
70 free(name); 71 free(name);
71} 72}
@@ -76,7 +77,7 @@ static int unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
76 /* Method 0 - stored (not compressed) */ 77 /* Method 0 - stored (not compressed) */
77 int size = zip_header->formatted.ucmpsize; 78 int size = zip_header->formatted.ucmpsize;
78 if (size && (bb_copyfd_size(src_fd, dst_fd, size) != size)) { 79 if (size && (bb_copyfd_size(src_fd, dst_fd, size) != size)) {
79 bb_error_msg_and_die("Cannot complete extraction"); 80 bb_error_msg_and_die("cannot complete extraction");
80 } 81 }
81 82
82 } else { 83 } else {
@@ -86,12 +87,12 @@ static int unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
86 inflate_cleanup(); 87 inflate_cleanup();
87 /* Validate decompression - crc */ 88 /* Validate decompression - crc */
88 if (zip_header->formatted.crc32 != (gunzip_crc ^ 0xffffffffL)) { 89 if (zip_header->formatted.crc32 != (gunzip_crc ^ 0xffffffffL)) {
89 bb_error_msg("Invalid compressed data--crc error"); 90 bb_error_msg("invalid compressed data--%s error", "crc");
90 return 1; 91 return 1;
91 } 92 }
92 /* Validate decompression - size */ 93 /* Validate decompression - size */
93 if (zip_header->formatted.ucmpsize != gunzip_bytes_out) { 94 if (zip_header->formatted.ucmpsize != gunzip_bytes_out) {
94 bb_error_msg("Invalid compressed data--length error"); 95 bb_error_msg("invalid compressed data--%s error", "length");
95 return 1; 96 return 1;
96 } 97 }
97 } 98 }
diff --git a/console-tools/chvt.c b/console-tools/chvt.c
index aff66e007..bbc5a9c31 100644
--- a/console-tools/chvt.c
+++ b/console-tools/chvt.c
@@ -7,11 +7,6 @@
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */ 8 */
9 9
10#include <stdio.h>
11#include <stdlib.h>
12#include <fcntl.h>
13#include <sys/types.h>
14#include <sys/ioctl.h>
15#include "busybox.h" 10#include "busybox.h"
16 11
17/* From <linux/vt.h> */ 12/* From <linux/vt.h> */
@@ -29,7 +24,7 @@ int chvt_main(int argc, char **argv)
29 } 24 }
30 25
31 fd = get_console_fd(); 26 fd = get_console_fd();
32 num = bb_xgetlarg(argv[1], 10, 0, INT_MAX); 27 num = xatoul_range(argv[1], 1, 63);
33 if ((-1 == ioctl(fd, VT_ACTIVATE, num)) 28 if ((-1 == ioctl(fd, VT_ACTIVATE, num))
34 || (-1 == ioctl(fd, VT_WAITACTIVE, num))) { 29 || (-1 == ioctl(fd, VT_WAITACTIVE, num))) {
35 bb_perror_msg_and_die("ioctl"); 30 bb_perror_msg_and_die("ioctl");
diff --git a/console-tools/deallocvt.c b/console-tools/deallocvt.c
index b2e8e2bef..cd581b1c8 100644
--- a/console-tools/deallocvt.c
+++ b/console-tools/deallocvt.c
@@ -10,11 +10,6 @@
10 10
11/* no options, no getopt */ 11/* no options, no getopt */
12 12
13#include <stdlib.h>
14#include <stdio.h>
15#include <fcntl.h>
16#include <sys/types.h>
17#include <sys/ioctl.h>
18#include "busybox.h" 13#include "busybox.h"
19 14
20/* From <linux/vt.h> */ 15/* From <linux/vt.h> */
@@ -26,15 +21,13 @@ int deallocvt_main(int argc, char *argv[])
26 int num = 0; 21 int num = 0;
27 22
28 switch (argc) { 23 switch (argc) {
29 case 2: 24 case 2:
30 if ((num = bb_xgetlarg(argv[1], 10, 0, INT_MAX)) == 0) { 25 num = xatoul_range(argv[1], 1, 63);
31 bb_error_msg_and_die("0: illegal VT number");
32 }
33 /* Fallthrough */ 26 /* Fallthrough */
34 case 1: 27 case 1:
35 break; 28 break;
36 default: 29 default:
37 bb_show_usage(); 30 bb_show_usage();
38 } 31 }
39 32
40 if (-1 == ioctl(get_console_fd(), VT_DISALLOCATE, num)) { 33 if (-1 == ioctl(get_console_fd(), VT_DISALLOCATE, num)) {
diff --git a/console-tools/openvt.c b/console-tools/openvt.c
index 0c0cef23c..f1cf5645b 100644
--- a/console-tools/openvt.c
+++ b/console-tools/openvt.c
@@ -10,14 +10,6 @@
10 10
11/* getopt not needed */ 11/* getopt not needed */
12 12
13#include <stdio.h>
14#include <stdlib.h>
15#include <unistd.h>
16#include <fcntl.h>
17#include <string.h>
18#include <sys/types.h>
19#include <ctype.h>
20
21#include "busybox.h" 13#include "busybox.h"
22 14
23int openvt_main(int argc, char **argv) 15int openvt_main(int argc, char **argv)
@@ -29,8 +21,8 @@ int openvt_main(int argc, char **argv)
29 if (argc < 3) { 21 if (argc < 3) {
30 bb_show_usage(); 22 bb_show_usage();
31 } 23 }
32 /* check for Illegal vt number: < 1 or > 12 */ 24 /* check for illegal vt number: < 1 or > 63 */
33 sprintf(vtname, VC_FORMAT, (int)bb_xgetlarg(argv[1], 10, 1, 12)); 25 sprintf(vtname, VC_FORMAT, (int)xatoul_range(argv[1], 1, 63));
34 26
35 if (fork() == 0) { 27 if (fork() == 0) {
36 /* leave current vt */ 28 /* leave current vt */
diff --git a/console-tools/setkeycodes.c b/console-tools/setkeycodes.c
index 607b8c785..d82525786 100644
--- a/console-tools/setkeycodes.c
+++ b/console-tools/setkeycodes.c
@@ -27,7 +27,6 @@ enum {
27extern int 27extern int
28setkeycodes_main(int argc, char** argv) 28setkeycodes_main(int argc, char** argv)
29{ 29{
30 char *ep;
31 int fd, sc; 30 int fd, sc;
32 struct kbkeycode a; 31 struct kbkeycode a;
33 32
@@ -38,19 +37,13 @@ setkeycodes_main(int argc, char** argv)
38 fd = get_console_fd(); 37 fd = get_console_fd();
39 38
40 while (argc > 2) { 39 while (argc > 2) {
41 a.keycode = atoi(argv[2]); 40 a.keycode = xatoul_range(argv[2], 0, 127);
42 a.scancode = sc = strtol(argv[1], &ep, 16); 41 a.scancode = sc = xstrtoul_range(argv[1], 16, 0, 255);
43 if (*ep) {
44 bb_error_msg_and_die("error reading SCANCODE: '%s'", argv[1]);
45 }
46 if (a.scancode > 127) { 42 if (a.scancode > 127) {
47 a.scancode -= 0xe000; 43 a.scancode -= 0xe000;
48 a.scancode += 128; 44 a.scancode += 128;
49 } 45 }
50 if (a.scancode > 255 || a.keycode > 127) { 46 if (ioctl(fd, KDSETKEYCODE, &a)) {
51 bb_error_msg_and_die("SCANCODE or KEYCODE outside bounds");
52 }
53 if (ioctl(fd,KDSETKEYCODE,&a)) {
54 bb_perror_msg_and_die("failed to set SCANCODE %x to KEYCODE %d", sc, a.keycode); 47 bb_perror_msg_and_die("failed to set SCANCODE %x to KEYCODE %d", sc, a.keycode);
55 } 48 }
56 argc -= 2; 49 argc -= 2;
diff --git a/console-tools/setlogcons.c b/console-tools/setlogcons.c
index 90f24ce9c..ae15b9b28 100644
--- a/console-tools/setlogcons.c
+++ b/console-tools/setlogcons.c
@@ -22,7 +22,7 @@ extern int setlogcons_main(int argc, char **argv)
22 arg.subarg = 0; /* to specified console (current as default) */ 22 arg.subarg = 0; /* to specified console (current as default) */
23 23
24 if (argc == 2) 24 if (argc == 2)
25 arg.subarg = atoi(argv[1]); 25 arg.subarg = xatoul_range(argv[1], 0, 63);
26 26
27 if (ioctl(xopen(VC_1, O_RDONLY), TIOCLINUX, &arg)) 27 if (ioctl(xopen(VC_1, O_RDONLY), TIOCLINUX, &arg))
28 bb_perror_msg_and_die("TIOCLINUX"); 28 bb_perror_msg_and_die("TIOCLINUX");
diff --git a/coreutils/cal.c b/coreutils/cal.c
index ef914128c..e2bc5ab12 100644
--- a/coreutils/cal.c
+++ b/coreutils/cal.c
@@ -112,9 +112,9 @@ int cal_main(int argc, char **argv)
112 } 112 }
113 } else { 113 } else {
114 if (argc == 2) { 114 if (argc == 2) {
115 month = bb_xgetularg10_bnd(*argv++, 1, 12); 115 month = xatoul_range(*argv++, 1, 12);
116 } 116 }
117 year = bb_xgetularg10_bnd(*argv, 1, 9999); 117 year = xatoul_range(*argv, 1, 9999);
118 } 118 }
119 119
120 blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian); 120 blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian);
diff --git a/coreutils/cut.c b/coreutils/cut.c
index 69f28fa8d..7ba947fae 100644
--- a/coreutils/cut.c
+++ b/coreutils/cut.c
@@ -163,17 +163,7 @@ static void cut_file(FILE * file)
163 } 163 }
164} 164}
165 165
166static int getval(char *ntok) 166static const char _op_on_field[] = " only when operating on fields";
167{
168 char *junk;
169 int i = strtoul(ntok, &junk, 10);
170
171 if (*junk != '\0' || i < 0)
172 bb_error_msg_and_die("invalid byte or field list");
173 return i;
174}
175
176static const char * const _op_on_field = " only when operating on fields";
177 167
178int cut_main(int argc, char **argv) 168int cut_main(int argc, char **argv)
179{ 169{
@@ -231,7 +221,7 @@ int cut_main(int argc, char **argv)
231 } else if (strlen(ntok) == 0) { 221 } else if (strlen(ntok) == 0) {
232 s = BOL; 222 s = BOL;
233 } else { 223 } else {
234 s = getval(ntok); 224 s = xatoi_u(ntok);
235 /* account for the fact that arrays are zero based, while 225 /* account for the fact that arrays are zero based, while
236 * the user expects the first char on the line to be char #1 */ 226 * the user expects the first char on the line to be char #1 */
237 if (s != 0) 227 if (s != 0)
@@ -245,7 +235,7 @@ int cut_main(int argc, char **argv)
245 } else if (strlen(ntok) == 0) { 235 } else if (strlen(ntok) == 0) {
246 e = EOL; 236 e = EOL;
247 } else { 237 } else {
248 e = getval(ntok); 238 e = xatoi_u(ntok);
249 /* if the user specified and end position of 0, that means "til the 239 /* if the user specified and end position of 0, that means "til the
250 * end of the line */ 240 * end of the line */
251 if (e == 0) 241 if (e == 0)
diff --git a/coreutils/dd.c b/coreutils/dd.c
index e63244d81..d557ae46d 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -62,19 +62,19 @@ int dd_main(int argc, char **argv)
62 for (n = 1; n < argc; n++) { 62 for (n = 1; n < argc; n++) {
63 // FIXME: make them capable of eating LARGE numbers 63 // FIXME: make them capable of eating LARGE numbers
64 if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("ibs=", argv[n], 4)) { 64 if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("ibs=", argv[n], 4)) {
65 ibs = bb_xparse_number(argv[n]+4, dd_suffixes); 65 ibs = xatoul_sfx(argv[n]+4, dd_suffixes);
66 flags |= twobufs_flag; 66 flags |= twobufs_flag;
67 } else if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("obs=", argv[n], 4)) { 67 } else if (ENABLE_FEATURE_DD_IBS_OBS && !strncmp("obs=", argv[n], 4)) {
68 obs = bb_xparse_number(argv[n]+4, dd_suffixes); 68 obs = xatoul_sfx(argv[n]+4, dd_suffixes);
69 flags |= twobufs_flag; 69 flags |= twobufs_flag;
70 } else if (!strncmp("bs=", argv[n], 3)) 70 } else if (!strncmp("bs=", argv[n], 3))
71 ibs = obs = bb_xparse_number(argv[n]+3, dd_suffixes); 71 ibs = obs = xatoul_sfx(argv[n]+3, dd_suffixes);
72 else if (!strncmp("count=", argv[n], 6)) 72 else if (!strncmp("count=", argv[n], 6))
73 count = bb_xparse_number(argv[n]+6, dd_suffixes); 73 count = xatoul_sfx(argv[n]+6, dd_suffixes);
74 else if (!strncmp("seek=", argv[n], 5)) 74 else if (!strncmp("seek=", argv[n], 5))
75 seek = bb_xparse_number(argv[n]+5, dd_suffixes); 75 seek = xatoul_sfx(argv[n]+5, dd_suffixes);
76 else if (!strncmp("skip=", argv[n], 5)) 76 else if (!strncmp("skip=", argv[n], 5))
77 skip = bb_xparse_number(argv[n]+5, dd_suffixes); 77 skip = xatoul_sfx(argv[n]+5, dd_suffixes);
78 else if (!strncmp("if=", argv[n], 3)) 78 else if (!strncmp("if=", argv[n], 3))
79 infile = argv[n]+3; 79 infile = argv[n]+3;
80 else if (!strncmp("of=", argv[n], 3)) 80 else if (!strncmp("of=", argv[n], 3))
diff --git a/coreutils/diff.c b/coreutils/diff.c
index b30aad5a7..65757d7d1 100644
--- a/coreutils/diff.c
+++ b/coreutils/diff.c
@@ -1192,7 +1192,7 @@ int diff_main(int argc, char **argv)
1192 1192
1193 context = 3; /* This is the default number of lines of context. */ 1193 context = 3; /* This is the default number of lines of context. */
1194 if (cmd_flags & FLAG_U) { 1194 if (cmd_flags & FLAG_U) {
1195 context = bb_xgetlarg(U_opt, 10, 1, INT_MAX); 1195 context = xatoul_range(U_opt, 1, INT_MAX);
1196 } 1196 }
1197 argc -= optind; 1197 argc -= optind;
1198 argv += optind; 1198 argv += optind;
diff --git a/coreutils/du.c b/coreutils/du.c
index 1452e5883..f61d978b7 100644
--- a/coreutils/du.c
+++ b/coreutils/du.c
@@ -215,7 +215,7 @@ int du_main(int argc, char **argv)
215 one_file_system = opt & (1 << 5); /* -x opt */ 215 one_file_system = opt & (1 << 5); /* -x opt */
216 if((opt & (1 << 6))) { 216 if((opt & (1 << 6))) {
217 /* -d opt */ 217 /* -d opt */
218 max_print_depth = bb_xgetularg10_bnd(smax_print_depth, 0, INT_MAX); 218 max_print_depth = xatoi_u(smax_print_depth);
219 } 219 }
220 if((opt & (1 << 7))) { 220 if((opt & (1 << 7))) {
221 /* -l opt */ 221 /* -l opt */
diff --git a/coreutils/fold.c b/coreutils/fold.c
index 3b5be64fe..45f4472e4 100644
--- a/coreutils/fold.c
+++ b/coreutils/fold.c
@@ -62,7 +62,7 @@ int fold_main(int argc, char **argv)
62 62
63 flags = getopt32(argc, argv, "bsw:", &w_opt); 63 flags = getopt32(argc, argv, "bsw:", &w_opt);
64 if (flags & FLAG_WIDTH) 64 if (flags & FLAG_WIDTH)
65 width = bb_xgetlarg(w_opt, 10, 1, 10000); 65 width = xatoul_range(w_opt, 1, 10000);
66 66
67 argv += optind; 67 argv += optind;
68 if (!*argv) { 68 if (!*argv) {
diff --git a/coreutils/head.c b/coreutils/head.c
index 7d5f219d2..060febcf7 100644
--- a/coreutils/head.c
+++ b/coreutils/head.c
@@ -64,32 +64,30 @@ int head_main(int argc, char **argv)
64 while ((opt = getopt(argc, argv, head_opts)) > 0) { 64 while ((opt = getopt(argc, argv, head_opts)) > 0) {
65 switch (opt) { 65 switch (opt) {
66#if ENABLE_FEATURE_FANCY_HEAD 66#if ENABLE_FEATURE_FANCY_HEAD
67 case 'q': 67 case 'q':
68 header_threshhold = INT_MAX; 68 header_threshhold = INT_MAX;
69 break; 69 break;
70 case 'v': 70 case 'v':
71 header_threshhold = -1; 71 header_threshhold = -1;
72 break; 72 break;
73 case 'c': 73 case 'c':
74 count_bytes = 1; 74 count_bytes = 1;
75 /* fall through */ 75 /* fall through */
76#endif 76#endif
77 case 'n': 77 case 'n':
78 p = optarg; 78 p = optarg;
79#if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_HEAD 79#if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_HEAD
80 GET_COUNT: 80 GET_COUNT:
81#endif 81#endif
82 82
83#if !ENABLE_FEATURE_FANCY_HEAD 83#if !ENABLE_FEATURE_FANCY_HEAD
84 count = bb_xgetularg10(p); 84 count = xatoul(p);
85#else 85#else
86 count = bb_xgetularg_bnd_sfx(p, 10, 86 count = xatoul_sfx(p, head_suffixes);
87 0, ULONG_MAX,
88 head_suffixes);
89#endif 87#endif
90 break; 88 break;
91 default: 89 default:
92 bb_show_usage(); 90 bb_show_usage();
93 } 91 }
94 } 92 }
95 93
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 8ba4ab758..f34e83ebe 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -163,8 +163,8 @@ static int list_single(struct dnode *);
163static unsigned int all_fmt; 163static unsigned int all_fmt;
164 164
165#ifdef CONFIG_FEATURE_AUTOWIDTH 165#ifdef CONFIG_FEATURE_AUTOWIDTH
166static int terminal_width = TERMINAL_WIDTH; 166static unsigned terminal_width = TERMINAL_WIDTH;
167static unsigned short tabstops = COLUMN_GAP; 167static unsigned tabstops = COLUMN_GAP;
168#else 168#else
169#define tabstops COLUMN_GAP 169#define tabstops COLUMN_GAP
170#define terminal_width TERMINAL_WIDTH 170#define terminal_width TERMINAL_WIDTH
@@ -915,10 +915,10 @@ int ls_main(int argc, char **argv)
915#endif 915#endif
916 ); 916 );
917 if (tabstops_str) { 917 if (tabstops_str) {
918 tabstops = atoi(tabstops_str); 918 tabstops = xatou(tabstops_str);
919 } 919 }
920 if (terminal_width_str) { 920 if (terminal_width_str) {
921 terminal_width = atoi(terminal_width_str); 921 terminal_width = xatou(terminal_width_str);
922 } 922 }
923#else 923#else
924 opt = getopt32(argc, argv, ls_options 924 opt = getopt32(argc, argv, ls_options
diff --git a/coreutils/mknod.c b/coreutils/mknod.c
index 9c97b0302..7cc478f17 100644
--- a/coreutils/mknod.c
+++ b/coreutils/mknod.c
@@ -9,11 +9,8 @@
9 9
10/* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ 10/* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */
11 11
12#include <stdlib.h>
13#include <string.h>
14#include <sys/stat.h>
15#include <sys/sysmacros.h> // For makedev 12#include <sys/sysmacros.h> // For makedev
16#include <unistd.h> 13
17#include "busybox.h" 14#include "busybox.h"
18#include "libcoreutils/coreutils.h" 15#include "libcoreutils/coreutils.h"
19 16
@@ -37,8 +34,8 @@ int mknod_main(int argc, char **argv)
37 if ((*name != 'p') && ((argc -= 2) == 2)) { 34 if ((*name != 'p') && ((argc -= 2) == 2)) {
38 /* Autodetect what the system supports; thexe macros should 35 /* Autodetect what the system supports; thexe macros should
39 * optimize out to two constants. */ 36 * optimize out to two constants. */
40 dev = makedev(bb_xgetularg10_bnd(argv[2], 0, major(UINT_MAX)), 37 dev = makedev(xatoul_range(argv[2], 0, major(UINT_MAX)),
41 bb_xgetularg10_bnd(argv[3], 0, minor(UINT_MAX))); 38 xatoul_range(argv[3], 0, minor(UINT_MAX)));
42 } 39 }
43 40
44 if (argc == 2) { 41 if (argc == 2) {
diff --git a/coreutils/nice.c b/coreutils/nice.c
index 4c54dddbb..a347001e3 100644
--- a/coreutils/nice.c
+++ b/coreutils/nice.c
@@ -52,7 +52,7 @@ int nice_main(int argc, char **argv)
52 if (argc < 4) { /* Missing priority and/or utility! */ 52 if (argc < 4) { /* Missing priority and/or utility! */
53 bb_show_usage(); 53 bb_show_usage();
54 } 54 }
55 adjustment = bb_xgetlarg(argv[1], 10, INT_MIN, INT_MAX); 55 adjustment = xatoi(argv[1]);
56 argv += 2; 56 argv += 2;
57 } 57 }
58 58
diff --git a/coreutils/printf.c b/coreutils/printf.c
index 4a208040f..1511034a1 100644
--- a/coreutils/printf.c
+++ b/coreutils/printf.c
@@ -30,7 +30,7 @@
30 30
31 %b = print an argument string, interpreting backslash escapes 31 %b = print an argument string, interpreting backslash escapes
32 32
33 The `format' argument is re-used as many times as necessary 33 The 'format' argument is re-used as many times as necessary
34 to convert all of the given arguments. 34 to convert all of the given arguments.
35 35
36 David MacKenzie <djm@gnu.ai.mit.edu> */ 36 David MacKenzie <djm@gnu.ai.mit.edu> */
@@ -57,7 +57,7 @@ static void multiconvert(char *arg, void *result, converter convert)
57 fputs(arg, stderr); 57 fputs(arg, stderr);
58} 58}
59 59
60static unsigned long xstrtoul(char *arg) 60static unsigned long my_xstrtoul(char *arg)
61{ 61{
62 unsigned long result; 62 unsigned long result;
63 63
@@ -65,14 +65,14 @@ static unsigned long xstrtoul(char *arg)
65 return result; 65 return result;
66} 66}
67 67
68static long xstrtol(char *arg) 68static long my_xstrtol(char *arg)
69{ 69{
70 long result; 70 long result;
71 multiconvert(arg, &result, (converter)safe_strtol); 71 multiconvert(arg, &result, (converter)safe_strtol);
72 return result; 72 return result;
73} 73}
74 74
75static double xstrtod(char *arg) 75static double my_xstrtod(char *arg)
76{ 76{
77 double result; 77 double result;
78 multiconvert(arg, &result, (converter)safe_strtod); 78 multiconvert(arg, &result, (converter)safe_strtod);
@@ -120,13 +120,13 @@ int printf_main(int argc, char **argv)
120} 120}
121 121
122/* Print the text in FORMAT, using ARGV (with ARGC elements) for 122/* Print the text in FORMAT, using ARGV (with ARGC elements) for
123 arguments to any `%' directives. 123 arguments to any '%' directives.
124 Return the number of elements of ARGV used. */ 124 Return the number of elements of ARGV used. */
125 125
126static int print_formatted(char *format, int argc, char **argv) 126static int print_formatted(char *format, int argc, char **argv)
127{ 127{
128 int save_argc = argc; /* Preserve original value. */ 128 int save_argc = argc; /* Preserve original value. */
129 char *f; /* Pointer into `format'. */ 129 char *f; /* Pointer into 'format'. */
130 char *direc_start; /* Start of % directive. */ 130 char *direc_start; /* Start of % directive. */
131 size_t direc_length; /* Length of % directive. */ 131 size_t direc_length; /* Length of % directive. */
132 int field_width; /* Arg to first '*', or -1 if none. */ 132 int field_width; /* Arg to first '*', or -1 if none. */
@@ -158,7 +158,7 @@ static int print_formatted(char *format, int argc, char **argv)
158 ++f; 158 ++f;
159 ++direc_length; 159 ++direc_length;
160 if (argc > 0) { 160 if (argc > 0) {
161 field_width = xstrtoul(*argv); 161 field_width = my_xstrtoul(*argv);
162 ++argv; 162 ++argv;
163 --argc; 163 --argc;
164 } else 164 } else
@@ -175,7 +175,7 @@ static int print_formatted(char *format, int argc, char **argv)
175 ++f; 175 ++f;
176 ++direc_length; 176 ++direc_length;
177 if (argc > 0) { 177 if (argc > 0) {
178 precision = xstrtoul(*argv); 178 precision = my_xstrtoul(*argv);
179 ++argv; 179 ++argv;
180 --argc; 180 --argc;
181 } else 181 } else
@@ -235,14 +235,14 @@ print_direc(char *start, size_t length, int field_width, int precision,
235 case 'i': 235 case 'i':
236 if (field_width < 0) { 236 if (field_width < 0) {
237 if (precision < 0) 237 if (precision < 0)
238 printf(p, xstrtol(argument)); 238 printf(p, my_xstrtol(argument));
239 else 239 else
240 printf(p, precision, xstrtol(argument)); 240 printf(p, precision, my_xstrtol(argument));
241 } else { 241 } else {
242 if (precision < 0) 242 if (precision < 0)
243 printf(p, field_width, xstrtol(argument)); 243 printf(p, field_width, my_xstrtol(argument));
244 else 244 else
245 printf(p, field_width, precision, xstrtol(argument)); 245 printf(p, field_width, precision, my_xstrtol(argument));
246 } 246 }
247 break; 247 break;
248 248
@@ -252,14 +252,14 @@ print_direc(char *start, size_t length, int field_width, int precision,
252 case 'X': 252 case 'X':
253 if (field_width < 0) { 253 if (field_width < 0) {
254 if (precision < 0) 254 if (precision < 0)
255 printf(p, xstrtoul(argument)); 255 printf(p, my_xstrtoul(argument));
256 else 256 else
257 printf(p, precision, xstrtoul(argument)); 257 printf(p, precision, my_xstrtoul(argument));
258 } else { 258 } else {
259 if (precision < 0) 259 if (precision < 0)
260 printf(p, field_width, xstrtoul(argument)); 260 printf(p, field_width, my_xstrtoul(argument));
261 else 261 else
262 printf(p, field_width, precision, xstrtoul(argument)); 262 printf(p, field_width, precision, my_xstrtoul(argument));
263 } 263 }
264 break; 264 break;
265 265
@@ -270,14 +270,14 @@ print_direc(char *start, size_t length, int field_width, int precision,
270 case 'G': 270 case 'G':
271 if (field_width < 0) { 271 if (field_width < 0) {
272 if (precision < 0) 272 if (precision < 0)
273 printf(p, xstrtod(argument)); 273 printf(p, my_xstrtod(argument));
274 else 274 else
275 printf(p, precision, xstrtod(argument)); 275 printf(p, precision, my_xstrtod(argument));
276 } else { 276 } else {
277 if (precision < 0) 277 if (precision < 0)
278 printf(p, field_width, xstrtod(argument)); 278 printf(p, field_width, my_xstrtod(argument));
279 else 279 else
280 printf(p, field_width, precision, xstrtod(argument)); 280 printf(p, field_width, precision, my_xstrtod(argument));
281 } 281 }
282 break; 282 break;
283 283
diff --git a/coreutils/sleep.c b/coreutils/sleep.c
index 3946c3433..e32e2157d 100644
--- a/coreutils/sleep.c
+++ b/coreutils/sleep.c
@@ -24,7 +24,7 @@
24#include "busybox.h" 24#include "busybox.h"
25 25
26#ifdef CONFIG_FEATURE_FANCY_SLEEP 26#ifdef CONFIG_FEATURE_FANCY_SLEEP
27static const struct suffix_mult sleep_suffixes[] = { 27static const struct suffix_mult sfx[] = {
28 { "s", 1 }, 28 { "s", 1 },
29 { "m", 60 }, 29 { "m", 60 },
30 { "h", 60*60 }, 30 { "h", 60*60 },
@@ -46,9 +46,7 @@ int sleep_main(int argc, char **argv)
46 ++argv; 46 ++argv;
47 duration = 0; 47 duration = 0;
48 do { 48 do {
49 duration += bb_xgetularg_bnd_sfx(*argv, 10, 49 duration += xatoul_range_sfx(*argv, 0, UINT_MAX-duration, sfx);
50 0, UINT_MAX-duration,
51 sleep_suffixes);
52 } while (*++argv); 50 } while (*++argv);
53 51
54#else /* CONFIG_FEATURE_FANCY_SLEEP */ 52#else /* CONFIG_FEATURE_FANCY_SLEEP */
@@ -57,11 +55,7 @@ int sleep_main(int argc, char **argv)
57 bb_show_usage(); 55 bb_show_usage();
58 } 56 }
59 57
60#if UINT_MAX == ULONG_MAX 58 duration = xatou(argv[1]);
61 duration = bb_xgetularg10(argv[1]);
62#else
63 duration = bb_xgetularg10_bnd(argv[1], 0, UINT_MAX);
64#endif
65 59
66#endif /* CONFIG_FEATURE_FANCY_SLEEP */ 60#endif /* CONFIG_FEATURE_FANCY_SLEEP */
67 61
diff --git a/coreutils/stty.c b/coreutils/stty.c
index a41faaf1e..8c16c27a9 100644
--- a/coreutils/stty.c
+++ b/coreutils/stty.c
@@ -370,9 +370,9 @@ enum {
370}; 370};
371 371
372/* The width of the screen, for output wrapping */ 372/* The width of the screen, for output wrapping */
373static int max_col; 373static unsigned max_col = 80; /* default */
374/* Current position, to know when to wrap */ 374/* Current position, to know when to wrap */
375static int current_col; 375static unsigned current_col;
376static const char *device_name = bb_msg_standard_input; 376static const char *device_name = bb_msg_standard_input;
377 377
378/* Return a string that is the printable representation of character CH */ 378/* 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)
422 422
423static speed_t string_to_baud_or_die(const char *arg) 423static speed_t string_to_baud_or_die(const char *arg)
424{ 424{
425 return tty_value_to_baud(bb_xparse_number(arg, 0)); 425 return tty_value_to_baud(xatou(arg));
426} 426}
427 427
428static void set_speed_or_die(enum speed_setting type, const char *arg, 428static void set_speed_or_die(enum speed_setting type, const char *arg,
@@ -556,9 +556,8 @@ static inline void display_window_size(int fancy) {}
556 556
557#endif /* !TIOCGWINSZ */ 557#endif /* !TIOCGWINSZ */
558 558
559static int screen_columns(void) 559static int screen_columns_or_die(void)
560{ 560{
561 int columns;
562 const char *s; 561 const char *s;
563 562
564#ifdef TIOCGWINSZ 563#ifdef TIOCGWINSZ
@@ -574,11 +573,10 @@ static int screen_columns(void)
574 return win.ws_col; 573 return win.ws_col;
575#endif 574#endif
576 575
577 columns = 80; 576 s = getenv("COLUMNS");
578 if ((s = getenv("COLUMNS"))) { 577 if (s)
579 columns = atoi(s); 578 return xatoi_u(s);
580 } 579 return 80;
581 return columns;
582} 580}
583 581
584static const struct suffix_mult stty_suffixes[] = { 582static const struct suffix_mult stty_suffixes[] = {
@@ -745,14 +743,14 @@ end_option:
745#ifdef HAVE_C_LINE 743#ifdef HAVE_C_LINE
746 case param_line: 744 case param_line:
747# ifndef TIOCGWINSZ 745# ifndef TIOCGWINSZ
748 bb_xparse_number(argnext, stty_suffixes); 746 xatoul_range_sfx(argnext, 1, INT_MAX, stty_suffixes);
749 break; 747 break;
750# endif /* else fall-through */ 748# endif /* else fall-through */
751#endif 749#endif
752#ifdef TIOCGWINSZ 750#ifdef TIOCGWINSZ
753 case param_rows: 751 case param_rows:
754 case param_cols: 752 case param_cols:
755 bb_xparse_number(argnext, stty_suffixes); 753 xatoul_range_sfx(argnext, 1, INT_MAX, stty_suffixes);
756 break; 754 break;
757 case param_size: 755 case param_size:
758#endif 756#endif
@@ -802,7 +800,7 @@ end_option:
802 perror_on_device_and_die("%s"); 800 perror_on_device_and_die("%s");
803 801
804 if (verbose_output || recoverable_output || noargs) { 802 if (verbose_output || recoverable_output || noargs) {
805 max_col = screen_columns(); 803 max_col = screen_columns_or_die();
806 output_func(&mode); 804 output_func(&mode);
807 return EXIT_SUCCESS; 805 return EXIT_SUCCESS;
808 } 806 }
@@ -846,24 +844,22 @@ end_option:
846 switch (param) { 844 switch (param) {
847#ifdef HAVE_C_LINE 845#ifdef HAVE_C_LINE
848 case param_line: 846 case param_line:
849 mode.c_line = bb_xparse_number(argnext, stty_suffixes); 847 mode.c_line = xatoul_sfx(argnext, stty_suffixes);
850 require_set_attr = 1; 848 require_set_attr = 1;
851 break; 849 break;
852#endif 850#endif
853#ifdef TIOCGWINSZ 851#ifdef TIOCGWINSZ
854 case param_cols: 852 case param_cols:
855 set_window_size(-1, (int) bb_xparse_number(argnext, stty_suffixes)); 853 set_window_size(-1, xatoul_sfx(argnext, stty_suffixes));
856 break; 854 break;
857 case param_size: 855 case param_size:
858 max_col = screen_columns();
859 display_window_size(0); 856 display_window_size(0);
860 break; 857 break;
861 case param_rows: 858 case param_rows:
862 set_window_size((int) bb_xparse_number(argnext, stty_suffixes), -1); 859 set_window_size(xatoul_sfx(argnext, stty_suffixes), -1);
863 break; 860 break;
864#endif 861#endif
865 case param_speed: 862 case param_speed:
866 max_col = screen_columns();
867 display_speed(&mode, 0); 863 display_speed(&mode, 0);
868 break; 864 break;
869 case param_ispeed: 865 case param_ispeed:
@@ -1096,7 +1092,7 @@ static void set_control_char_or_die(const struct control_info *info,
1096 unsigned char value; 1092 unsigned char value;
1097 1093
1098 if (info->name == stty_min || info->name == stty_time) 1094 if (info->name == stty_min || info->name == stty_time)
1099 value = bb_xparse_number(arg, stty_suffixes); 1095 value = xatoul_range_sfx(arg, 0, 0xff, stty_suffixes);
1100 else if (arg[0] == '\0' || arg[1] == '\0') 1096 else if (arg[0] == '\0' || arg[1] == '\0')
1101 value = arg[0]; 1097 value = arg[0];
1102 else if (streq(arg, "^-") || streq(arg, "undef")) 1098 else if (streq(arg, "^-") || streq(arg, "undef"))
@@ -1106,7 +1102,7 @@ static void set_control_char_or_die(const struct control_info *info,
1106 if (arg[1] == '?') 1102 if (arg[1] == '?')
1107 value = 127; 1103 value = 127;
1108 } else 1104 } else
1109 value = bb_xparse_number(arg, stty_suffixes); 1105 value = xatoul_range_sfx(arg, 0, 0xff, stty_suffixes);
1110 mode->c_cc[info->offset] = value; 1106 mode->c_cc[info->offset] = value;
1111} 1107}
1112 1108
diff --git a/coreutils/tail.c b/coreutils/tail.c
index 49f1bcd6a..82c0d99bc 100644
--- a/coreutils/tail.c
+++ b/coreutils/tail.c
@@ -132,7 +132,7 @@ int tail_main(int argc, char **argv)
132#if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_TAIL 132#if !ENABLE_DEBUG_YANK_SUSv2 || ENABLE_FEATURE_FANCY_TAIL
133 GET_COUNT: 133 GET_COUNT:
134#endif 134#endif
135 count = bb_xgetlarg10_sfx(optarg, tail_suffixes); 135 count = xatol_sfx(optarg, tail_suffixes);
136 /* Note: Leading whitespace is an error trapped above. */ 136 /* Note: Leading whitespace is an error trapped above. */
137 if (*optarg == '+') { 137 if (*optarg == '+') {
138 from_top = 1; 138 from_top = 1;
@@ -148,7 +148,7 @@ int tail_main(int argc, char **argv)
148 header_threshhold = INT_MAX; 148 header_threshhold = INT_MAX;
149 break; 149 break;
150 case 's': 150 case 's':
151 sleep_period =bb_xgetularg10_bnd(optarg, 0, UINT_MAX); 151 sleep_period = xatou(optarg);
152 break; 152 break;
153 case 'v': 153 case 'v':
154 header_threshhold = 0; 154 header_threshhold = 0;
diff --git a/coreutils/uniq.c b/coreutils/uniq.c
index 26afc00f4..1b201af24 100644
--- a/coreutils/uniq.c
+++ b/coreutils/uniq.c
@@ -37,7 +37,7 @@ int uniq_main(int argc, char **argv)
37 37
38 while ((opt = getopt(argc, argv, uniq_opts)) > 0) { 38 while ((opt = getopt(argc, argv, uniq_opts)) > 0) {
39 if ((opt == 'f') || (opt == 's')) { 39 if ((opt == 'f') || (opt == 's')) {
40 int t = bb_xgetularg10(optarg); 40 int t = xatoul(optarg);
41 if (opt == 'f') { 41 if (opt == 'f') {
42 skip_fields = t; 42 skip_fields = t;
43 } else { 43 } else {
diff --git a/coreutils/usleep.c b/coreutils/usleep.c
index 90ddc5a57..de473a7b2 100644
--- a/coreutils/usleep.c
+++ b/coreutils/usleep.c
@@ -20,7 +20,7 @@ int usleep_main(int argc, char **argv)
20 bb_show_usage(); 20 bb_show_usage();
21 } 21 }
22 22
23 if (usleep(bb_xgetularg10_bnd(argv[1], 0, UINT_MAX))) { 23 if (usleep(xatou(argv[1]))) {
24 bb_perror_nomsg_and_die(); 24 bb_perror_nomsg_and_die();
25 } 25 }
26 26
diff --git a/coreutils/watch.c b/coreutils/watch.c
index 7b9c6698a..b1a7d9086 100644
--- a/coreutils/watch.c
+++ b/coreutils/watch.c
@@ -28,7 +28,7 @@ int watch_main(int argc, char **argv)
28 /* don't use getopt, because it permutes the arguments */ 28 /* don't use getopt, because it permutes the arguments */
29 ++argv; 29 ++argv;
30 if ((argc > 3) && argv[0][0] == '-' && argv[0][1] == 'n') { 30 if ((argc > 3) && argv[0][0] == '-' && argv[0][1] == 'n') {
31 period = bb_xgetularg10_bnd(argv[1], 1, UINT_MAX); 31 period = xatou(argv[1]);
32 argv += 2; 32 argv += 2;
33 } 33 }
34 watched_argv = argv; 34 watched_argv = argv;
diff --git a/debianutils/run_parts.c b/debianutils/run_parts.c
index 964a221a8..f2d90b64d 100644
--- a/debianutils/run_parts.c
+++ b/debianutils/run_parts.c
@@ -60,31 +60,31 @@ int run_parts_main(int argc, char **argv)
60 60
61 umask(022); 61 umask(022);
62 62
63 while ((opt = getopt_long (argc, argv, "tu:a:", 63 while ((opt = getopt_long(argc, argv, "tu:a:",
64 runparts_long_options, NULL)) > 0) 64 runparts_long_options, NULL)) > 0)
65 { 65 {
66 switch (opt) { 66 switch (opt) {
67 /* Enable test mode */ 67 /* Enable test mode */
68 case 't': 68 case 't':
69 test_mode++; 69 test_mode++;
70 break; 70 break;
71 /* Set the umask of the programs executed */ 71 /* Set the umask of the programs executed */
72 case 'u': 72 case 'u':
73 /* Check and set the umask of the program executed. As stated in the original 73 /* Check and set the umask of the program executed. As stated in the original
74 * run-parts, the octal conversion in libc is not foolproof; it will take the 74 * run-parts, the octal conversion in libc is not foolproof; it will take the
75 * 8 and 9 digits under some circumstances. We'll just have to live with it. 75 * 8 and 9 digits under some circumstances. We'll just have to live with it.
76 */ 76 */
77 umask(bb_xgetlarg(optarg, 8, 0, 07777)); 77 umask(xstrtoul_range(optarg, 8, 0, 07777));
78 break; 78 break;
79 /* Pass an argument to the programs */ 79 /* Pass an argument to the programs */
80 case 'a': 80 case 'a':
81 /* Add an argument to the commands that we will call. 81 /* Add an argument to the commands that we will call.
82 * Called once for every argument. */ 82 * Called once for every argument. */
83 args = xrealloc(args, (argcount + 2) * (sizeof(char *))); 83 args = xrealloc(args, (argcount + 2) * (sizeof(char *)));
84 args[argcount++] = optarg; 84 args[argcount++] = optarg;
85 break; 85 break;
86 default: 86 default:
87 bb_show_usage(); 87 bb_show_usage();
88 } 88 }
89 } 89 }
90 90
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
index 57f42d8ef..6ced9caad 100644
--- a/debianutils/start_stop_daemon.c
+++ b/debianutils/start_stop_daemon.c
@@ -260,7 +260,7 @@ int start_stop_daemon_main(int argc, char **argv)
260 260
261// USE_FEATURE_START_STOP_DAEMON_FANCY( 261// USE_FEATURE_START_STOP_DAEMON_FANCY(
262// if (retry_arg) 262// if (retry_arg)
263// retries = bb_xgetlarg(retry_arg, 10, 0, INT_MAX); 263// retries = xatoi_u(retry_arg);
264// ) 264// )
265 argc -= optind; 265 argc -= optind;
266 argv += optind; 266 argv += optind;
diff --git a/editors/patch.c b/editors/patch.c
index c18659eda..047de9e57 100644
--- a/editors/patch.c
+++ b/editors/patch.c
@@ -87,7 +87,7 @@ int patch_main(int argc, char **argv)
87 char *p, *i; 87 char *p, *i;
88 ret = getopt32(argc, argv, "p:i:", &p, &i); 88 ret = getopt32(argc, argv, "p:i:", &p, &i);
89 if (ret & 1) 89 if (ret & 1)
90 patch_level = bb_xgetlarg(p, 10, -1, USHRT_MAX); 90 patch_level = xatol_range(p, -1, USHRT_MAX);
91 if (ret & 2) { 91 if (ret & 2) {
92 patch_file = xfopen(i, "r"); 92 patch_file = xfopen(i, "r");
93 } else { 93 } else {
diff --git a/findutils/find.c b/findutils/find.c
index 7e3613af4..913a778eb 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -216,53 +216,47 @@ int find_main(int argc, char **argv)
216#endif 216#endif
217#ifdef CONFIG_FEATURE_FIND_PERM 217#ifdef CONFIG_FEATURE_FIND_PERM
218 } else if (strcmp(argv[i], "-perm") == 0) { 218 } else if (strcmp(argv[i], "-perm") == 0) {
219 char *end;
220 if (++i == argc) 219 if (++i == argc)
221 bb_error_msg_and_die(bb_msg_requires_arg, "-perm"); 220 bb_error_msg_and_die(bb_msg_requires_arg, "-perm");
222 perm_mask = strtol(argv[i], &end, 8); 221 perm_mask = xstrtol_range(argv[i], 8, 0, 07777);
223 if ((end[0] != '\0') || (perm_mask > 07777)) 222 perm_char = argv[i][0];
224 bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-perm"); 223 if (perm_char == '-')
225 if ((perm_char = argv[i][0]) == '-')
226 perm_mask = -perm_mask; 224 perm_mask = -perm_mask;
227#endif 225#endif
228#ifdef CONFIG_FEATURE_FIND_MTIME 226#ifdef CONFIG_FEATURE_FIND_MTIME
229 } else if (strcmp(argv[i], "-mtime") == 0) { 227 } else if (strcmp(argv[i], "-mtime") == 0) {
230 char *end;
231 if (++i == argc) 228 if (++i == argc)
232 bb_error_msg_and_die(bb_msg_requires_arg, "-mtime"); 229 bb_error_msg_and_die(bb_msg_requires_arg, "-mtime");
233 mtime_days = strtol(argv[i], &end, 10); 230 mtime_days = xatol(argv[i]);
234 if (end[0] != '\0') 231 mtime_char = argv[i][0];
235 bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-mtime"); 232 if (mtime_char == '-')
236 if ((mtime_char = argv[i][0]) == '-')
237 mtime_days = -mtime_days; 233 mtime_days = -mtime_days;
238#endif 234#endif
239#ifdef CONFIG_FEATURE_FIND_MMIN 235#ifdef CONFIG_FEATURE_FIND_MMIN
240 } else if (strcmp(argv[i], "-mmin") == 0) { 236 } else if (strcmp(argv[i], "-mmin") == 0) {
241 char *end;
242 if (++i == argc) 237 if (++i == argc)
243 bb_error_msg_and_die(bb_msg_requires_arg, "-mmin"); 238 bb_error_msg_and_die(bb_msg_requires_arg, "-mmin");
244 mmin_mins = strtol(argv[i], &end, 10); 239 mmin_mins = xatol(argv[i]);
245 if (end[0] != '\0') 240 mmin_char = argv[i][0];
246 bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-mmin"); 241 if (mmin_char == '-')
247 if ((mmin_char = argv[i][0]) == '-')
248 mmin_mins = -mmin_mins; 242 mmin_mins = -mmin_mins;
249#endif 243#endif
250#ifdef CONFIG_FEATURE_FIND_XDEV 244#ifdef CONFIG_FEATURE_FIND_XDEV
251 } else if (strcmp(argv[i], "-xdev") == 0) { 245 } else if (strcmp(argv[i], "-xdev") == 0) {
252 struct stat stbuf; 246 struct stat stbuf;
253 247
254 xdev_count = ( firstopt - 1 ) ? ( firstopt - 1 ) : 1; 248 xdev_count = (firstopt - 1) ? (firstopt - 1) : 1;
255 xdev_dev = xmalloc ( xdev_count * sizeof( dev_t )); 249 xdev_dev = xmalloc(xdev_count * sizeof(dev_t));
256 250
257 if ( firstopt == 1 ) { 251 if (firstopt == 1) {
258 xstat ( ".", &stbuf ); 252 xstat(".", &stbuf);
259 xdev_dev [0] = stbuf. st_dev; 253 xdev_dev[0] = stbuf.st_dev;
260 } 254 }
261 else { 255 else {
262 256
263 for (i = 1; i < firstopt; i++) { 257 for (i = 1; i < firstopt; i++) {
264 xstat ( argv [i], &stbuf ); 258 xstat(argv[i], &stbuf);
265 xdev_dev [i-1] = stbuf. st_dev; 259 xdev_dev[i-1] = stbuf.st_dev;
266 } 260 }
267 } 261 }
268#endif 262#endif
@@ -271,17 +265,14 @@ int find_main(int argc, char **argv)
271 struct stat stat_newer; 265 struct stat stat_newer;
272 if (++i == argc) 266 if (++i == argc)
273 bb_error_msg_and_die(bb_msg_requires_arg, "-newer"); 267 bb_error_msg_and_die(bb_msg_requires_arg, "-newer");
274 xstat (argv[i], &stat_newer); 268 xstat(argv[i], &stat_newer);
275 newer_mtime = stat_newer.st_mtime; 269 newer_mtime = stat_newer.st_mtime;
276#endif 270#endif
277#ifdef CONFIG_FEATURE_FIND_INUM 271#ifdef CONFIG_FEATURE_FIND_INUM
278 } else if (strcmp(argv[i], "-inum") == 0) { 272 } else if (strcmp(argv[i], "-inum") == 0) {
279 char *end;
280 if (++i == argc) 273 if (++i == argc)
281 bb_error_msg_and_die(bb_msg_requires_arg, "-inum"); 274 bb_error_msg_and_die(bb_msg_requires_arg, "-inum");
282 inode_num = strtol(argv[i], &end, 10); 275 inode_num = xatoul(argv[i]);
283 if (end[0] != '\0')
284 bb_error_msg_and_die(bb_msg_invalid_arg, argv[i], "-inum");
285#endif 276#endif
286#ifdef CONFIG_FEATURE_FIND_EXEC 277#ifdef CONFIG_FEATURE_FIND_EXEC
287 } else if (strcmp(argv[i], "-exec") == 0) { 278 } else if (strcmp(argv[i], "-exec") == 0) {
diff --git a/findutils/xargs.c b/findutils/xargs.c
index 81997b6f6..e7cc7c379 100644
--- a/findutils/xargs.c
+++ b/findutils/xargs.c
@@ -426,7 +426,7 @@ int xargs_main(int argc, char **argv)
426 orig_arg_max -= 2048; /* POSIX.2 requires subtracting 2048 */ 426 orig_arg_max -= 2048; /* POSIX.2 requires subtracting 2048 */
427 427
428 if (opt & OPT_UPTO_SIZE) { 428 if (opt & OPT_UPTO_SIZE) {
429 n_max_chars = bb_xgetularg10_bnd(max_chars, 1, orig_arg_max); 429 n_max_chars = xatoul_range(max_chars, 1, orig_arg_max);
430 for (i = 0; i < argc; i++) { 430 for (i = 0; i < argc; i++) {
431 n_chars += strlen(*argv) + 1; 431 n_chars += strlen(*argv) + 1;
432 } 432 }
@@ -446,7 +446,7 @@ int xargs_main(int argc, char **argv)
446 max_chars = xmalloc(n_max_chars); 446 max_chars = xmalloc(n_max_chars);
447 447
448 if (opt & OPT_UPTO_NUMBER) { 448 if (opt & OPT_UPTO_NUMBER) {
449 n_max_arg = bb_xgetularg10_bnd(max_args, 1, INT_MAX); 449 n_max_arg = xatoul_range(max_args, 1, INT_MAX);
450 } else { 450 } else {
451 n_max_arg = n_max_chars; 451 n_max_arg = n_max_chars;
452 } 452 }
diff --git a/include/libbb.h b/include/libbb.h
index 11e1e62d9..a7c770400 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -267,46 +267,68 @@ extern void *xmalloc(size_t size);
267extern void *xrealloc(void *old, size_t size); 267extern void *xrealloc(void *old, size_t size);
268extern void *xzalloc(size_t size); 268extern void *xzalloc(size_t size);
269 269
270extern char *xstrdup (const char *s); 270extern char *xstrdup(const char *s);
271extern char *xstrndup (const char *s, int n); 271extern char *xstrndup(const char *s, int n);
272extern char *safe_strncpy(char *dst, const char *src, size_t size); 272extern char *safe_strncpy(char *dst, const char *src, size_t size);
273extern int safe_strtoi(char *arg, int* value); 273// FIXME: the prototype doesn't match libc strtoXX -> confusion
274extern int safe_strtod(char *arg, double* value); 274// FIXME: alot of unchecked strtoXXX are still in tree
275extern int safe_strtol(char *arg, long* value); 275// FIXME: atoi_or_else(str, N)?
276extern int safe_strtoll(char *arg, long long* value); 276extern int safe_strtoi(const char *arg, int* value);
277extern int safe_strtoul(char *arg, unsigned long* value); 277extern int safe_strtou(const char *arg, unsigned* value);
278extern int safe_strtoull(char *arg, unsigned long long* value); 278extern int safe_strtod(const char *arg, double* value);
279extern int safe_strtol(const char *arg, long* value);
280extern int safe_strtoll(const char *arg, long long* value);
281extern int safe_strtoul(const char *arg, unsigned long* value);
282extern int safe_strtoull(const char *arg, unsigned long long* value);
283extern int safe_strtou32(const char *arg, uint32_t* value);
279 284
280struct suffix_mult { 285struct suffix_mult {
281 const char *suffix; 286 const char *suffix;
282 unsigned int mult; 287 unsigned int mult;
283}; 288};
284 289
285extern unsigned long bb_xgetularg_bnd_sfx(const char *arg, int base, 290unsigned long xstrtoul_range_sfx(const char *numstr, int base,
286 unsigned long lower, 291 unsigned long lower,
287 unsigned long upper, 292 unsigned long upper,
288 const struct suffix_mult *suffixes); 293 const struct suffix_mult *suffixes);
289extern unsigned long bb_xgetularg_bnd(const char *arg, int base, 294unsigned long xstrtoul_range(const char *numstr, int base,
290 unsigned long lower, 295 unsigned long lower,
291 unsigned long upper); 296 unsigned long upper);
292extern unsigned long bb_xgetularg10_bnd(const char *arg, 297unsigned long xstrtoul(const char *numstr, int base);
298unsigned long xatoul_range_sfx(const char *numstr,
299 unsigned long lower,
300 unsigned long upper,
301 const struct suffix_mult *suffixes);
302unsigned long xatoul_sfx(const char *numstr,
303 const struct suffix_mult *suffixes);
304unsigned long xatoul_range(const char *numstr,
293 unsigned long lower, 305 unsigned long lower,
294 unsigned long upper); 306 unsigned long upper);
295extern unsigned long bb_xgetularg10(const char *arg); 307unsigned long xatoul(const char *numstr);
296 308unsigned long long xatoull(const char *numstr);
297extern long bb_xgetlarg(const char *arg, int base, 309long xstrtol_range_sfx(const char *numstr, int base,
298 long lower,
299 long upper);
300extern long bb_xgetlarg_bnd_sfx(const char *arg, int base,
301 long lower, 310 long lower,
302 long upper, 311 long upper,
303 const struct suffix_mult *suffixes); 312 const struct suffix_mult *suffixes);
304extern long bb_xgetlarg10_sfx(const char *arg, const struct suffix_mult *suffixes); 313long xstrtol_range(const char *numstr, int base, long lower, long upper);
305 314long xatol_range_sfx(const char *numstr,
306 315 long lower,
307extern unsigned long bb_xparse_number(const char *numstr, 316 long upper,
308 const struct suffix_mult *suffixes); 317 const struct suffix_mult *suffixes);
309 318long xatol_range(const char *numstr, long lower, long upper);
319long xatol_sfx(const char *numstr, const struct suffix_mult *suffixes);
320long xatol(const char *numstr);
321/* Specialized: */
322unsigned xatou(const char *numstr);
323int xatoi(const char *numstr);
324/* Using xatoi() instead of naive atoi() is not always convenient -
325 * in many places people want *non-negative* values, but store them
326 * in signed int. Therefore we need this one:
327 * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc */
328int xatoi_u(const char *numstr);
329uint32_t xatou32(const char *numstr);
330/* Useful for reading port numbers */
331uint16_t xatou16(const char *numstr);
310 332
311/* These parse entries in /etc/passwd and /etc/group. This is desirable 333/* These parse entries in /etc/passwd and /etc/group. This is desirable
312 * for BusyBox since we want to avoid using the glibc NSS stuff, which 334 * 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);
329 351
330extern char *query_loop(const char *device); 352extern char *query_loop(const char *device);
331extern int del_loop(const char *device); 353extern int del_loop(const char *device);
332extern int set_loop(char **device, const char *file, int offset); 354extern int set_loop(char **device, const char *file, unsigned long long offset);
333 355
334#if (__GLIBC__ < 2) 356#if (__GLIBC__ < 2)
335extern int vdprintf(int d, const char *format, va_list ap); 357extern int vdprintf(int d, const char *format, va_list ap);
diff --git a/include/unarchive.h b/include/unarchive.h
index 82a70aed6..7de6a63fe 100644
--- a/include/unarchive.h
+++ b/include/unarchive.h
@@ -92,7 +92,7 @@ extern char get_header_tar_lzma(archive_handle_t *archive_handle);
92extern char get_header_tar_gz(archive_handle_t *archive_handle); 92extern char get_header_tar_gz(archive_handle_t *archive_handle);
93 93
94extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount); 94extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount);
95extern void seek_by_char(const archive_handle_t *archive_handle, const unsigned int amount); 95extern void seek_by_read(const archive_handle_t *archive_handle, const unsigned int amount);
96 96
97extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count); 97extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count);
98 98
diff --git a/init/halt.c b/init/halt.c
index 2ac210e59..9e3cbb1cf 100644
--- a/init/halt.c
+++ b/init/halt.c
@@ -35,7 +35,7 @@ RB_AUTOBOOT
35 35
36 /* Parse and handle arguments */ 36 /* Parse and handle arguments */
37 flags = getopt32(argc, argv, "d:nf", &delay); 37 flags = getopt32(argc, argv, "d:nf", &delay);
38 if (flags&1) sleep(atoi(delay)); 38 if (flags&1) sleep(xatou(delay));
39 if (!(flags&2)) sync(); 39 if (!(flags&2)) sync();
40 40
41 /* Perform action. */ 41 /* Perform action. */
diff --git a/libbb/Kbuild b/libbb/Kbuild
index 909f527ba..4e992ef5b 100644
--- a/libbb/Kbuild
+++ b/libbb/Kbuild
@@ -15,7 +15,7 @@ lib-y:= \
15 human_readable.o inet_common.o inode_hash.o isdirectory.o \ 15 human_readable.o inet_common.o inode_hash.o isdirectory.o \
16 kernel_version.o last_char_is.o login.o \ 16 kernel_version.o last_char_is.o login.o \
17 make_directory.o md5.o mode_string.o mtab_file.o \ 17 make_directory.o md5.o mode_string.o mtab_file.o \
18 obscure.o parse_mode.o parse_number.o perror_msg.o \ 18 obscure.o parse_mode.o perror_msg.o \
19 perror_msg_and_die.o get_console.o \ 19 perror_msg_and_die.o get_console.o \
20 process_escape_sequence.o procps.o \ 20 process_escape_sequence.o procps.o \
21 recursive_action.o remove_file.o \ 21 recursive_action.o remove_file.o \
@@ -23,7 +23,7 @@ lib-y:= \
23 safe_strncpy.o setup_environment.o sha1.o simplify_path.o \ 23 safe_strncpy.o setup_environment.o sha1.o simplify_path.o \
24 trim.o u_signal_names.o vdprintf.o verror_msg.o \ 24 trim.o u_signal_names.o vdprintf.o verror_msg.o \
25 vherror_msg.o vperror_msg.o wfopen.o xconnect.o xgetcwd.o \ 25 vherror_msg.o vperror_msg.o wfopen.o xconnect.o xgetcwd.o \
26 xgethostbyname.o xgethostbyname2.o xreadlink.o xgetlarg.o \ 26 xgethostbyname.o xgethostbyname2.o xreadlink.o \
27 fclose_nonstdin.o fflush_stdout_and_exit.o \ 27 fclose_nonstdin.o fflush_stdout_and_exit.o \
28 getopt32.o default_error_retval.o wfopen_input.o speed_table.o \ 28 getopt32.o default_error_retval.o wfopen_input.o speed_table.o \
29 perror_nomsg_and_die.o perror_nomsg.o skip_whitespace.o bb_askpass.o \ 29 perror_nomsg_and_die.o perror_nomsg.o skip_whitespace.o bb_askpass.o \
@@ -55,7 +55,7 @@ lib-$(CONFIG_DEVFSD) += xregcomp.o
55lib-y += messages.o 55lib-y += messages.o
56lib-y += xfuncs.o 56lib-y += xfuncs.o
57lib-y += printf.o 57lib-y += printf.o
58lib-y += xgetularg.o 58lib-y += xatol.o
59lib-y += safe_strtol.o 59lib-y += safe_strtol.o
60lib-y += bb_pwd.o 60lib-y += bb_pwd.o
61lib-y += llist.o 61lib-y += llist.o
diff --git a/libbb/loop.c b/libbb/loop.c
index d22b39800..1b296d99b 100644
--- a/libbb/loop.c
+++ b/libbb/loop.c
@@ -48,11 +48,12 @@ char *query_loop(const char *device)
48{ 48{
49 int fd; 49 int fd;
50 bb_loop_info loopinfo; 50 bb_loop_info loopinfo;
51 char *dev=0; 51 char *dev = 0;
52 52
53 if ((fd = open(device, O_RDONLY)) < 0) return 0; 53 fd = open(device, O_RDONLY);
54 if (fd < 0) return 0;
54 if (!ioctl(fd, BB_LOOP_GET_STATUS, &loopinfo)) 55 if (!ioctl(fd, BB_LOOP_GET_STATUS, &loopinfo))
55 dev=xasprintf("%ld %s", (long) loopinfo.lo_offset, 56 dev = xasprintf("%ld %s", (long) loopinfo.lo_offset,
56 (char *)loopinfo.lo_file_name); 57 (char *)loopinfo.lo_file_name);
57 close(fd); 58 close(fd);
58 59
@@ -64,8 +65,9 @@ int del_loop(const char *device)
64{ 65{
65 int fd, rc; 66 int fd, rc;
66 67
67 if ((fd = open(device, O_RDONLY)) < 0) return 1; 68 fd = open(device, O_RDONLY);
68 rc=ioctl(fd, LOOP_CLR_FD, 0); 69 if (fd < 0) return 1;
70 rc = ioctl(fd, LOOP_CLR_FD, 0);
69 close(fd); 71 close(fd);
70 72
71 return rc; 73 return rc;
@@ -77,7 +79,7 @@ int del_loop(const char *device)
77 search will re-use an existing loop device already bound to that 79 search will re-use an existing loop device already bound to that
78 file/offset if it finds one. 80 file/offset if it finds one.
79 */ 81 */
80int set_loop(char **device, const char *file, int offset) 82int set_loop(char **device, const char *file, unsigned long long offset)
81{ 83{
82 char dev[20], *try; 84 char dev[20], *try;
83 bb_loop_info loopinfo; 85 bb_loop_info loopinfo;
@@ -85,34 +87,43 @@ int set_loop(char **device, const char *file, int offset)
85 int i, dfd, ffd, mode, rc=-1; 87 int i, dfd, ffd, mode, rc=-1;
86 88
87 /* Open the file. Barf if this doesn't work. */ 89 /* Open the file. Barf if this doesn't work. */
88 if((ffd = open(file, mode=O_RDWR))<0 && (ffd = open(file,mode=O_RDONLY))<0) 90 mode = O_RDWR;
89 return -errno; 91 ffd = open(file, mode);
92 if (ffd < 0) {
93 mode = O_RDONLY;
94 ffd = open(file, mode);
95 if (ffd < 0)
96 return -errno;
97 }
90 98
91 /* Find a loop device. */ 99 /* Find a loop device. */
92 try=*device ? : dev; 100 try = *device ? : dev;
93 for(i=0;rc;i++) { 101 for (i=0;rc;i++) {
94 sprintf(dev, LOOP_FORMAT, i); 102 sprintf(dev, LOOP_FORMAT, i);
95 103
96 /* Ran out of block devices, return failure. */ 104 /* Ran out of block devices, return failure. */
97 if(stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) { 105 if (stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) {
98 rc=-ENOENT; 106 rc=-ENOENT;
99 break; 107 break;
100 } 108 }
101 /* Open the sucker and check its loopiness. */ 109 /* Open the sucker and check its loopiness. */
102 if((dfd=open(try, mode))<0 && errno==EROFS) 110 dfd = open(try, mode);
103 dfd=open(try, mode = O_RDONLY); 111 if (dfd < 0 && errno == EROFS) {
104 if(dfd<0) goto try_again; 112 mode = O_RDONLY;
113 dfd = open(try, mode);
114 }
115 if (dfd < 0) goto try_again;
105 116
106 rc=ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo); 117 rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);
107 118
108 /* If device free, claim it. */ 119 /* If device free, claim it. */
109 if(rc && errno==ENXIO) { 120 if (rc && errno == ENXIO) {
110 memset(&loopinfo, 0, sizeof(loopinfo)); 121 memset(&loopinfo, 0, sizeof(loopinfo));
111 safe_strncpy((char *)loopinfo.lo_file_name, file, LO_NAME_SIZE); 122 safe_strncpy((char *)loopinfo.lo_file_name, file, LO_NAME_SIZE);
112 loopinfo.lo_offset = offset; 123 loopinfo.lo_offset = offset;
113 /* Associate free loop device with file. */ 124 /* Associate free loop device with file. */
114 if(!ioctl(dfd, LOOP_SET_FD, ffd)) { 125 if (!ioctl(dfd, LOOP_SET_FD, ffd)) {
115 if (!ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo)) rc=0; 126 if (!ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo)) rc = 0;
116 else ioctl(dfd, LOOP_CLR_FD, 0); 127 else ioctl(dfd, LOOP_CLR_FD, 0);
117 } 128 }
118 129
@@ -121,15 +132,16 @@ int set_loop(char **device, const char *file, int offset)
121 file isn't pretty either. In general, mounting the same file twice 132 file isn't pretty either. In general, mounting the same file twice
122 without using losetup manually is problematic.) 133 without using losetup manually is problematic.)
123 */ 134 */
124 } else if(strcmp(file,(char *)loopinfo.lo_file_name) 135 } else if (strcmp(file,(char *)loopinfo.lo_file_name)
125 || offset!=loopinfo.lo_offset) rc=-1; 136 || offset!=loopinfo.lo_offset) rc = -1;
126 close(dfd); 137 close(dfd);
127try_again: 138try_again:
128 if(*device) break; 139 if (*device) break;
129 } 140 }
130 close(ffd); 141 close(ffd);
131 if(!rc) { 142 if (!rc) {
132 if(!*device) *device=strdup(dev); 143 if (!*device) *device = strdup(dev);
133 return mode==O_RDONLY ? 1 : 0; 144 return mode==O_RDONLY ? 1 : 0;
134 } else return rc; 145 }
146 return rc;
135} 147}
diff --git a/libbb/parse_number.c b/libbb/parse_number.c
deleted file mode 100644
index c7dafb7f0..000000000
--- a/libbb/parse_number.c
+++ /dev/null
@@ -1,50 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * bb_xparse_number implementation for busybox
4 *
5 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10#include <stdlib.h>
11#include <string.h>
12#include <limits.h>
13#include <errno.h>
14#include <assert.h>
15#include "libbb.h"
16
17unsigned long bb_xparse_number(const char *numstr,
18 const struct suffix_mult *suffixes)
19{
20 unsigned long int r;
21 char *e;
22 int old_errno;
23
24 /* Since this is a lib function, we're not allowed to reset errno to 0.
25 * Doing so could break an app that is deferring checking of errno.
26 * So, save the old value so that we can restore it if successful. */
27 old_errno = errno;
28 errno = 0;
29 r = strtoul(numstr, &e, 10);
30
31 if ((numstr != e) && !errno) {
32 errno = old_errno; /* Ok. So restore errno. */
33 if (!*e) {
34 return r;
35 }
36 if (suffixes) {
37 assert(suffixes->suffix); /* No nul suffixes. */
38 do {
39 if (strcmp(suffixes->suffix, e) == 0) {
40 if (ULONG_MAX / suffixes->mult < r) { /* Overflow! */
41 break;
42 }
43 return r * suffixes->mult;
44 }
45 ++suffixes;
46 } while (suffixes->suffix);
47 }
48 }
49 bb_error_msg_and_die("invalid number '%s'", numstr);
50}
diff --git a/libbb/safe_strtol.c b/libbb/safe_strtol.c
index 027fc1e62..a7f012fbc 100644
--- a/libbb/safe_strtol.c
+++ b/libbb/safe_strtol.c
@@ -7,21 +7,10 @@
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */ 8 */
9 9
10#include <stdlib.h>
11#include <errno.h>
12#include <assert.h> 10#include <assert.h>
13#include "libbb.h" 11#include "libbb.h"
14 12
15int safe_strtoi(char *arg, int* value) 13int safe_strtod(const char *arg, double* value)
16{
17 int error;
18 long lvalue = *value;
19 error = safe_strtol(arg, &lvalue);
20 *value = (int) lvalue;
21 return error;
22}
23
24int safe_strtod(char *arg, double* value)
25{ 14{
26 char *endptr; 15 char *endptr;
27 int errno_save = errno; 16 int errno_save = errno;
@@ -29,69 +18,132 @@ int safe_strtod(char *arg, double* value)
29 assert(arg!=NULL); 18 assert(arg!=NULL);
30 errno = 0; 19 errno = 0;
31 *value = strtod(arg, &endptr); 20 *value = strtod(arg, &endptr);
32 if (errno != 0 || *endptr!='\0' || endptr==arg) { 21 if (errno != 0 || *endptr != '\0' || endptr == arg) {
33 return 1; 22 return 1;
34 } 23 }
35 errno = errno_save; 24 errno = errno_save;
36 return 0; 25 return 0;
37} 26}
38 27
39int safe_strtol(char *arg, long* value) 28int safe_strtoull(const char *arg, unsigned long long* value)
40{ 29{
41 char *endptr; 30 char *endptr;
42 int errno_save = errno; 31 int errno_save = errno;
43 32
44 assert(arg!=NULL); 33 assert(arg!=NULL);
34 if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
35 return 1;
45 errno = 0; 36 errno = 0;
46 *value = strtol(arg, &endptr, 0); 37 *value = strtoull(arg, &endptr, 0);
47 if (errno != 0 || *endptr!='\0' || endptr==arg) { 38 if (errno != 0 || *endptr != '\0' || endptr == arg) {
48 return 1; 39 return 1;
49 } 40 }
50 errno = errno_save; 41 errno = errno_save;
51 return 0; 42 return 0;
52} 43}
53 44
54int safe_strtoul(char *arg, unsigned long* value) 45int safe_strtoll(const char *arg, long long* value)
55{ 46{
56 char *endptr; 47 char *endptr;
57 int errno_save = errno; 48 int errno_save = errno;
58 49
59 assert(arg!=NULL); 50 assert(arg!=NULL);
60 errno = 0; 51 errno = 0;
61 *value = strtoul(arg, &endptr, 0); 52 *value = strtoll(arg, &endptr, 0);
62 if (errno != 0 || *endptr!='\0' || endptr==arg) { 53 if (errno != 0 || *endptr != '\0' || endptr == arg) {
63 return 1; 54 return 1;
64 } 55 }
65 errno = errno_save; 56 errno = errno_save;
66 return 0; 57 return 0;
67} 58}
68 59
69int safe_strtoll(char *arg, long long* value) 60int safe_strtoul(const char *arg, unsigned long* value)
70{ 61{
71 char *endptr; 62 char *endptr;
72 int errno_save = errno; 63 int errno_save = errno;
73 64
74 assert(arg!=NULL); 65 assert(arg!=NULL);
66 if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
67 return 1;
75 errno = 0; 68 errno = 0;
76 *value = strtoll(arg, &endptr, 0); 69 *value = strtoul(arg, &endptr, 0);
77 if (errno != 0 || *endptr!='\0' || endptr==arg) { 70 if (errno != 0 || *endptr != '\0' || endptr == arg) {
78 return 1; 71 return 1;
79 } 72 }
80 errno = errno_save; 73 errno = errno_save;
81 return 0; 74 return 0;
82} 75}
83 76
84int safe_strtoull(char *arg, unsigned long long* value) 77int safe_strtol(const char *arg, long* value)
85{ 78{
86 char *endptr; 79 char *endptr;
87 int errno_save = errno; 80 int errno_save = errno;
88 81
89 assert(arg!=NULL); 82 assert(arg!=NULL);
90 errno = 0; 83 errno = 0;
91 *value = strtoull(arg, &endptr, 0); 84 *value = strtol(arg, &endptr, 0);
92 if (errno != 0 || *endptr!='\0' || endptr==arg) { 85 if (errno != 0 || *endptr != '\0' || endptr == arg) {
93 return 1; 86 return 1;
94 } 87 }
95 errno = errno_save; 88 errno = errno_save;
96 return 0; 89 return 0;
97} 90}
91
92/* TODO: This is what uclibc is doing. Try to do the same? */
93
94#if 0
95#if defined __HAVE_ELF__
96
97# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
98# define _strong_alias(name, aliasname) \
99 extern __typeof (name) aliasname __attribute__ ((alias (#name)));
100
101#else /* !defined __HAVE_ELF__ */
102
103# define strong_alias(name, aliasname) _strong_alias (name, aliasname)
104# define _strong_alias(name, aliasname) \
105 __asm__(".global " __C_SYMBOL_PREFIX__ #aliasname "\n" \
106 ".set " __C_SYMBOL_PREFIX__ #aliasname "," __C_SYMBOL_PREFIX__ #name);
107
108#endif
109#endif
110
111int safe_strtoi(const char *arg, int* value)
112{
113 if (sizeof(long) == sizeof(int)) {
114 return safe_strtol(arg, (long*)value);
115 } else {
116 int error;
117 long lvalue = *value;
118 error = safe_strtol(arg, &lvalue);
119 if (lvalue < INT_MIN || lvalue > INT_MAX)
120 return 1;
121 *value = (int) lvalue;
122 return error;
123 }
124}
125
126int safe_strtou(const char *arg, unsigned* value)
127{
128 if (sizeof(unsigned long) == sizeof(unsigned)) {
129 return safe_strtoul(arg, (unsigned long*)value);
130 } else {
131 int error;
132 unsigned long lvalue = *value;
133 error = safe_strtoul(arg, &lvalue);
134 if (lvalue > UINT_MAX)
135 return 1;
136 *value = (unsigned) lvalue;
137 return error;
138 }
139}
140
141int BUG_safe_strtou32_unimplemented(void);
142int safe_strtou32(const char *arg, uint32_t* value)
143{
144 if (sizeof(uint32_t) == sizeof(unsigned))
145 return safe_strtou(arg, (unsigned*)value);
146 if (sizeof(uint32_t) == sizeof(unsigned long))
147 return safe_strtoul(arg, (unsigned long*)value);
148 return BUG_safe_strtou32_unimplemented();
149}
diff --git a/libbb/xatol.c b/libbb/xatol.c
new file mode 100644
index 000000000..82250a7bb
--- /dev/null
+++ b/libbb/xatol.c
@@ -0,0 +1,210 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * ascii-to-numbers implementations for busybox
4 *
5 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
6 *
7 * Licensed under GPLv2, see file LICENSE in this tarball for details.
8 */
9
10#include "libbb.h"
11
12unsigned long long xatoull(const char *numstr)
13{
14 unsigned long long r;
15 int old_errno;
16 char *e;
17 if ((*numstr == '-') || (isspace)(*numstr))
18 bb_error_msg_and_die("invalid number '%s'", numstr);
19 old_errno = errno;
20 errno = 0;
21 r = strtoull(numstr, &e, 10);
22 if (errno || (numstr == e) || *e)
23 /* Error / no digits / illegal trailing chars */
24 bb_error_msg_and_die("invalid number '%s'", numstr);
25 /* No error. So restore errno. */
26 errno = old_errno;
27 return r;
28}
29
30unsigned long xstrtoul_range_sfx(const char *numstr, int base,
31 unsigned long lower,
32 unsigned long upper,
33 const struct suffix_mult *suffixes)
34{
35 unsigned long r;
36 int old_errno;
37 char *e;
38
39 /* Disallow '-' and any leading whitespace. Speed isn't critical here
40 * since we're parsing commandline args. So make sure we get the
41 * actual isspace function rather than a lnumstrer macro implementaion. */
42 if ((*numstr == '-') || (isspace)(*numstr))
43 goto inval;
44
45 /* Since this is a lib function, we're not allowed to reset errno to 0.
46 * Doing so could break an app that is deferring checking of errno.
47 * So, save the old value so that we can restore it if successful. */
48 old_errno = errno;
49 errno = 0;
50 r = strtoul(numstr, &e, base);
51 /* Do the initial validity check. Note: The standards do not
52 * guarantee that errno is set if no digits were found. So we
53 * must test for this explicitly. */
54 if (errno || (numstr == e))
55 goto inval; /* error / no digits / illegal trailing chars */
56
57 errno = old_errno; /* Ok. So restore errno. */
58
59 /* Do optional suffix parsing. Allow 'empty' suffix tables.
60 * Note that we also allow nul suffixes with associated multipliers,
61 * to allow for scaling of the numstr by some default multiplier. */
62 if (suffixes) {
63 while (suffixes->suffix) {
64 if (strcmp(suffixes->suffix, e) == 0) {
65 if (ULONG_MAX / suffixes->mult < r)
66 goto range; /* overflow! */
67 ++e;
68 r *= suffixes->mult;
69 break;
70 }
71 ++suffixes;
72 }
73 }
74
75 /* Note: trailing space is an error.
76 It would be easy enough to allow though if desired. */
77 if (*e)
78 goto inval;
79 /* Finally, check for range limits. */
80 if (r >= lower && r <= upper)
81 return r;
82 range:
83 bb_error_msg_and_die("number %s is not in %lu..%lu range",
84 numstr, lower, upper);
85 inval:
86 bb_error_msg_and_die("invalid number '%s'", numstr);
87}
88
89unsigned long xstrtoul_range(const char *numstr, int base,
90 unsigned long lower,
91 unsigned long upper)
92{
93 return xstrtoul_range_sfx(numstr, base, lower, upper, NULL);
94}
95
96unsigned long xstrtoul(const char *numstr, int base)
97{
98 return xstrtoul_range_sfx(numstr, base, 0, ULONG_MAX, NULL);
99}
100
101unsigned long xatoul_range_sfx(const char *numstr,
102 unsigned long lower,
103 unsigned long upper,
104 const struct suffix_mult *suffixes)
105{
106 return xstrtoul_range_sfx(numstr, 10, lower, upper, suffixes);
107}
108
109unsigned long xatoul_sfx(const char *numstr,
110 const struct suffix_mult *suffixes)
111{
112 return xstrtoul_range_sfx(numstr, 10, 0, ULONG_MAX, suffixes);
113}
114
115unsigned long xatoul_range(const char *numstr,
116 unsigned long lower,
117 unsigned long upper)
118{
119 return xstrtol_range_sfx(numstr, 10, lower, upper, NULL);
120}
121
122unsigned long xatoul(const char *numstr)
123{
124 return xatoul_sfx(numstr, NULL);
125}
126
127/* Signed ones */
128
129long xstrtol_range_sfx(const char *numstr, int base,
130 long lower,
131 long upper,
132 const struct suffix_mult *suffixes)
133{
134 unsigned long u = LONG_MAX;
135 long r;
136 const char *p = numstr;
137
138 if ((p[0] == '-') && (p[1] != '+')) {
139 ++p;
140 ++u; /* two's complement */
141 }
142
143 r = xstrtoul_range_sfx(p, base, 0, u, suffixes);
144
145 if (*numstr == '-') {
146 r = -r;
147 }
148
149 if (r < lower || r > upper) {
150 bb_error_msg_and_die("number %s is not in %ld..%ld range",
151 numstr, lower, upper);
152 }
153
154 return r;
155}
156
157long xstrtol_range(const char *numstr, int base, long lower, long upper)
158{
159 return xstrtol_range_sfx(numstr, base, lower, upper, NULL);
160}
161
162long xatol_range_sfx(const char *numstr,
163 long lower,
164 long upper,
165 const struct suffix_mult *suffixes)
166{
167 return xstrtol_range_sfx(numstr, 10, lower, upper, suffixes);
168}
169
170long xatol_range(const char *numstr, long lower, long upper)
171{
172 return xstrtol_range_sfx(numstr, 10, lower, upper, NULL);
173}
174
175long xatol_sfx(const char *numstr, const struct suffix_mult *suffixes)
176{
177 return xstrtol_range_sfx(numstr, 10, LONG_MIN, LONG_MAX, suffixes);
178}
179
180long xatol(const char *numstr)
181{
182 return xstrtol_range_sfx(numstr, 10, LONG_MIN, LONG_MAX, NULL);
183}
184
185/* Others */
186
187unsigned xatou(const char *numstr)
188{
189 return xatoul_range(numstr, 0, UINT_MAX);
190}
191
192int xatoi(const char *numstr)
193{
194 return xatol_range(numstr, INT_MIN, INT_MAX);
195}
196
197int xatoi_u(const char *numstr)
198{
199 return xatoul_range(numstr, 0, INT_MAX);
200}
201
202uint32_t xatou32(const char *numstr)
203{
204 return xatoul_range(numstr, 0, 0xffffffff);
205}
206
207uint16_t xatou16(const char *numstr)
208{
209 return xatoul_range(numstr, 0, 0xffff);
210}
diff --git a/libbb/xgetlarg.c b/libbb/xgetlarg.c
deleted file mode 100644
index 5b1e7b9d5..000000000
--- a/libbb/xgetlarg.c
+++ /dev/null
@@ -1,32 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Copyright (C) 2003-2004 Erik Andersen <andersen@codepoet.org>
4 *
5 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
6 */
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <getopt.h>
11#include <errno.h>
12#include <assert.h>
13#include <ctype.h>
14
15#include "libbb.h"
16
17long bb_xgetlarg(const char *arg, int base, long lower, long upper)
18{
19 long result;
20 char *endptr;
21 int errno_save = errno;
22
23 if (ENABLE_DEBUG && arg==NULL)
24 bb_error_msg_and_die("Null in xgetlarg.");
25
26 errno = 0;
27 result = strtol(arg, &endptr, base);
28 if (errno != 0 || *endptr!='\0' || endptr==arg || result < lower || result > upper)
29 bb_show_usage();
30 errno = errno_save;
31 return result;
32}
diff --git a/libbb/xgetularg.c b/libbb/xgetularg.c
deleted file mode 100644
index 17ba581f7..000000000
--- a/libbb/xgetularg.c
+++ /dev/null
@@ -1,127 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * xgetularg* implementations for busybox
4 *
5 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10#include <stdlib.h>
11#include <string.h>
12#include <limits.h>
13#include <ctype.h>
14#include <errno.h>
15#include <assert.h>
16#include "libbb.h"
17
18unsigned long bb_xgetularg_bnd_sfx(const char *arg, int base,
19 unsigned long lower,
20 unsigned long upper,
21 const struct suffix_mult *suffixes)
22{
23 unsigned long r;
24 int old_errno;
25 char *e;
26
27 assert(arg);
28
29 /* Disallow '-' and any leading whitespace. Speed isn't critical here
30 * since we're parsing commandline args. So make sure we get the
31 * actual isspace function rather than a larger macro implementaion. */
32 if ((*arg == '-') || (isspace)(*arg)) {
33 bb_show_usage();
34 }
35
36 /* Since this is a lib function, we're not allowed to reset errno to 0.
37 * Doing so could break an app that is deferring checking of errno.
38 * So, save the old value so that we can restore it if successful. */
39 old_errno = errno;
40 errno = 0;
41 r = strtoul(arg, &e, base);
42 /* Do the initial validity check. Note: The standards do not
43 * guarantee that errno is set if no digits were found. So we
44 * must test for this explicitly. */
45 if (errno || (arg == e)) { /* error or no digits */
46 bb_show_usage();
47 }
48 errno = old_errno; /* Ok. So restore errno. */
49
50 /* Do optional suffix parsing. Allow 'empty' suffix tables.
51 * Note that we also all nul suffixes with associated multipliers,
52 * to allow for scaling of the arg by some default multiplier. */
53
54 if (suffixes) {
55 while (suffixes->suffix) {
56 if (strcmp(suffixes->suffix, e) == 0) {
57 if (ULONG_MAX / suffixes->mult < r) { /* Overflow! */
58 bb_show_usage();
59 }
60 ++e;
61 r *= suffixes->mult;
62 break;
63 }
64 ++suffixes;
65 }
66 }
67
68 /* Finally, check for illegal trailing chars and range limits. */
69 /* Note: although we allow leading space (via stroul), trailing space
70 * is an error. It would be easy enough to allow though if desired. */
71 if (*e || (r < lower) || (r > upper)) {
72 bb_show_usage();
73 }
74
75 return r;
76}
77
78long bb_xgetlarg_bnd_sfx(const char *arg, int base,
79 long lower,
80 long upper,
81 const struct suffix_mult *suffixes)
82{
83 unsigned long u = LONG_MAX;
84 long r;
85 const char *p = arg;
86
87 if ((*p == '-') && (p[1] != '+')) {
88 ++p;
89 ++u; /* two's complement */
90 }
91
92 r = bb_xgetularg_bnd_sfx(p, base, 0, u, suffixes);
93
94 if (*arg == '-') {
95 r = -r;
96 }
97
98 if ((r < lower) || (r > upper)) {
99 bb_show_usage();
100 }
101
102 return r;
103}
104
105long bb_xgetlarg10_sfx(const char *arg, const struct suffix_mult *suffixes)
106{
107 return bb_xgetlarg_bnd_sfx(arg, 10, LONG_MIN, LONG_MAX, suffixes);
108}
109
110unsigned long bb_xgetularg_bnd(const char *arg, int base,
111 unsigned long lower,
112 unsigned long upper)
113{
114 return bb_xgetularg_bnd_sfx(arg, base, lower, upper, NULL);
115}
116
117unsigned long bb_xgetularg10_bnd(const char *arg,
118 unsigned long lower,
119 unsigned long upper)
120{
121 return bb_xgetularg_bnd(arg, 10, lower, upper);
122}
123
124unsigned long bb_xgetularg10(const char *arg)
125{
126 return bb_xgetularg10_bnd(arg, 0, ULONG_MAX);
127}
diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c
index 236dc1099..0172e6041 100644
--- a/loginutils/addgroup.c
+++ b/loginutils/addgroup.c
@@ -91,15 +91,14 @@ int addgroup_main(int argc, char **argv)
91 91
92 /* check for min, max and missing args and exit on error */ 92 /* check for min, max and missing args and exit on error */
93 opt_complementary = "-1:?2:?"; 93 opt_complementary = "-1:?2:?";
94
95 if (getopt32(argc, argv, "g:", &group)) { 94 if (getopt32(argc, argv, "g:", &group)) {
96 gid = bb_xgetlarg(group, 10, 0, LONG_MAX); 95 gid = xatoul_range(group, 0, (gid_t)ULONG_MAX);
97 } 96 }
98 /* move past the commandline options */ 97 /* move past the commandline options */
99 argv += optind; 98 argv += optind;
100 99
101 /* need to be root */ 100 /* need to be root */
102 if(geteuid()) { 101 if (geteuid()) {
103 bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); 102 bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
104 } 103 }
105 104
diff --git a/loginutils/getty.c b/loginutils/getty.c
index 4b43684a2..d279dc3a4 100644
--- a/loginutils/getty.c
+++ b/loginutils/getty.c
@@ -113,7 +113,7 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
113 113
114struct options { 114struct options {
115 int flags; /* toggle switches, see below */ 115 int flags; /* toggle switches, see below */
116 int timeout; /* time-out period */ 116 unsigned timeout; /* time-out period */
117 char *login; /* login program */ 117 char *login; /* login program */
118 char *tty; /* name of tty */ 118 char *tty; /* name of tty */
119 char *initstring; /* modem init string */ 119 char *initstring; /* modem init string */
@@ -226,11 +226,12 @@ FILE *dbf;
226static int bcode(const char *s) 226static int bcode(const char *s)
227{ 227{
228 int r; 228 int r;
229 unsigned long value; 229 unsigned value;
230 if (safe_strtoul((char *)s, &value)) { 230 if (safe_strtou((char *)s, &value)) {
231 return -1; 231 return -1;
232 } 232 }
233 if ((r = tty_value_to_baud(value)) > 0) { 233 r = tty_value_to_baud(value);
234 if (r > 0) {
234 return r; 235 return r;
235 } 236 }
236 return 0; 237 return 0;
@@ -280,8 +281,7 @@ static void parse_args(int argc, char **argv, struct options *op)
280 } 281 }
281 op->flags ^= F_ISSUE; /* revert flag show /etc/issue */ 282 op->flags ^= F_ISSUE; /* revert flag show /etc/issue */
282 if(op->flags & F_TIMEOUT) { 283 if(op->flags & F_TIMEOUT) {
283 if ((op->timeout = atoi(ts)) <= 0) 284 op->timeout = xatoul_range(ts, 1, INT_MAX);
284 bb_error_msg_and_die("bad timeout value: %s", ts);
285 } 285 }
286 debug("after getopt loop\n"); 286 debug("after getopt loop\n");
287 if (argc < optind + 2) /* check parameter count */ 287 if (argc < optind + 2) /* check parameter count */
@@ -495,7 +495,8 @@ static void auto_baud(struct termio *tp)
495 buf[nread] = '\0'; 495 buf[nread] = '\0';
496 for (bp = buf; bp < buf + nread; bp++) { 496 for (bp = buf; bp < buf + nread; bp++) {
497 if (isascii(*bp) && isdigit(*bp)) { 497 if (isascii(*bp) && isdigit(*bp)) {
498 if ((speed = bcode(bp))) { 498 speed = bcode(bp);
499 if (speed) {
499 tp->c_cflag &= ~CBAUD; 500 tp->c_cflag &= ~CBAUD;
500 tp->c_cflag |= speed; 501 tp->c_cflag |= speed;
501 } 502 }
@@ -881,7 +882,7 @@ int getty_main(int argc, char **argv)
881 882
882 /* Set the optional timer. */ 883 /* Set the optional timer. */
883 if (options.timeout) 884 if (options.timeout)
884 (void) alarm((unsigned) options.timeout); 885 (void) alarm(options.timeout);
885 886
886 /* optionally wait for CR or LF before writing /etc/issue */ 887 /* optionally wait for CR or LF before writing /etc/issue */
887 if (options.flags & F_WAITCRLF) { 888 if (options.flags & F_WAITCRLF) {
diff --git a/loginutils/sulogin.c b/loginutils/sulogin.c
index 40eb5e9cf..679439544 100644
--- a/loginutils/sulogin.c
+++ b/loginutils/sulogin.c
@@ -46,10 +46,8 @@ int sulogin_main(int argc, char **argv)
46 logmode = LOGMODE_BOTH; 46 logmode = LOGMODE_BOTH;
47 openlog(applet_name, 0, LOG_AUTH); 47 openlog(applet_name, 0, LOG_AUTH);
48 48
49 if (getopt32 (argc, argv, "t:", &timeout_arg)) { 49 if (getopt32(argc, argv, "t:", &timeout_arg)) {
50 if (safe_strtoi(timeout_arg, &timeout)) { 50 timeout = xatoi_u(timeout_arg);
51 timeout = 0;
52 }
53 } 51 }
54 52
55 if (argv[optind]) { 53 if (argv[optind]) {
diff --git a/loginutils/vlock.c b/loginutils/vlock.c
index 02d1ea772..9ab097b77 100644
--- a/loginutils/vlock.c
+++ b/loginutils/vlock.c
@@ -55,7 +55,7 @@ int vlock_main(int argc, char **argv)
55 bb_show_usage(); 55 bb_show_usage();
56 } 56 }
57 57
58 o_lock_all = getopt32 (argc, argv, "a"); 58 o_lock_all = getopt32(argc, argv, "a");
59 59
60 if((pw = getpwuid(getuid())) == NULL) { 60 if((pw = getpwuid(getuid())) == NULL) {
61 bb_error_msg_and_die("Unknown uid %d", getuid()); 61 bb_error_msg_and_die("Unknown uid %d", getuid());
diff --git a/miscutils/adjtimex.c b/miscutils/adjtimex.c
index 47af1a5d2..b35538a84 100644
--- a/miscutils/adjtimex.c
+++ b/miscutils/adjtimex.c
@@ -12,10 +12,6 @@
12 */ 12 */
13 13
14#include "busybox.h" 14#include "busybox.h"
15#include <stdio.h>
16#include <sys/types.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <sys/timex.h> 15#include <sys/timex.h>
20 16
21static const struct {int bit; const char *name;} statlist[] = { 17static const struct {int bit; const char *name;} statlist[] = {
@@ -58,19 +54,19 @@ int adjtimex_main(int argc, char **argv)
58 &opt_o, &opt_f, &opt_p, &opt_t); 54 &opt_o, &opt_f, &opt_p, &opt_t);
59 //if (opt & 0x1) // -q 55 //if (opt & 0x1) // -q
60 if (opt & 0x2) { // -o 56 if (opt & 0x2) { // -o
61 txc.offset = atoi(opt_o); 57 txc.offset = xatoi(opt_o);
62 txc.modes |= ADJ_OFFSET_SINGLESHOT; 58 txc.modes |= ADJ_OFFSET_SINGLESHOT;
63 } 59 }
64 if (opt & 0x4) { // -f 60 if (opt & 0x4) { // -f
65 txc.freq = atoi(opt_f); 61 txc.freq = xatou(opt_f);
66 txc.modes |= ADJ_FREQUENCY; 62 txc.modes |= ADJ_FREQUENCY;
67 } 63 }
68 if (opt & 0x8) { // -p 64 if (opt & 0x8) { // -p
69 txc.constant = atoi(opt_p); 65 txc.constant = xatoi(opt_p);
70 txc.modes |= ADJ_TIMECONST; 66 txc.modes |= ADJ_TIMECONST;
71 } 67 }
72 if (opt & 0x10) { // -t 68 if (opt & 0x10) { // -t
73 txc.tick = atoi(opt_t); 69 txc.tick = xatoi(opt_t);
74 txc.modes |= ADJ_TICK; 70 txc.modes |= ADJ_TICK;
75 } 71 }
76 if (argc != optind) { /* no valid non-option parameters */ 72 if (argc != optind) { /* no valid non-option parameters */
diff --git a/miscutils/crond.c b/miscutils/crond.c
index db0cc2c6b..623e8c359 100644
--- a/miscutils/crond.c
+++ b/miscutils/crond.c
@@ -65,10 +65,10 @@ typedef struct CronLine {
65#define DaemonUid 0 65#define DaemonUid 0
66 66
67#if ENABLE_DEBUG_CROND_OPTION 67#if ENABLE_DEBUG_CROND_OPTION
68static short DebugOpt; 68static unsigned DebugOpt;
69#endif 69#endif
70 70
71static short LogLevel = 8; 71static unsigned LogLevel = 8;
72static const char *LogFile; 72static const char *LogFile;
73static const char *CDir = CRONTABS; 73static const char *CDir = CRONTABS;
74 74
@@ -155,7 +155,7 @@ int crond_main(int ac, char **av)
155#endif 155#endif
156 ); 156 );
157 if (opt & 1) { 157 if (opt & 1) {
158 LogLevel = atoi(lopt); 158 LogLevel = xatou(lopt);
159 } 159 }
160 if (opt & 2) { 160 if (opt & 2) {
161 if (*Lopt != 0) { 161 if (*Lopt != 0) {
@@ -169,7 +169,7 @@ int crond_main(int ac, char **av)
169 } 169 }
170#if ENABLE_DEBUG_CROND_OPTION 170#if ENABLE_DEBUG_CROND_OPTION
171 if (opt & 64) { 171 if (opt & 64) {
172 DebugOpt = atoi(dopt); 172 DebugOpt = xatou(dopt);
173 LogLevel = 0; 173 LogLevel = 0;
174 } 174 }
175#endif 175#endif
diff --git a/miscutils/dc.c b/miscutils/dc.c
index 95cf0d0ad..8e7a2494c 100644
--- a/miscutils/dc.c
+++ b/miscutils/dc.c
@@ -171,7 +171,7 @@ static void stack_machine(const char *argument)
171 } 171 }
172 o++; 172 o++;
173 } 173 }
174 bb_error_msg_and_die("%s: syntax error.", argument); 174 bb_error_msg_and_die("%s: syntax error", argument);
175} 175}
176 176
177/* return pointer to next token in buffer and set *buffer to one char 177/* return pointer to next token in buffer and set *buffer to one char
diff --git a/miscutils/hdparm.c b/miscutils/hdparm.c
index 6c46f6a92..1c9a99e13 100644
--- a/miscutils/hdparm.c
+++ b/miscutils/hdparm.c
@@ -2063,7 +2063,7 @@ static void parse_opts(unsigned long *get, unsigned long *set, unsigned long *va
2063 } 2063 }
2064 if (optarg) { 2064 if (optarg) {
2065 *set = 1; 2065 *set = 1;
2066 *value = bb_xgetlarg(optarg, 10, min, max); 2066 *value = xatol_range(optarg, min, max);
2067 } 2067 }
2068} 2068}
2069 2069
@@ -2154,8 +2154,8 @@ int hdparm_main(int argc, char **argv)
2154#if ENABLE_FEATURE_HDPARM_HDIO_SCAN_HWIF 2154#if ENABLE_FEATURE_HDPARM_HDIO_SCAN_HWIF
2155 if (c == 'R') { 2155 if (c == 'R') {
2156 parse_opts(NULL, &scan_hwif, &hwif_data, 0, INT_MAX); 2156 parse_opts(NULL, &scan_hwif, &hwif_data, 0, INT_MAX);
2157 hwif_ctrl = bb_xgetlarg((argv[optind]) ? argv[optind] : "", 10, 0, INT_MAX); 2157 hwif_ctrl = xatoi_u((argv[optind]) ? argv[optind] : "");
2158 hwif_irq = bb_xgetlarg((argv[optind+1]) ? argv[optind+1] : "", 10, 0, INT_MAX); 2158 hwif_irq = xatoi_u((argv[optind+1]) ? argv[optind+1] : "");
2159 /* Move past the 2 additional arguments */ 2159 /* Move past the 2 additional arguments */
2160 argv += 2; 2160 argv += 2;
2161 argc -= 2; 2161 argc -= 2;
diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c
index 4619e4dd5..e27634add 100644
--- a/miscutils/makedevs.c
+++ b/miscutils/makedevs.c
@@ -21,10 +21,10 @@ int makedevs_main(int argc, char **argv)
21 21
22 basedev = argv[1]; 22 basedev = argv[1];
23 type = argv[2]; 23 type = argv[2];
24 Smajor = atoi(argv[3]); 24 Smajor = xatoi_u(argv[3]);
25 Sminor = atoi(argv[4]); 25 Sminor = xatoi_u(argv[4]);
26 S = atoi(argv[5]); 26 S = xatoi_u(argv[5]);
27 E = atoi(argv[6]); 27 E = xatoi_u(argv[6]);
28 nodname = argc == 8 ? basedev : buf; 28 nodname = argc == 8 ? basedev : buf;
29 29
30 mode = 0660; 30 mode = 0660;
diff --git a/miscutils/mt.c b/miscutils/mt.c
index f4a3be739..a2bb6be91 100644
--- a/miscutils/mt.c
+++ b/miscutils/mt.c
@@ -84,7 +84,7 @@ int mt_main(int argc, char **argv)
84 84
85 op.mt_op = code->value; 85 op.mt_op = code->value;
86 if (argc >= 3) 86 if (argc >= 3)
87 op.mt_count = atoi(argv[2]); 87 op.mt_count = xatoi_u(argv[2]);
88 else 88 else
89 op.mt_count = 1; /* One, not zero, right? */ 89 op.mt_count = 1; /* One, not zero, right? */
90 90
diff --git a/miscutils/strings.c b/miscutils/strings.c
index 36bcf8b17..1ff41ad9c 100644
--- a/miscutils/strings.c
+++ b/miscutils/strings.c
@@ -34,7 +34,7 @@ int strings_main(int argc, char **argv)
34 argc -= optind; 34 argc -= optind;
35 argv += optind; 35 argv += optind;
36 36
37 n = bb_xgetlarg(n_arg, 10, 1, INT_MAX); 37 n = xatoul_range(n_arg, 1, INT_MAX);
38 string = xzalloc(n + 1); 38 string = xzalloc(n + 1);
39 n--; 39 n--;
40 40
@@ -45,7 +45,8 @@ int strings_main(int argc, char **argv)
45 } 45 }
46 46
47 do { 47 do {
48 if ((file = bb_wfopen(*argv, "r"))) { 48 file = bb_wfopen(*argv, "r");
49 if (file) {
49PIPE: 50PIPE:
50 count = 0; 51 count = 0;
51 do { 52 do {
diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c
index ae51aba7b..e342c13f3 100644
--- a/miscutils/watchdog.c
+++ b/miscutils/watchdog.c
@@ -26,13 +26,13 @@ static void watchdog_shutdown(int ATTRIBUTE_UNUSED unused)
26int watchdog_main(int argc, char **argv) 26int watchdog_main(int argc, char **argv)
27{ 27{
28 unsigned opts; 28 unsigned opts;
29 unsigned long timer_duration = 30; /* Userspace timer duration, in seconds */ 29 unsigned timer_duration = 30; /* Userspace timer duration, in seconds */
30 char *t_arg; 30 char *t_arg;
31 31
32 opts = getopt32(argc, argv, "Ft:", &t_arg); 32 opts = getopt32(argc, argv, "Ft:", &t_arg);
33 33
34 if (opts & OPT_TIMER) 34 if (opts & OPT_TIMER)
35 timer_duration = bb_xgetlarg(t_arg, 10, 0, INT_MAX); 35 timer_duration = xatou(t_arg);
36 36
37 /* We're only interested in the watchdog device .. */ 37 /* We're only interested in the watchdog device .. */
38 if (optind < argc - 1 || argc == 1) 38 if (optind < argc - 1 || argc == 1)
diff --git a/modutils/insmod.c b/modutils/insmod.c
index 348feed8d..cef47ff45 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -2652,7 +2652,7 @@ static int new_is_module_checksummed(struct obj_file *f)
2652{ 2652{
2653 const char *p = get_modinfo_value(f, "using_checksums"); 2653 const char *p = get_modinfo_value(f, "using_checksums");
2654 if (p) 2654 if (p)
2655 return atoi(p); 2655 return xatoi(p);
2656 else 2656 else
2657 return 0; 2657 return 0;
2658} 2658}
diff --git a/networking/arping.c b/networking/arping.c
index 1ff6f90be..b9605985c 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -41,8 +41,8 @@ enum cfg_e {
41static int cfg; 41static int cfg;
42 42
43static int s; 43static int s;
44static int count = -1; 44static unsigned count = UINT_MAX;
45static int timeout; 45static unsigned timeout;
46static int sent; 46static int sent;
47static int brd_sent; 47static int brd_sent;
48static int received; 48static int received;
@@ -276,9 +276,9 @@ int arping_main(int argc, char **argv)
276 &_count, &_timeout, &device, &source); 276 &_count, &_timeout, &device, &source);
277 cfg |= opt & 0x3f; /* set respective flags */ 277 cfg |= opt & 0x3f; /* set respective flags */
278 if (opt & 0x40) /* -c: count */ 278 if (opt & 0x40) /* -c: count */
279 count = atoi(_count); 279 count = xatou(_count);
280 if (opt & 0x80) /* -w: timeout */ 280 if (opt & 0x80) /* -w: timeout */
281 timeout = atoi(_timeout); 281 timeout = xatoul_range(_timeout, 0, INT_MAX/2000);
282 if (opt & 0x100) { /* -i: interface */ 282 if (opt & 0x100) { /* -i: interface */
283 if (strlen(device) > IF_NAMESIZE) { 283 if (strlen(device) > IF_NAMESIZE) {
284 bb_error_msg_and_die("interface name '%s' is too long", 284 bb_error_msg_and_die("interface name '%s' is too long",
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c
index 492854153..902528f93 100644
--- a/networking/ftpgetput.c
+++ b/networking/ftpgetput.c
@@ -42,15 +42,15 @@ static int ftpcmd(const char *s1, const char *s2, FILE *stream, char *buf)
42 char *buf_ptr; 42 char *buf_ptr;
43 43
44 if (fgets(buf, 510, stream) == NULL) { 44 if (fgets(buf, 510, stream) == NULL) {
45 bb_perror_msg_and_die("fgets()"); 45 bb_perror_msg_and_die("fgets");
46 } 46 }
47 buf_ptr = strstr(buf, "\r\n"); 47 buf_ptr = strstr(buf, "\r\n");
48 if (buf_ptr) { 48 if (buf_ptr) {
49 *buf_ptr = '\0'; 49 *buf_ptr = '\0';
50 } 50 }
51 } while (! isdigit(buf[0]) || buf[3] != ' '); 51 } while (!isdigit(buf[0]) || buf[3] != ' ');
52 52
53 return atoi(buf); 53 return xatou(buf);
54} 54}
55 55
56static int xconnect_ftpdata(ftp_host_info_t *server, const char *buf) 56static 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)
60 60
61 buf_ptr = strrchr(buf, ','); 61 buf_ptr = strrchr(buf, ',');
62 *buf_ptr = '\0'; 62 *buf_ptr = '\0';
63 port_num = atoi(buf_ptr + 1); 63 port_num = xatoul_range(buf_ptr + 1, 0, 255);
64 64
65 buf_ptr = strrchr(buf, ','); 65 buf_ptr = strrchr(buf, ',');
66 *buf_ptr = '\0'; 66 *buf_ptr = '\0';
67 port_num += atoi(buf_ptr + 1) * 256; 67 port_num += xatoul_range(buf_ptr + 1, 0, 255) * 256;
68 68
69 server->s_in->sin_port=htons(port_num); 69 server->s_in->sin_port = htons(port_num);
70 return(xconnect(server->s_in)); 70 return xconnect(server->s_in);
71} 71}
72 72
73static FILE *ftp_login(ftp_host_info_t *server) 73static FILE *ftp_login(ftp_host_info_t *server)
diff --git a/networking/httpd.c b/networking/httpd.c
index 0e471ba58..f3fe49cae 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -1951,7 +1951,7 @@ int httpd_main(int argc, char *argv[])
1951#endif 1951#endif
1952#if ENABLE_FEATURE_HTTPD_WITHOUT_INETD 1952#if ENABLE_FEATURE_HTTPD_WITHOUT_INETD
1953 if (opt & OPT_PORT) 1953 if (opt & OPT_PORT)
1954 config->port = bb_xgetlarg(s_port, 10, 1, 0xffff); 1954 config->port = xatou16(s_port);
1955#if ENABLE_FEATURE_HTTPD_SETUID 1955#if ENABLE_FEATURE_HTTPD_SETUID
1956 if (opt & OPT_SETUID) { 1956 if (opt & OPT_SETUID) {
1957 char *e; 1957 char *e;
diff --git a/networking/ifconfig.c b/networking/ifconfig.c
index 4d346c47f..59b6f0acc 100644
--- a/networking/ifconfig.c
+++ b/networking/ifconfig.c
@@ -379,7 +379,8 @@ int ifconfig_main(int argc, char **argv)
379 379
380 safe_strncpy(host, *argv, (sizeof host)); 380 safe_strncpy(host, *argv, (sizeof host));
381#ifdef CONFIG_FEATURE_IPV6 381#ifdef CONFIG_FEATURE_IPV6
382 if ((prefix = strchr(host, '/'))) { 382 prefix = strchr(host, '/');
383 if (prefix) {
383 if (safe_strtoi(prefix + 1, &prefix_len) || 384 if (safe_strtoi(prefix + 1, &prefix_len) ||
384 (prefix_len < 0) || (prefix_len > 128)) 385 (prefix_len < 0) || (prefix_len > 128))
385 { 386 {
diff --git a/networking/inetd.c b/networking/inetd.c
index e22115a5c..966425385 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -149,8 +149,6 @@
149#define _PATH_INETDPID "/var/run/inetd.pid" 149#define _PATH_INETDPID "/var/run/inetd.pid"
150 150
151 151
152#define TOOMANY 0 /* don't start more than TOOMANY */
153
154#define CNT_INTVL 60 /* servers in CNT_INTVL sec. */ 152#define CNT_INTVL 60 /* servers in CNT_INTVL sec. */
155#define RETRYTIME (60*10) /* retry after bind or server fail */ 153#define RETRYTIME (60*10) /* retry after bind or server fail */
156 154
@@ -297,7 +295,7 @@ static const struct builtin builtins[] = {
297static int global_queuelen = 128; 295static int global_queuelen = 128;
298static int nsock, maxsock; 296static int nsock, maxsock;
299static fd_set allsock; 297static fd_set allsock;
300static int toomany = TOOMANY; 298static int toomany;
301static int timingout; 299static int timingout;
302static struct servent *sp; 300static struct servent *sp;
303static uid_t uid; 301static uid_t uid;
@@ -588,10 +586,10 @@ static servtab_t *getconfigent(void)
588 sep = new_servtab(); 586 sep = new_servtab();
589 587
590 /* memset(sep, 0, sizeof *sep); */ 588 /* memset(sep, 0, sizeof *sep); */
591more: 589 more:
592 /* freeconfig(sep); */ 590 /* freeconfig(sep); */
593 591
594 while ((cp = nextline()) && *cp == '#'); 592 while ((cp = nextline()) && *cp == '#') /* skip comment line */;
595 if (cp == NULL) { 593 if (cp == NULL) {
596 /* free(sep); */ 594 /* free(sep); */
597 return NULL; 595 return NULL;
@@ -680,7 +678,7 @@ more:
680 } else if (*ccp != '\0') 678 } else if (*ccp != '\0')
681 goto badafterall; 679 goto badafterall;
682#else 680#else
683 bb_error_msg("%s: rpc services not supported", sep->se_service); 681 bb_error_msg("%s: rpc services not supported", sep->se_service);
684#endif 682#endif
685 } 683 }
686 } 684 }
@@ -692,7 +690,7 @@ more:
692 char *s = strchr(arg, '.'); 690 char *s = strchr(arg, '.');
693 if (s) { 691 if (s) {
694 *s++ = '\0'; 692 *s++ = '\0';
695 sep->se_max = atoi(s); 693 sep->se_max = xatoi(s);
696 } else 694 } else
697 sep->se_max = toomany; 695 sep->se_max = toomany;
698 } 696 }
@@ -928,7 +926,7 @@ static void config(int sig ATTRIBUTE_UNUSED)
928 */ 926 */
929 if ( 927 if (
930#ifdef INETD_FEATURE_ENABLED 928#ifdef INETD_FEATURE_ENABLED
931 cp->se_bi == 0 && 929 cp->se_bi == 0 &&
932#endif 930#endif
933 (sep->se_wait == 1 || cp->se_wait == 0)) 931 (sep->se_wait == 1 || cp->se_wait == 0))
934 sep->se_wait = cp->se_wait; 932 sep->se_wait = cp->se_wait;
@@ -974,7 +972,7 @@ static void config(int sig ATTRIBUTE_UNUSED)
974#ifdef CONFIG_FEATURE_INETD_RPC 972#ifdef CONFIG_FEATURE_INETD_RPC
975 if (isrpcservice(sep)) { 973 if (isrpcservice(sep)) {
976 struct rpcent *rp; 974 struct rpcent *rp;
977 975 // FIXME: atoi_or_else(str, 0) would be handy here
978 sep->se_rpcprog = atoi(sep->se_service); 976 sep->se_rpcprog = atoi(sep->se_service);
979 if (sep->se_rpcprog == 0) { 977 if (sep->se_rpcprog == 0) {
980 rp = getrpcbyname(sep->se_service); 978 rp = getrpcbyname(sep->se_service);
@@ -990,9 +988,9 @@ static void config(int sig ATTRIBUTE_UNUSED)
990 register_rpc(sep); 988 register_rpc(sep);
991 } else 989 } else
992#endif 990#endif
993 { 991 {
994 u_short port = htons(atoi(sep->se_service)); 992 u_short port = htons(atoi(sep->se_service));
995 993 // FIXME: atoi_or_else(str, 0) would be handy here
996 if (!port) { 994 if (!port) {
997 /*XXX*/ strncpy(protoname, sep->se_proto, sizeof(protoname)); 995 /*XXX*/ strncpy(protoname, sep->se_proto, sizeof(protoname));
998 if (isdigit(protoname[strlen(protoname) - 1])) 996 if (isdigit(protoname[strlen(protoname) - 1]))
@@ -1255,13 +1253,7 @@ inetd_main(int argc, char *argv[])
1255 1253
1256 opt = getopt32(argc, argv, "R:f", &stoomany); 1254 opt = getopt32(argc, argv, "R:f", &stoomany);
1257 if(opt & 1) { 1255 if(opt & 1) {
1258 char *e; 1256 toomany = xatoi_u(stoomany);
1259
1260 toomany = strtoul(stoomany, &e, 0);
1261 if (!(toomany >= 0 && *e == '\0')) {
1262 toomany = TOOMANY;
1263 bb_perror_msg("-R %s: bad value for service invocation rate", stoomany);
1264 }
1265 } 1257 }
1266 argc -= optind; 1258 argc -= optind;
1267 argv += optind; 1259 argv += optind;
@@ -1317,7 +1309,6 @@ inetd_main(int argc, char *argv[])
1317 sigaddset(&sa.sa_mask, SIGHUP); 1309 sigaddset(&sa.sa_mask, SIGHUP);
1318 sa.sa_handler = retry; 1310 sa.sa_handler = retry;
1319 sigaction(SIGALRM, &sa, NULL); 1311 sigaction(SIGALRM, &sa, NULL);
1320 /* doconfig(); */
1321 config(SIGHUP); 1312 config(SIGHUP);
1322 sa.sa_handler = config; 1313 sa.sa_handler = config;
1323 sigaction(SIGHUP, &sa, NULL); 1314 sigaction(SIGHUP, &sa, NULL);
diff --git a/networking/interface.c b/networking/interface.c
index c3cc7c0bc..8e2498d27 100644
--- a/networking/interface.c
+++ b/networking/interface.c
@@ -363,7 +363,7 @@ static int nstrcmp(const char *a, const char *b)
363 } 363 }
364 364
365 if (isdigit(*a) && isdigit(*b)) { 365 if (isdigit(*a) && isdigit(*b)) {
366 return atoi(a_ptr) > atoi(b_ptr) ? 1 : -1; 366 return xatoul(a_ptr) > xatoul(b_ptr) ? 1 : -1;
367 } 367 }
368 return *a - *b; 368 return *a - *b;
369} 369}
diff --git a/networking/ipcalc.c b/networking/ipcalc.c
index 576dfc853..909373cbb 100644
--- a/networking/ipcalc.c
+++ b/networking/ipcalc.c
@@ -18,8 +18,6 @@
18#include <sys/socket.h> 18#include <sys/socket.h>
19#include <arpa/inet.h> 19#include <arpa/inet.h>
20 20
21#define IPCALC_MSG(CMD,ALTCMD) if (mode & SILENT) {ALTCMD;} else {CMD;}
22
23#define CLASS_A_NETMASK ntohl(0xFF000000) 21#define CLASS_A_NETMASK ntohl(0xFF000000)
24#define CLASS_B_NETMASK ntohl(0xFFFF0000) 22#define CLASS_B_NETMASK ntohl(0xFFFF0000)
25#define CLASS_C_NETMASK ntohl(0xFFFFFF00) 23#define CLASS_C_NETMASK ntohl(0xFFFFFF00)
@@ -56,6 +54,7 @@ static int get_prefix(unsigned long netmask)
56int get_prefix(unsigned long netmask); 54int get_prefix(unsigned long netmask);
57#endif 55#endif
58 56
57
59#define NETMASK 0x01 58#define NETMASK 0x01
60#define BROADCAST 0x02 59#define BROADCAST 0x02
61#define NETWORK 0x04 60#define NETWORK 0x04
@@ -78,12 +77,9 @@ int get_prefix(unsigned long netmask);
78#else 77#else
79#define long_options 0 78#define long_options 0
80#endif 79#endif
81
82
83
84int ipcalc_main(int argc, char **argv) 80int ipcalc_main(int argc, char **argv)
85{ 81{
86 unsigned long mode; 82 unsigned opt;
87 int have_netmask = 0; 83 int have_netmask = 0;
88 in_addr_t netmask, broadcast, network, ipaddr; 84 in_addr_t netmask, broadcast, network, ipaddr;
89 struct in_addr a; 85 struct in_addr a;
@@ -92,17 +88,18 @@ int ipcalc_main(int argc, char **argv)
92 if (ENABLE_FEATURE_IPCALC_LONG_OPTIONS) 88 if (ENABLE_FEATURE_IPCALC_LONG_OPTIONS)
93 applet_long_options = long_options; 89 applet_long_options = long_options;
94 90
95 mode = getopt32(argc, argv, "mbn" USE_FEATURE_IPCALC_FANCY("phs")); 91 opt = getopt32(argc, argv, "mbn" USE_FEATURE_IPCALC_FANCY("phs"));
96
97 argc -= optind; 92 argc -= optind;
98 argv += optind; 93 argv += optind;
99 if (mode & (BROADCAST | NETWORK | NETPREFIX)) { 94 if (opt & (BROADCAST | NETWORK | NETPREFIX)) {
100 if (argc > 2 || argc <= 0) 95 if (argc > 2 || argc <= 0)
101 bb_show_usage(); 96 bb_show_usage();
102 } else { 97 } else {
103 if (argc != 1) 98 if (argc != 1)
104 bb_show_usage(); 99 bb_show_usage();
105 } 100 }
101 if (opt & SILENT)
102 logmode = LOGMODE_NONE; /* Suppress error_msg() output */
106 103
107 ipstr = argv[0]; 104 ipstr = argv[0];
108 if (ENABLE_FEATURE_IPCALC_FANCY) { 105 if (ENABLE_FEATURE_IPCALC_FANCY) {
@@ -111,17 +108,13 @@ int ipcalc_main(int argc, char **argv)
111 108
112 prefixstr = ipstr; 109 prefixstr = ipstr;
113 110
114 while(*prefixstr) { 111 while (*prefixstr) {
115 if (*prefixstr == '/') { 112 if (*prefixstr == '/') {
116 *prefixstr = (char)0; 113 *prefixstr = (char)0;
117 prefixstr++; 114 prefixstr++;
118 if (*prefixstr) { 115 if (*prefixstr) {
119 unsigned int msk; 116 unsigned msk;
120 117 netprefix = xatoul_range(prefixstr, 0, 32);
121 if (safe_strtoul(prefixstr, &netprefix) || netprefix > 32) {
122 IPCALC_MSG(bb_error_msg_and_die("bad IP prefix: %s", prefixstr),
123 exit(EXIT_FAILURE));
124 }
125 netmask = 0; 118 netmask = 0;
126 msk = 0x80000000; 119 msk = 0x80000000;
127 while (netprefix > 0) { 120 while (netprefix > 0) {
@@ -142,21 +135,18 @@ int ipcalc_main(int argc, char **argv)
142 ipaddr = inet_aton(ipstr, &a); 135 ipaddr = inet_aton(ipstr, &a);
143 136
144 if (ipaddr == 0) { 137 if (ipaddr == 0) {
145 IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[0]), 138 bb_error_msg_and_die("bad IP address: %s", argv[0]);
146 exit(EXIT_FAILURE));
147 } 139 }
148 ipaddr = a.s_addr; 140 ipaddr = a.s_addr;
149 141
150 if (argc == 2) { 142 if (argc == 2) {
151 if (ENABLE_FEATURE_IPCALC_FANCY && have_netmask) { 143 if (ENABLE_FEATURE_IPCALC_FANCY && have_netmask) {
152 IPCALC_MSG(bb_error_msg_and_die("Use prefix or netmask, not both"), 144 bb_error_msg_and_die("use prefix or netmask, not both");
153 exit(EXIT_FAILURE));
154 } 145 }
155 146
156 netmask = inet_aton(argv[1], &a); 147 netmask = inet_aton(argv[1], &a);
157 if (netmask == 0) { 148 if (netmask == 0) {
158 IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[1]), 149 bb_error_msg_and_die("bad netmask: %s", argv[1]);
159 exit(EXIT_FAILURE));
160 } 150 }
161 netmask = a.s_addr; 151 netmask = a.s_addr;
162 } else { 152 } else {
@@ -166,34 +156,32 @@ int ipcalc_main(int argc, char **argv)
166 netmask = get_netmask(ipaddr); 156 netmask = get_netmask(ipaddr);
167 } 157 }
168 158
169 if (mode & NETMASK) { 159 if (opt & NETMASK) {
170 printf("NETMASK=%s\n", inet_ntoa((*(struct in_addr *) &netmask))); 160 printf("NETMASK=%s\n", inet_ntoa((*(struct in_addr *) &netmask)));
171 } 161 }
172 162
173 if (mode & BROADCAST) { 163 if (opt & BROADCAST) {
174 broadcast = (ipaddr & netmask) | ~netmask; 164 broadcast = (ipaddr & netmask) | ~netmask;
175 printf("BROADCAST=%s\n", inet_ntoa((*(struct in_addr *) &broadcast))); 165 printf("BROADCAST=%s\n", inet_ntoa((*(struct in_addr *) &broadcast)));
176 } 166 }
177 167
178 if (mode & NETWORK) { 168 if (opt & NETWORK) {
179 network = ipaddr & netmask; 169 network = ipaddr & netmask;
180 printf("NETWORK=%s\n", inet_ntoa((*(struct in_addr *) &network))); 170 printf("NETWORK=%s\n", inet_ntoa((*(struct in_addr *) &network)));
181 } 171 }
182 172
183 if (ENABLE_FEATURE_IPCALC_FANCY) { 173 if (ENABLE_FEATURE_IPCALC_FANCY) {
184 if (mode & NETPREFIX) { 174 if (opt & NETPREFIX) {
185 printf("PREFIX=%i\n", get_prefix(netmask)); 175 printf("PREFIX=%i\n", get_prefix(netmask));
186 } 176 }
187 177
188 if (mode & HOSTNAME) { 178 if (opt & HOSTNAME) {
189 struct hostent *hostinfo; 179 struct hostent *hostinfo;
190 int x; 180 int x;
191 181
192 hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET); 182 hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET);
193 if (!hostinfo) { 183 if (!hostinfo) {
194 IPCALC_MSG(bb_herror_msg_and_die( 184 bb_herror_msg_and_die("cannot find hostname for %s", argv[0]);
195 "cannot find hostname for %s", argv[0]),);
196 exit(EXIT_FAILURE);
197 } 185 }
198 for (x = 0; hostinfo->h_name[x]; x++) { 186 for (x = 0; hostinfo->h_name[x]; x++) {
199 hostinfo->h_name[x] = tolower(hostinfo->h_name[x]); 187 hostinfo->h_name[x] = tolower(hostinfo->h_name[x]);
diff --git a/networking/nc.c b/networking/nc.c
index f8b3fb2dd..bde5e6600 100644
--- a/networking/nc.c
+++ b/networking/nc.c
@@ -11,13 +11,15 @@
11 11
12static void timeout(int signum) 12static void timeout(int signum)
13{ 13{
14 bb_error_msg_and_die("Timed out"); 14 bb_error_msg_and_die("timed out");
15} 15}
16 16
17int nc_main(int argc, char **argv) 17int nc_main(int argc, char **argv)
18{ 18{
19 int do_listen = 0, lport = 0, delay = 0, wsecs = 0, execflag = 0, opt, 19 int sfd = 0, cfd;
20 sfd = 0, cfd; 20 unsigned opt;
21 unsigned lport = 0, wsecs = 0, delay = 0;
22 unsigned do_listen = 0, execflag = 0;
21 struct sockaddr_in address; 23 struct sockaddr_in address;
22 struct hostent *hostinfo; 24 struct hostent *hostinfo;
23 fd_set readfds, testfds; 25 fd_set readfds, testfds;
@@ -30,8 +32,8 @@ int nc_main(int argc, char **argv)
30 if (ENABLE_NC_SERVER && opt=='l') do_listen++; 32 if (ENABLE_NC_SERVER && opt=='l') do_listen++;
31 else if (ENABLE_NC_SERVER && opt=='p') 33 else if (ENABLE_NC_SERVER && opt=='p')
32 lport = bb_lookup_port(optarg, "tcp", 0); 34 lport = bb_lookup_port(optarg, "tcp", 0);
33 else if (ENABLE_NC_EXTRA && opt=='w') wsecs = atoi(optarg); 35 else if (ENABLE_NC_EXTRA && opt=='w') wsecs = xatou(optarg);
34 else if (ENABLE_NC_EXTRA && opt=='i') delay = atoi(optarg); 36 else if (ENABLE_NC_EXTRA && opt=='i') delay = xatou(optarg);
35 else if (ENABLE_NC_EXTRA && opt=='f') infile = optarg; 37 else if (ENABLE_NC_EXTRA && opt=='f') infile = optarg;
36 else if (ENABLE_NC_EXTRA && opt=='e' && optind!=argc) { 38 else if (ENABLE_NC_EXTRA && opt=='e' && optind!=argc) {
37 execflag++; 39 execflag++;
@@ -40,11 +42,10 @@ int nc_main(int argc, char **argv)
40 } 42 }
41 } 43 }
42 44
43
44 // For listen or file we need zero arguments, dialout is 2. 45 // For listen or file we need zero arguments, dialout is 2.
45 // For exec we need at least one more argument at the end, more ok 46 // For exec we need at least one more argument at the end, more ok
46 47
47 opt = (do_listen || infile) ? 0 : 2 + execflag; 48 opt = (do_listen || infile) ? 0 : 2 + execflag;
48 if (execflag ? argc-optind < opt : argc-optind!=opt || 49 if (execflag ? argc-optind < opt : argc-optind!=opt ||
49 (infile && do_listen)) 50 (infile && do_listen))
50 bb_show_usage(); 51 bb_show_usage();
@@ -66,7 +67,6 @@ int nc_main(int argc, char **argv)
66 67
67 if (lport != 0) { 68 if (lport != 0) {
68 address.sin_port = lport; 69 address.sin_port = lport;
69
70 xbind(sfd, (struct sockaddr *) &address, sizeof(address)); 70 xbind(sfd, (struct sockaddr *) &address, sizeof(address));
71 } 71 }
72 72
@@ -83,7 +83,8 @@ int nc_main(int argc, char **argv)
83 fdprintf(2, "%d\n", SWAP_BE16(address.sin_port)); 83 fdprintf(2, "%d\n", SWAP_BE16(address.sin_port));
84 } 84 }
85repeatyness: 85repeatyness:
86 if ((cfd = accept(sfd, (struct sockaddr *) &address, &addrlen)) < 0) 86 cfd = accept(sfd, (struct sockaddr *) &address, &addrlen);
87 if (cfd < 0)
87 bb_perror_msg_and_die("accept"); 88 bb_perror_msg_and_die("accept");
88 89
89 if (!execflag) close(sfd); 90 if (!execflag) close(sfd);
@@ -116,10 +117,11 @@ repeatyness:
116 117
117 // With more than one -l, repeatedly act as server. 118 // With more than one -l, repeatedly act as server.
118 119
119 if (do_listen>1 && vfork()) { 120 if (do_listen > 1 && vfork()) {
120 // This is a bit weird as cleanup goes, since we wind up with no 121 // This is a bit weird as cleanup goes, since we wind up with no
121 // stdin/stdout/stderr. But it's small and shouldn't hurt anything. 122 // stdin/stdout/stderr. But it's small and shouldn't hurt anything.
122 // We check for cfd == 0 above. 123 // We check for cfd == 0 above.
124 logmode = LOGMODE_NONE;
123 close(0); 125 close(0);
124 close(1); 126 close(1);
125 close(2); 127 close(2);
diff --git a/networking/ping.c b/networking/ping.c
index a81472f96..8ca8be9b9 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -157,9 +157,9 @@ int ping_main(int argc, char **argv)
157static struct sockaddr_in pingaddr; 157static struct sockaddr_in pingaddr;
158static struct sockaddr_in sourceaddr; 158static struct sockaddr_in sourceaddr;
159static int pingsock = -1; 159static int pingsock = -1;
160static int datalen; /* intentionally uninitialized to work around gcc bug */ 160static unsigned datalen; /* intentionally uninitialized to work around gcc bug */
161 161
162static long ntransmitted, nreceived, nrepeats, pingcount; 162static unsigned long ntransmitted, nreceived, nrepeats, pingcount;
163static int myid, options; 163static int myid, options;
164static unsigned long tmin = ULONG_MAX, tmax, tsum; 164static unsigned long tmin = ULONG_MAX, tmax, tsum;
165static char rcvd_tbl[MAX_DUP_CHK / 8]; 165static char rcvd_tbl[MAX_DUP_CHK / 8];
@@ -179,12 +179,12 @@ static void pingstats(int junk)
179 signal(SIGINT, SIG_IGN); 179 signal(SIGINT, SIG_IGN);
180 180
181 printf("\n--- %s ping statistics ---\n", hostent->h_name); 181 printf("\n--- %s ping statistics ---\n", hostent->h_name);
182 printf("%ld packets transmitted, ", ntransmitted); 182 printf("%lu packets transmitted, ", ntransmitted);
183 printf("%ld packets received, ", nreceived); 183 printf("%lu packets received, ", nreceived);
184 if (nrepeats) 184 if (nrepeats)
185 printf("%ld duplicates, ", nrepeats); 185 printf("%lu duplicates, ", nrepeats);
186 if (ntransmitted) 186 if (ntransmitted)
187 printf("%ld%% packet loss\n", 187 printf("%lu%% packet loss\n",
188 (ntransmitted - nreceived) * 100 / ntransmitted); 188 (ntransmitted - nreceived) * 100 / ntransmitted);
189 if (nreceived) 189 if (nreceived)
190 printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n", 190 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)
427 if (--argc <= 0) 427 if (--argc <= 0)
428 bb_show_usage(); 428 bb_show_usage();
429 argv++; 429 argv++;
430 pingcount = atoi(*argv); 430 pingcount = xatoul(*argv);
431 break; 431 break;
432 case 's': 432 case 's':
433 if (--argc <= 0) 433 if (--argc <= 0)
434 bb_show_usage(); 434 bb_show_usage();
435 argv++; 435 argv++;
436 datalen = atoi(*argv); 436 datalen = xatou16(*argv);
437 break; 437 break;
438 case 'I': 438 case 'I':
439 if (--argc <= 0) 439 if (--argc <= 0)
diff --git a/networking/ping6.c b/networking/ping6.c
index 6079c40d9..0d6a739bf 100644
--- a/networking/ping6.c
+++ b/networking/ping6.c
@@ -145,10 +145,10 @@ int ping6_main(int argc, char **argv)
145/* full(er) version */ 145/* full(er) version */
146static struct sockaddr_in6 pingaddr; 146static struct sockaddr_in6 pingaddr;
147static int pingsock = -1; 147static int pingsock = -1;
148static int datalen; /* intentionally uninitialized to work around gcc bug */ 148static unsigned datalen; /* intentionally uninitialized to work around gcc bug */
149static int if_index; 149static int if_index;
150 150
151static long ntransmitted, nreceived, nrepeats, pingcount; 151static unsigned long ntransmitted, nreceived, nrepeats, pingcount;
152static int myid, options; 152static int myid, options;
153static unsigned long tmin = ULONG_MAX, tmax, tsum; 153static unsigned long tmin = ULONG_MAX, tmax, tsum;
154static char rcvd_tbl[MAX_DUP_CHK / 8]; 154static char rcvd_tbl[MAX_DUP_CHK / 8];
@@ -168,12 +168,12 @@ static void pingstats(int junk)
168 signal(SIGINT, SIG_IGN); 168 signal(SIGINT, SIG_IGN);
169 169
170 printf("\n--- %s ping statistics ---\n", hostent->h_name); 170 printf("\n--- %s ping statistics ---\n", hostent->h_name);
171 printf("%ld packets transmitted, ", ntransmitted); 171 printf("%lu packets transmitted, ", ntransmitted);
172 printf("%ld packets received, ", nreceived); 172 printf("%lu packets received, ", nreceived);
173 if (nrepeats) 173 if (nrepeats)
174 printf("%ld duplicates, ", nrepeats); 174 printf("%lu duplicates, ", nrepeats);
175 if (ntransmitted) 175 if (ntransmitted)
176 printf("%ld%% packet loss\n", 176 printf("%lu%% packet loss\n",
177 (ntransmitted - nreceived) * 100 / ntransmitted); 177 (ntransmitted - nreceived) * 100 / ntransmitted);
178 if (nreceived) 178 if (nreceived)
179 printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n", 179 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)
439 if (--argc <= 0) 439 if (--argc <= 0)
440 bb_show_usage(); 440 bb_show_usage();
441 argv++; 441 argv++;
442 pingcount = atoi(*argv); 442 pingcount = xatoul(*argv);
443 break; 443 break;
444 case 's': 444 case 's':
445 if (--argc <= 0) 445 if (--argc <= 0)
446 bb_show_usage(); 446 bb_show_usage();
447 argv++; 447 argv++;
448 datalen = atoi(*argv); 448 datalen = xatou16(*argv);
449 break; 449 break;
450 case 'I': 450 case 'I':
451 if (--argc <= 0) 451 if (--argc <= 0)
diff --git a/networking/route.c b/networking/route.c
index 2e6e017b6..65b40fcd6 100644
--- a/networking/route.c
+++ b/networking/route.c
@@ -178,7 +178,7 @@ static void INET_setroute(int action, char **args)
178 if(prefix) { 178 if(prefix) {
179 int prefix_len; 179 int prefix_len;
180 180
181 prefix_len = bb_xgetularg10_bnd(prefix+1, 0, 32); 181 prefix_len = xatoul_range(prefix+1, 0, 32);
182 mask_in_addr(rt) = htonl( ~ (0xffffffffUL >> prefix_len)); 182 mask_in_addr(rt) = htonl( ~ (0xffffffffUL >> prefix_len));
183 *prefix = '\0'; 183 *prefix = '\0';
184#if HAVE_NEW_ADDRT 184#if HAVE_NEW_ADDRT
@@ -218,7 +218,7 @@ static void INET_setroute(int action, char **args)
218 218
219#if HAVE_NEW_ADDRT 219#if HAVE_NEW_ADDRT
220 if (k == KW_IPVx_METRIC) { 220 if (k == KW_IPVx_METRIC) {
221 rt.rt_metric = bb_xgetularg10(args_m1) + 1; 221 rt.rt_metric = xatoul(args_m1) + 1;
222 continue; 222 continue;
223 } 223 }
224#endif 224#endif
@@ -259,20 +259,20 @@ static void INET_setroute(int action, char **args)
259 259
260 if (k == KW_IPVx_MSS) { /* Check valid MSS bounds. */ 260 if (k == KW_IPVx_MSS) { /* Check valid MSS bounds. */
261 rt.rt_flags |= RTF_MSS; 261 rt.rt_flags |= RTF_MSS;
262 rt.rt_mss = bb_xgetularg10_bnd(args_m1, 64, 32768); 262 rt.rt_mss = xatoul_range(args_m1, 64, 32768);
263 continue; 263 continue;
264 } 264 }
265 265
266 if (k == KW_IPVx_WINDOW) { /* Check valid window bounds. */ 266 if (k == KW_IPVx_WINDOW) { /* Check valid window bounds. */
267 rt.rt_flags |= RTF_WINDOW; 267 rt.rt_flags |= RTF_WINDOW;
268 rt.rt_window = bb_xgetularg10_bnd(args_m1, 128, INT_MAX); 268 rt.rt_window = xatoul_range(args_m1, 128, INT_MAX);
269 continue; 269 continue;
270 } 270 }
271 271
272#ifdef RTF_IRTT 272#ifdef RTF_IRTT
273 if (k == KW_IPVx_IRTT) { 273 if (k == KW_IPVx_IRTT) {
274 rt.rt_flags |= RTF_IRTT; 274 rt.rt_flags |= RTF_IRTT;
275 rt.rt_irtt = bb_xgetularg10(args_m1); 275 rt.rt_irtt = xatoul(args_m1);
276 rt.rt_irtt *= (sysconf(_SC_CLK_TCK) / 100); /* FIXME */ 276 rt.rt_irtt *= (sysconf(_SC_CLK_TCK) / 100); /* FIXME */
277#if 0 /* FIXME: do we need to check anything of this? */ 277#if 0 /* FIXME: do we need to check anything of this? */
278 if (rt.rt_irtt < 1 || rt.rt_irtt > (120 * HZ)) { 278 if (rt.rt_irtt < 1 || rt.rt_irtt > (120 * HZ)) {
@@ -353,7 +353,7 @@ static void INET6_setroute(int action, char **args)
353 char *cp; 353 char *cp;
354 if ((cp = strchr(target, '/'))) { /* Yes... const to non is ok. */ 354 if ((cp = strchr(target, '/'))) { /* Yes... const to non is ok. */
355 *cp = 0; 355 *cp = 0;
356 prefix_len = bb_xgetularg10_bnd(cp+1, 0, 128); 356 prefix_len = xatoul_range(cp+1, 0, 128);
357 } else { 357 } else {
358 prefix_len = 128; 358 prefix_len = 128;
359 } 359 }
@@ -384,7 +384,7 @@ static void INET6_setroute(int action, char **args)
384 } 384 }
385 385
386 if (k == KW_IPVx_METRIC) { 386 if (k == KW_IPVx_METRIC) {
387 rt.rtmsg_metric = bb_xgetularg10(args_m1); 387 rt.rtmsg_metric = xatoul(args_m1);
388 continue; 388 continue;
389 } 389 }
390 390
diff --git a/networking/telnetd.c b/networking/telnetd.c
index 1c4dede39..c6789e19c 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -369,7 +369,7 @@ telnetd_main(int argc, char **argv)
369 sockaddr_type sa; 369 sockaddr_type sa;
370 int master_fd; 370 int master_fd;
371 int on = 1; 371 int on = 1;
372 int portnbr = 23; 372 unsigned portnbr = 23;
373 struct in_addr bind_addr = { .s_addr = 0x0 }; 373 struct in_addr bind_addr = { .s_addr = 0x0 };
374 char *opt_portnbr, *opt_bindaddr; 374 char *opt_portnbr, *opt_bindaddr;
375#endif /* CONFIG_FEATURE_TELNETD_INETD */ 375#endif /* CONFIG_FEATURE_TELNETD_INETD */
@@ -393,7 +393,7 @@ telnetd_main(int argc, char **argv)
393 //if (opt & 1) // -f 393 //if (opt & 1) // -f
394 //if (opt & 2) // -l 394 //if (opt & 2) // -l
395#ifndef CONFIG_FEATURE_TELNETD_INETD 395#ifndef CONFIG_FEATURE_TELNETD_INETD
396 if (opt & 4) portnbr = atoi(opt_portnbr); // -p 396 if (opt & 4) portnbr = xatou16(opt_portnbr); // -p
397 if (opt & 8) // -b 397 if (opt & 8) // -b
398 if (inet_aton(opt_bindaddr, &bind_addr) == 0) bb_show_usage(); 398 if (inet_aton(opt_bindaddr, &bind_addr) == 0) bb_show_usage();
399#endif /* CONFIG_FEATURE_TELNETD_INETD */ 399#endif /* CONFIG_FEATURE_TELNETD_INETD */
diff --git a/networking/tftp.c b/networking/tftp.c
index bfe94aca2..6213d6622 100644
--- a/networking/tftp.c
+++ b/networking/tftp.c
@@ -373,7 +373,7 @@ static int tftp(const int cmd, const struct hostent *host,
373 res = tftp_option_get(&buf[2], len - 2, OPTION_BLOCKSIZE); 373 res = tftp_option_get(&buf[2], len - 2, OPTION_BLOCKSIZE);
374 374
375 if (res) { 375 if (res) {
376 int blksize = atoi(res); 376 int blksize = xatoi_u(res);
377 377
378 if (tftp_blocksize_check(blksize, tftp_bufsize - 4)) { 378 if (tftp_blocksize_check(blksize, tftp_bufsize - 4)) {
379 379
@@ -516,7 +516,7 @@ int tftp_main(int argc, char **argv)
516 516
517#ifdef CONFIG_FEATURE_TFTP_BLOCKSIZE 517#ifdef CONFIG_FEATURE_TFTP_BLOCKSIZE
518 if (sblocksize) { 518 if (sblocksize) {
519 blocksize = atoi(sblocksize); 519 blocksize = xatoi_u(sblocksize);
520 if (!tftp_blocksize_check(blocksize, 0)) { 520 if (!tftp_blocksize_check(blocksize, 0)) {
521 return EXIT_FAILURE; 521 return EXIT_FAILURE;
522 } 522 }
diff --git a/networking/traceroute.c b/networking/traceroute.c
index 4af523625..84ce8ae69 100644
--- a/networking/traceroute.c
+++ b/networking/traceroute.c
@@ -416,7 +416,7 @@ ifaddrlist(struct IFADDRLIST **ipaddrp)
416 ++al; 416 ++al;
417 ++nipaddr; 417 ++nipaddr;
418 } 418 }
419 if(nipaddr == 0) 419 if (nipaddr == 0)
420 bb_error_msg_and_die ("Can't find any network interfaces"); 420 bb_error_msg_and_die ("Can't find any network interfaces");
421 (void)close(fd); 421 (void)close(fd);
422 422
@@ -494,34 +494,6 @@ findsaddr(const struct sockaddr_in *to, struct sockaddr_in *from)
494 494
495*/ 495*/
496 496
497/* String to value with optional min and max. Handles decimal and hex. */
498static int
499str2val(const char *str, const char *what, int mi, int ma)
500{
501 const char *cp;
502 int val;
503 char *ep;
504
505 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
506 cp = str + 2;
507 val = (int)strtol(cp, &ep, 16);
508 } else
509 val = (int)strtol(str, &ep, 10);
510 if (*ep != '\0') {
511 bb_error_msg_and_die("\"%s\" bad value for %s", str, what);
512 }
513 if (val < mi && mi >= 0) {
514 if (mi == 0)
515 bb_error_msg_and_die("%s must be >= %d", what, mi);
516 else
517 bb_error_msg_and_die("%s must be > %d", what, mi - 1);
518 }
519 if (val > ma && ma >= 0)
520 bb_error_msg_and_die("%s must be <= %d", what, ma);
521 return val;
522}
523
524
525/* 497/*
526 * Subtract 2 timeval structs: out = out - in. 498 * Subtract 2 timeval structs: out = out - in.
527 * Out is assumed to be >= in. 499 * Out is assumed to be >= in.
@@ -828,7 +800,7 @@ inetname(struct sockaddr_in *from)
828 char name[257]; 800 char name[257];
829 801
830 if (!nflag && from->sin_addr.s_addr != INADDR_ANY) { 802 if (!nflag && from->sin_addr.s_addr != INADDR_ANY) {
831 if(INET_rresolve(name, sizeof(name), from, 0x4000, 0xffffffff) >= 0) 803 if (INET_rresolve(name, sizeof(name), from, 0x4000, 0xffffffff) >= 0)
832 n = name; 804 n = name;
833 } 805 }
834 ina = inet_ntoa(from->sin_addr); 806 ina = inet_ntoa(from->sin_addr);
@@ -974,7 +946,7 @@ traceroute_main(int argc, char *argv[])
974#endif 946#endif
975 ); 947 );
976 948
977 if(op & USAGE_OP_DONT_FRAGMNT) 949 if (op & USAGE_OP_DONT_FRAGMNT)
978 off = IP_DF; 950 off = IP_DF;
979#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP 951#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
980 useicmp = op & USAGE_OP_USE_ICMP; 952 useicmp = op & USAGE_OP_USE_ICMP;
@@ -983,34 +955,34 @@ traceroute_main(int argc, char *argv[])
983#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE 955#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
984 verbose = op & USAGE_OP_VERBOSE; 956 verbose = op & USAGE_OP_VERBOSE;
985#endif 957#endif
986 if(op & USAGE_OP_IP_CHKSUM) { 958 if (op & USAGE_OP_IP_CHKSUM) {
987 doipcksum = 0; 959 doipcksum = 0;
988 bb_error_msg("Warning: ip checksums disabled"); 960 bb_error_msg("warning: ip checksums disabled");
989 } 961 }
990 if (tos_str) 962 if (tos_str)
991 tos = str2val(tos_str, "tos", 0, 255); 963 tos = xatoul_range(tos_str, 0, 255);
992 if(max_ttl_str) 964 if (max_ttl_str)
993 max_ttl = str2val(max_ttl_str, "max ttl", 1, 255); 965 max_ttl = xatoul_range(max_ttl_str, 1, 255);
994 if(port_str) 966 if (port_str)
995 port = (u_short)str2val(port_str, "port", 1, (1 << 16) - 1); 967 port = xatou16(port_str);
996 if(nprobes_str) 968 if (nprobes_str)
997 nprobes = str2val(nprobes_str, "nprobes", 1, -1); 969 nprobes = xatoul_range(nprobes_str, 1, INT_MAX);
998 if(source) { 970 if (source) {
999 /* 971 /*
1000 * set the ip source address of the outbound 972 * set the ip source address of the outbound
1001 * probe (e.g., on a multi-homed host). 973 * probe (e.g., on a multi-homed host).
1002 */ 974 */
1003 if (getuid()) bb_error_msg_and_die("-s %s: permission denied", source); 975 if (getuid()) bb_error_msg_and_die("-s %s: permission denied", source);
1004 } 976 }
1005 if(waittime_str) 977 if (waittime_str)
1006 waittime = str2val(waittime_str, "wait time", 2, 24 * 60 * 60); 978 waittime = xatoul_range(waittime_str, 2, 24 * 60 * 60);
1007 if(pausemsecs_str) 979 if (pausemsecs_str)
1008 pausemsecs = str2val(pausemsecs_str, "pause msecs", 0, 60 * 60 * 1000); 980 pausemsecs = xatoul_range(pausemsecs_str, 0, 60 * 60 * 1000);
1009 if(first_ttl_str) 981 if (first_ttl_str)
1010 first_ttl = str2val(first_ttl_str, "first ttl", 1, 255); 982 first_ttl = xatoul_range(first_ttl_str, 1, 255);
1011 983
1012#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE 984#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
1013 if(sourse_route_list) { 985 if (sourse_route_list) {
1014 llist_t *l_sr; 986 llist_t *l_sr;
1015 987
1016 for(l_sr = sourse_route_list; l_sr; ) { 988 for(l_sr = sourse_route_list; l_sr; ) {
@@ -1046,8 +1018,7 @@ traceroute_main(int argc, char *argv[])
1046 switch (argc - optind) { 1018 switch (argc - optind) {
1047 1019
1048 case 2: 1020 case 2:
1049 packlen = str2val(argv[optind + 1], 1021 packlen = xatoul_range(argv[optind + 1], minpacket, maxpacket);
1050 "packet length", minpacket, maxpacket);
1051 /* Fall through */ 1022 /* Fall through */
1052 1023
1053 case 1: 1024 case 1:
@@ -1055,8 +1026,7 @@ traceroute_main(int argc, char *argv[])
1055 hi = gethostinfo(hostname); 1026 hi = gethostinfo(hostname);
1056 setsin(to, hi->addrs[0]); 1027 setsin(to, hi->addrs[0]);
1057 if (hi->n > 1) 1028 if (hi->n > 1)
1058 bb_error_msg( 1029 bb_error_msg("warning: %s has multiple addresses; using %s",
1059 "Warning: %s has multiple addresses; using %s",
1060 hostname, inet_ntoa(to->sin_addr)); 1030 hostname, inet_ntoa(to->sin_addr));
1061 hostname = hi->name; 1031 hostname = hi->name;
1062 hi->name = NULL; 1032 hi->name = NULL;
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 9ab6aee8c..f2cf82f05 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -262,10 +262,10 @@ int udhcpc_main(int argc, char *argv[])
262 client_config.script = optarg; 262 client_config.script = optarg;
263 break; 263 break;
264 case 'T': 264 case 'T':
265 client_config.timeout = atoi(optarg); 265 client_config.timeout = xatoi_u(optarg);
266 break; 266 break;
267 case 't': 267 case 't':
268 client_config.retries = atoi(optarg); 268 client_config.retries = xatoi_u(optarg);
269 break; 269 break;
270 case 'v': 270 case 'v':
271 printf("version %s\n\n", BB_VER); 271 printf("version %s\n\n", BB_VER);
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c
index d9dfb8965..52d383869 100644
--- a/networking/udhcp/files.c
+++ b/networking/udhcp/files.c
@@ -35,7 +35,8 @@ static int read_ip(const char *line, void *arg)
35 int retval = 1; 35 int retval = 1;
36 36
37 if (!inet_aton(line, addr)) { 37 if (!inet_aton(line, addr)) {
38 if ((host = gethostbyname(line))) 38 host = gethostbyname(line);
39 if (host)
39 addr->s_addr = *((unsigned long *) host->h_addr_list[0]); 40 addr->s_addr = *((unsigned long *) host->h_addr_list[0]);
40 else retval = 0; 41 else retval = 0;
41 } 42 }
@@ -72,10 +73,7 @@ static int read_str(const char *line, void *arg)
72 73
73static int read_u32(const char *line, void *arg) 74static int read_u32(const char *line, void *arg)
74{ 75{
75 uint32_t *dest = arg; 76 return safe_strtou32(line, (uint32_t*)arg) == 0;
76 char *endptr;
77 *dest = strtoul(line, &endptr, 0);
78 return endptr[0] == '\0';
79} 77}
80 78
81 79
diff --git a/networking/vconfig.c b/networking/vconfig.c
index 6c808eb2f..003c1a8f7 100644
--- a/networking/vconfig.c
+++ b/networking/vconfig.c
@@ -144,14 +144,14 @@ int vconfig_main(int argc, char **argv)
144 * doing so wouldn't save that much space and would also make maintainence 144 * doing so wouldn't save that much space and would also make maintainence
145 * more of a pain. */ 145 * more of a pain. */
146 if (ifr.cmd == SET_VLAN_FLAG_CMD) { /* set_flag */ 146 if (ifr.cmd == SET_VLAN_FLAG_CMD) { /* set_flag */
147 ifr.u.flag = bb_xgetularg10_bnd(p, 0, 1); 147 ifr.u.flag = xatoul_range(p, 0, 1);
148 /* DM: in order to set reorder header, qos must be set */ 148 /* DM: in order to set reorder header, qos must be set */
149 ifr.vlan_qos = bb_xgetularg10_bnd(argv[3], 0, 7); 149 ifr.vlan_qos = xatoul_range(argv[3], 0, 7);
150 } else if (ifr.cmd == ADD_VLAN_CMD) { /* add */ 150 } else if (ifr.cmd == ADD_VLAN_CMD) { /* add */
151 ifr.u.VID = bb_xgetularg10_bnd(p, 0, VLAN_GROUP_ARRAY_LEN-1); 151 ifr.u.VID = xatoul_range(p, 0, VLAN_GROUP_ARRAY_LEN-1);
152 } else if (ifr.cmd != DEL_VLAN_CMD) { /* set_{egress|ingress}_map */ 152 } else if (ifr.cmd != DEL_VLAN_CMD) { /* set_{egress|ingress}_map */
153 ifr.u.skb_priority = bb_xgetularg10_bnd(p, 0, ULONG_MAX); 153 ifr.u.skb_priority = xatou(p);
154 ifr.vlan_qos = bb_xgetularg10_bnd(argv[3], 0, 7); 154 ifr.vlan_qos = xatoul_range(argv[3], 0, 7);
155 } 155 }
156 } 156 }
157 157
diff --git a/networking/wget.c b/networking/wget.c
index eda0bb87c..e7b19f2ef 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -297,7 +297,7 @@ read_response:
297 s = buf; 297 s = buf;
298 while (*s != '\0' && !isspace(*s)) ++s; 298 while (*s != '\0' && !isspace(*s)) ++s;
299 while (isspace(*s)) ++s; 299 while (isspace(*s)) ++s;
300 switch (status = atoi(s)) { 300 switch (status = xatoi(s)) {
301 case 0: 301 case 0:
302 case 100: 302 case 100:
303 while (gethdr(buf, sizeof(buf), sfp, &n) != NULL) 303 while (gethdr(buf, sizeof(buf), sfp, &n) != NULL)
@@ -406,9 +406,9 @@ read_response:
406 bb_error_msg_and_die("PASV: %s", buf+4); 406 bb_error_msg_and_die("PASV: %s", buf+4);
407 s = strrchr(buf, ','); 407 s = strrchr(buf, ',');
408 *s = 0; 408 *s = 0;
409 port = atoi(s+1); 409 port = xatol_range(s+1, 0, 255);
410 s = strrchr(buf, ','); 410 s = strrchr(buf, ',');
411 port += atoi(s+1) * 256; 411 port += xatol_range(s+1, 0, 255) * 256;
412 s_in.sin_port = htons(port); 412 s_in.sin_port = htons(port);
413 dfp = open_socket(&s_in); 413 dfp = open_socket(&s_in);
414 414
@@ -562,7 +562,7 @@ static void parse_url(char *src_url, struct host_info *h)
562 cp = strchr(pp, ':'); 562 cp = strchr(pp, ':');
563 if (cp != NULL) { 563 if (cp != NULL) {
564 *cp++ = '\0'; 564 *cp++ = '\0';
565 h->port = htons(atoi(cp)); 565 h->port = htons(xatou16(cp));
566 } 566 }
567} 567}
568 568
@@ -646,7 +646,7 @@ static int ftpcmd(char *s1, char *s2, FILE *fp, char *buf)
646 } 646 }
647 } while (!isdigit(buf[0]) || buf[3] != ' '); 647 } while (!isdigit(buf[0]) || buf[3] != ' ');
648 648
649 return atoi(buf); 649 return xatoi(buf);
650} 650}
651 651
652#ifdef CONFIG_FEATURE_WGET_STATUSBAR 652#ifdef CONFIG_FEATURE_WGET_STATUSBAR
diff --git a/procps/kill.c b/procps/kill.c
index 2408a70ca..b29f61b58 100644
--- a/procps/kill.c
+++ b/procps/kill.c
@@ -47,7 +47,7 @@ int kill_main(int argc, char **argv)
47 } else { /* -l <sig list> */ 47 } else { /* -l <sig list> */
48 while ((arg = *++argv)!=NULL) { 48 while ((arg = *++argv)!=NULL) {
49 if (isdigit(arg[0])) { 49 if (isdigit(arg[0])) {
50 signo = atoi(arg); 50 signo = xatoi_u(arg);
51 name = get_signame(signo); 51 name = get_signame(signo);
52 } else { 52 } else {
53 signo = get_signum(arg); 53 signo = get_signum(arg);
@@ -140,7 +140,7 @@ do_it_now:
140 while (arg) { 140 while (arg) {
141 if (!isdigit(arg[0]) && arg[0]!='-') 141 if (!isdigit(arg[0]) && arg[0]!='-')
142 bb_error_msg_and_die("bad pid '%s'", arg); 142 bb_error_msg_and_die("bad pid '%s'", arg);
143 pid = strtol(arg, NULL, 0); 143 pid = xatou(arg);
144 /* FIXME: better overflow check? */ 144 /* FIXME: better overflow check? */
145 if (kill(pid, signo)!=0) { 145 if (kill(pid, signo)!=0) {
146 bb_perror_msg("cannot kill pid %ld", (long)pid); 146 bb_perror_msg("cannot kill pid %ld", (long)pid);
diff --git a/procps/pidof.c b/procps/pidof.c
index e6c954843..62c590fd8 100644
--- a/procps/pidof.c
+++ b/procps/pidof.c
@@ -14,7 +14,7 @@
14#define SINGLE (1<<0) 14#define SINGLE (1<<0)
15#else 15#else
16#define _SINGLE_COMPL(a) 16#define _SINGLE_COMPL(a)
17#define SINGLE (0) 17#define SINGLE 0
18#endif 18#endif
19 19
20#if ENABLE_FEATURE_PIDOF_OMIT 20#if ENABLE_FEATURE_PIDOF_OMIT
@@ -56,7 +56,7 @@ int pidof_main(int argc, char **argv)
56 /* are we asked to exclude the parent's process ID? */ 56 /* are we asked to exclude the parent's process ID? */
57 if (!strncmp(omits_p->data, "%PPID", 5)) { 57 if (!strncmp(omits_p->data, "%PPID", 5)) {
58 llist_pop(&omits_p); 58 llist_pop(&omits_p);
59 snprintf(getppid_str, sizeof(getppid_str), "%d", getppid()); 59 snprintf(getppid_str, sizeof(getppid_str), "%ld", (long)getppid());
60 llist_add_to(&omits_p, getppid_str); 60 llist_add_to(&omits_p, getppid_str);
61 } 61 }
62 omits_p = omits_p->link; 62 omits_p = omits_p->link;
@@ -64,19 +64,19 @@ int pidof_main(int argc, char **argv)
64 } 64 }
65#endif 65#endif
66 /* Looks like everything is set to go. */ 66 /* Looks like everything is set to go. */
67 while(optind < argc) { 67 while (optind < argc) {
68 long *pidList; 68 long *pidList;
69 long *pl; 69 long *pl;
70 70
71 /* reverse the pidlist like GNU pidof does. */ 71 /* reverse the pidlist like GNU pidof does. */
72 pidList = pidlist_reverse(find_pid_by_name(argv[optind])); 72 pidList = pidlist_reverse(find_pid_by_name(argv[optind]));
73 for(pl = pidList; *pl > 0; pl++) { 73 for (pl = pidList; *pl > 0; pl++) {
74#if ENABLE_FEATURE_PIDOF_OMIT 74#if ENABLE_FEATURE_PIDOF_OMIT
75 unsigned omitted = 0; 75 unsigned omitted = 0;
76 if (opt & OMIT) { 76 if (opt & OMIT) {
77 llist_t *omits_p = omits; 77 llist_t *omits_p = omits;
78 while (omits_p) 78 while (omits_p)
79 if (strtol(omits_p->data, NULL, 10) == *pl) { 79 if (xatoul(omits_p->data) == *pl) {
80 omitted = 1; break; 80 omitted = 1; break;
81 } else 81 } else
82 omits_p = omits_p->link; 82 omits_p = omits_p->link;
diff --git a/procps/renice.c b/procps/renice.c
index 53dc57855..a91328f53 100644
--- a/procps/renice.c
+++ b/procps/renice.c
@@ -53,13 +53,13 @@ static inline int int_add_no_wrap(int a, int b)
53 53
54int renice_main(int argc, char **argv) 54int renice_main(int argc, char **argv)
55{ 55{
56 static const char Xetpriority_msg[] = "%d : %cetpriority"; 56 static const char Xetpriority_msg[] = "%d: %cetpriority";
57 57
58 int retval = EXIT_SUCCESS; 58 int retval = EXIT_SUCCESS;
59 int which = PRIO_PROCESS; /* Default 'which' value. */ 59 int which = PRIO_PROCESS; /* Default 'which' value. */
60 int use_relative = 0; 60 int use_relative = 0;
61 int adjustment, new_priority; 61 int adjustment, new_priority;
62 id_t who; 62 unsigned who;
63 63
64 ++argv; 64 ++argv;
65 65
@@ -74,15 +74,15 @@ int renice_main(int argc, char **argv)
74 } 74 }
75 75
76 /* Get the priority adjustment (absolute or relative). */ 76 /* Get the priority adjustment (absolute or relative). */
77 adjustment = bb_xgetlarg(*argv, 10, INT_MIN, INT_MAX); 77 adjustment = xatoi(*argv);
78 78
79 while (*++argv) { 79 while (*++argv) {
80 /* Check for a mode switch. */ 80 /* Check for a mode switch. */
81 if ((argv[0][0] == '-') && argv[0][1] && !argv[0][2]) { 81 if ((argv[0][0] == '-') && argv[0][1] && !argv[0][2]) {
82 static const char opts[] 82 static const char opts[]
83 = { 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER }; 83 = { 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER };
84 const char *p; 84 const char *p = strchr(opts, argv[0][1]);
85 if ((p = strchr(opts, argv[0][1]))) { 85 if (p) {
86 which = p[4]; 86 which = p[4];
87 continue; 87 continue;
88 } 88 }
@@ -91,16 +91,14 @@ int renice_main(int argc, char **argv)
91 /* Process an ID arg. */ 91 /* Process an ID arg. */
92 if (which == PRIO_USER) { 92 if (which == PRIO_USER) {
93 struct passwd *p; 93 struct passwd *p;
94 if (!(p = getpwnam(*argv))) { 94 p = getpwnam(*argv);
95 if (!p) {
95 bb_error_msg("unknown user: %s", *argv); 96 bb_error_msg("unknown user: %s", *argv);
96 goto HAD_ERROR; 97 goto HAD_ERROR;
97 } 98 }
98 who = p->pw_uid; 99 who = p->pw_uid;
99 } else { 100 } else {
100 char *e; 101 if (safe_strtou(*argv, &who)) {
101 errno = 0;
102 who = strtoul(*argv, &e, 10);
103 if (*e || (*argv == e) || errno) {
104 bb_error_msg("bad value: %s", *argv); 102 bb_error_msg("bad value: %s", *argv);
105 goto HAD_ERROR; 103 goto HAD_ERROR;
106 } 104 }
diff --git a/procps/top.c b/procps/top.c
index be1c45faa..14a3870a1 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -384,8 +384,8 @@ static void sig_catcher(int sig ATTRIBUTE_UNUSED)
384int top_main(int argc, char **argv) 384int top_main(int argc, char **argv)
385{ 385{
386 int count, lines, col; 386 int count, lines, col;
387 int interval = 5; /* default update rate is 5 seconds */ 387 unsigned interval = 5; /* default update rate is 5 seconds */
388 int iterations = -1; /* 2^32 iterations by default :) */ 388 unsigned iterations = UINT_MAX; /* 2^32 iterations by default :) */
389 char *sinterval, *siterations; 389 char *sinterval, *siterations;
390#ifdef CONFIG_FEATURE_USE_TERMIOS 390#ifdef CONFIG_FEATURE_USE_TERMIOS
391 struct termios new_settings; 391 struct termios new_settings;
@@ -399,8 +399,8 @@ int top_main(int argc, char **argv)
399 opt_complementary = "-"; 399 opt_complementary = "-";
400 getopt32(argc, argv, "d:n:b", 400 getopt32(argc, argv, "d:n:b",
401 &sinterval, &siterations); 401 &sinterval, &siterations);
402 if (option_mask32 & 0x1) interval = atoi(sinterval); // -d 402 if (option_mask32 & 0x1) interval = xatou(sinterval); // -d
403 if (option_mask32 & 0x2) iterations = atoi(siterations); // -n 403 if (option_mask32 & 0x2) iterations = xatou(siterations); // -n
404 //if (option_mask32 & 0x4) // -b 404 //if (option_mask32 & 0x4) // -b
405 405
406 /* change to /proc */ 406 /* change to /proc */
diff --git a/runit/chpst.c b/runit/chpst.c
index 4c44e3c0c..5f30b8815 100644
--- a/runit/chpst.c
+++ b/runit/chpst.c
@@ -22,7 +22,7 @@ static long limitf = -2;
22static long limitc = -2; 22static long limitc = -2;
23static long limitr = -2; 23static long limitr = -2;
24static long limitt = -2; 24static long limitt = -2;
25static long nicelvl; 25static int nicelvl;
26static const char *root; 26static const char *root;
27 27
28static void suidgid(char *user) 28static void suidgid(char *user)
@@ -229,16 +229,16 @@ int chpst_main(int argc, char **argv)
229 // if (option_mask32 & 0x1) // -u 229 // if (option_mask32 & 0x1) // -u
230 // if (option_mask32 & 0x2) // -U 230 // if (option_mask32 & 0x2) // -U
231 // if (option_mask32 & 0x4) // -e 231 // if (option_mask32 & 0x4) // -e
232 if (option_mask32 & 0x8) limits = limitl = limita = limitd = bb_xgetularg10(m); // -m 232 if (option_mask32 & 0x8) limits = limitl = limita = limitd = xatoul(m); // -m
233 if (option_mask32 & 0x10) limitd = bb_xgetularg10(d); // -d 233 if (option_mask32 & 0x10) limitd = xatoul(d); // -d
234 if (option_mask32 & 0x20) limito = bb_xgetularg10(o); // -o 234 if (option_mask32 & 0x20) limito = xatoul(o); // -o
235 if (option_mask32 & 0x40) limitp = bb_xgetularg10(p); // -p 235 if (option_mask32 & 0x40) limitp = xatoul(p); // -p
236 if (option_mask32 & 0x80) limitf = bb_xgetularg10(f); // -f 236 if (option_mask32 & 0x80) limitf = xatoul(f); // -f
237 if (option_mask32 & 0x100) limitc = bb_xgetularg10(c); // -c 237 if (option_mask32 & 0x100) limitc = xatoul(c); // -c
238 if (option_mask32 & 0x200) limitr = bb_xgetularg10(r); // -r 238 if (option_mask32 & 0x200) limitr = xatoul(r); // -r
239 if (option_mask32 & 0x400) limitt = bb_xgetularg10(t); // -t 239 if (option_mask32 & 0x400) limitt = xatoul(t); // -t
240 // if (option_mask32 & 0x800) // -/ 240 // if (option_mask32 & 0x800) // -/
241 if (option_mask32 & 0x1000) nicelvl = bb_xgetlarg_bnd_sfx(n, 10, -20, 20, NULL); // -n 241 if (option_mask32 & 0x1000) nicelvl = xatoi(n); // -n
242 // The below consts should match #defines at top! 242 // The below consts should match #defines at top!
243 //if (option_mask32 & 0x2000) OPT_verbose = 1; // -v 243 //if (option_mask32 & 0x2000) OPT_verbose = 1; // -v
244 //if (option_mask32 & 0x4000) OPT_pgrp = 1; // -P 244 //if (option_mask32 & 0x4000) OPT_pgrp = 1; // -P
@@ -312,17 +312,17 @@ static void softlimit(int argc, char **argv)
312 char *a,*c,*d,*f,*l,*m,*o,*p,*r,*s,*t; 312 char *a,*c,*d,*f,*l,*m,*o,*p,*r,*s,*t;
313 getopt32(argc, argv, "a:c:d:f:l:m:o:p:r:s:t:", 313 getopt32(argc, argv, "a:c:d:f:l:m:o:p:r:s:t:",
314 &a,&c,&d,&f,&l,&m,&o,&p,&r,&s,&t); 314 &a,&c,&d,&f,&l,&m,&o,&p,&r,&s,&t);
315 if (option_mask32 & 0x001) limita = bb_xgetularg10(a); // -a 315 if (option_mask32 & 0x001) limita = xatoul(a); // -a
316 if (option_mask32 & 0x002) limitc = bb_xgetularg10(c); // -c 316 if (option_mask32 & 0x002) limitc = xatoul(c); // -c
317 if (option_mask32 & 0x004) limitd = bb_xgetularg10(d); // -d 317 if (option_mask32 & 0x004) limitd = xatoul(d); // -d
318 if (option_mask32 & 0x008) limitf = bb_xgetularg10(f); // -f 318 if (option_mask32 & 0x008) limitf = xatoul(f); // -f
319 if (option_mask32 & 0x010) limitl = bb_xgetularg10(l); // -l 319 if (option_mask32 & 0x010) limitl = xatoul(l); // -l
320 if (option_mask32 & 0x020) limits = limitl = limita = limitd = bb_xgetularg10(m); // -m 320 if (option_mask32 & 0x020) limits = limitl = limita = limitd = xatoul(m); // -m
321 if (option_mask32 & 0x040) limito = bb_xgetularg10(o); // -o 321 if (option_mask32 & 0x040) limito = xatoul(o); // -o
322 if (option_mask32 & 0x080) limitp = bb_xgetularg10(p); // -p 322 if (option_mask32 & 0x080) limitp = xatoul(p); // -p
323 if (option_mask32 & 0x100) limitr = bb_xgetularg10(r); // -r 323 if (option_mask32 & 0x100) limitr = xatoul(r); // -r
324 if (option_mask32 & 0x200) limits = bb_xgetularg10(s); // -s 324 if (option_mask32 & 0x200) limits = xatoul(s); // -s
325 if (option_mask32 & 0x400) limitt = bb_xgetularg10(t); // -t 325 if (option_mask32 & 0x400) limitt = xatoul(t); // -t
326 argv += optind; 326 argv += optind;
327 if (!argv[0]) bb_show_usage(); 327 if (!argv[0]) bb_show_usage();
328 slimit(); 328 slimit();
diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c
index e629bec5d..f735d9fc1 100644
--- a/sysklogd/klogd.c
+++ b/sysklogd/klogd.c
@@ -43,7 +43,6 @@ int klogd_main(int argc, char **argv)
43 int i, n, lastc; 43 int i, n, lastc;
44 char *start; 44 char *start;
45 45
46
47 { 46 {
48 unsigned opt; 47 unsigned opt;
49 48
@@ -52,7 +51,7 @@ int klogd_main(int argc, char **argv)
52 51
53 if (opt & OPT_LEVEL) { 52 if (opt & OPT_LEVEL) {
54 /* Valid levels are between 1 and 8 */ 53 /* Valid levels are between 1 and 8 */
55 console_log_level = bb_xgetlarg(start, 10, 1, 8); 54 console_log_level = xatoul_range(start, 1, 8);
56 } 55 }
57 56
58 if (!(opt & OPT_FOREGROUND)) { 57 if (!(opt & OPT_FOREGROUND)) {
diff --git a/sysklogd/logger.c b/sysklogd/logger.c
index 15a4bfb82..8901bd79f 100644
--- a/sysklogd/logger.c
+++ b/sysklogd/logger.c
@@ -48,14 +48,14 @@ static int decode(char *name, CODE * codetab)
48 CODE *c; 48 CODE *c;
49 49
50 if (isdigit(*name)) 50 if (isdigit(*name))
51 return (atoi(name)); 51 return atoi(name);
52 for (c = codetab; c->c_name; c++) { 52 for (c = codetab; c->c_name; c++) {
53 if (!strcasecmp(name, c->c_name)) { 53 if (!strcasecmp(name, c->c_name)) {
54 return (c->c_val); 54 return c->c_val;
55 } 55 }
56 } 56 }
57 57
58 return (-1); 58 return -1;
59} 59}
60 60
61/* Decode a symbolic name to a numeric value 61/* Decode a symbolic name to a numeric value
@@ -177,6 +177,3 @@ int logger_main(int argc, char **argv)
177 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 177 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
178 * SUCH DAMAGE. 178 * SUCH DAMAGE.
179 */ 179 */
180
181
182
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 254d7e73c..9e030bd63 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -575,20 +575,20 @@ int syslogd_main(int argc, char **argv)
575 575
576 /* do normal option parsing */ 576 /* do normal option parsing */
577 getopt32(argc, argv, OPTION_STR, OPTION_PARAM); 577 getopt32(argc, argv, OPTION_STR, OPTION_PARAM);
578 if (option_mask32 & OPT_mark) MarkInterval = atoi(opt_m) * 60; // -m 578 if (option_mask32 & OPT_mark) MarkInterval = xatoul_range(opt_m, 0, INT_MAX/60) * 60; // -m
579 //if (option_mask32 & OPT_nofork) // -n 579 //if (option_mask32 & OPT_nofork) // -n
580 //if (option_mask32 & OPT_outfile) // -O 580 //if (option_mask32 & OPT_outfile) // -O
581 if (option_mask32 & OPT_loglevel) { // -l 581 if (option_mask32 & OPT_loglevel) { // -l
582 logLevel = atoi(opt_l); 582 logLevel = xatoi_u(opt_l);
583 /* Valid levels are between 1 and 8 */ 583 /* Valid levels are between 1 and 8 */
584 if (logLevel < 1 || logLevel > 8) 584 if (logLevel < 1 || logLevel > 8)
585 bb_show_usage(); 585 bb_show_usage();
586 } 586 }
587 //if (option_mask32 & OPT_small) // -S 587 //if (option_mask32 & OPT_small) // -S
588#if ENABLE_FEATURE_ROTATE_LOGFILE 588#if ENABLE_FEATURE_ROTATE_LOGFILE
589 if (option_mask32 & OPT_filesize) logFileSize = atoi(opt_s) * 1024; // -s 589 if (option_mask32 & OPT_filesize) logFileSize = xatoul_range(opt_s, 0, INT_MAX/1024) * 1024; // -s
590 if (option_mask32 & OPT_rotatecnt) { // -b 590 if (option_mask32 & OPT_rotatecnt) { // -b
591 logFileRotate = atoi(opt_b); 591 logFileRotate = xatoi_u(opt_b);
592 if (logFileRotate > 99) logFileRotate = 99; 592 if (logFileRotate > 99) logFileRotate = 99;
593 } 593 }
594#endif 594#endif
@@ -598,7 +598,7 @@ int syslogd_main(int argc, char **argv)
598 char *host = xstrdup(opt_R); 598 char *host = xstrdup(opt_R);
599 p = strchr(host, ':'); 599 p = strchr(host, ':');
600 if (p) { 600 if (p) {
601 port = atoi(p + 1); 601 port = xatou16(p + 1);
602 *p = '\0'; 602 *p = '\0';
603 } 603 }
604 remoteaddr.sin_family = AF_INET; 604 remoteaddr.sin_family = AF_INET;
@@ -612,9 +612,7 @@ int syslogd_main(int argc, char **argv)
612#if ENABLE_FEATURE_IPC_SYSLOG 612#if ENABLE_FEATURE_IPC_SYSLOG
613 if (option_mask32 & OPT_circularlog) { // -C 613 if (option_mask32 & OPT_circularlog) { // -C
614 if (opt_C) { 614 if (opt_C) {
615 int buf_size = atoi(opt_C); 615 shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
616 if (buf_size >= 4)
617 shm_size = buf_size * 1024;
618 } 616 }
619 } 617 }
620#endif 618#endif
diff --git a/util-linux/dmesg.c b/util-linux/dmesg.c
index 277415a2d..658cddc38 100644
--- a/util-linux/dmesg.c
+++ b/util-linux/dmesg.c
@@ -19,13 +19,13 @@ int dmesg_main(int argc, char *argv[])
19 int flags = getopt32(argc, argv, "cs:n:", &size, &level); 19 int flags = getopt32(argc, argv, "cs:n:", &size, &level);
20 20
21 if (flags & 4) { 21 if (flags & 4) {
22 if (klogctl(8, NULL, bb_xgetlarg(level, 10, 0, 10))) 22 if (klogctl(8, NULL, xatoul_range(level, 0, 10)))
23 bb_perror_msg_and_die("klogctl"); 23 bb_perror_msg_and_die("klogctl");
24 } else { 24 } else {
25 int len; 25 int len;
26 char *buf; 26 char *buf;
27 27
28 len = (flags & 2) ? bb_xgetlarg(size, 10, 2, INT_MAX) : 16384; 28 len = (flags & 2) ? xatoul_range(size, 2, INT_MAX) : 16384;
29 buf = xmalloc(len); 29 buf = xmalloc(len);
30 if (0 > (len = klogctl(3 + (flags & 1), buf, len))) 30 if (0 > (len = klogctl(3 + (flags & 1), buf, len)))
31 bb_perror_msg_and_die("klogctl"); 31 bb_perror_msg_and_die("klogctl");
diff --git a/util-linux/fbset.c b/util-linux/fbset.c
index bc8ec1806..1aa0a0ac1 100644
--- a/util-linux/fbset.c
+++ b/util-linux/fbset.c
@@ -338,20 +338,20 @@ int fbset_main(int argc, char **argv)
338 modefile = argv[1]; 338 modefile = argv[1];
339 break; 339 break;
340 case CMD_GEOMETRY: 340 case CMD_GEOMETRY:
341 varset.xres = strtoul(argv[1], 0, 0); 341 varset.xres = xatou32(argv[1]);
342 varset.yres = strtoul(argv[2], 0, 0); 342 varset.yres = xatou32(argv[2]);
343 varset.xres_virtual = strtoul(argv[3], 0, 0); 343 varset.xres_virtual = xatou32(argv[3]);
344 varset.yres_virtual = strtoul(argv[4], 0, 0); 344 varset.yres_virtual = xatou32(argv[4]);
345 varset.bits_per_pixel = strtoul(argv[5], 0, 0); 345 varset.bits_per_pixel = xatou32(argv[5]);
346 break; 346 break;
347 case CMD_TIMING: 347 case CMD_TIMING:
348 varset.pixclock = strtoul(argv[1], 0, 0); 348 varset.pixclock = xatou32(argv[1]);
349 varset.left_margin = strtoul(argv[2], 0, 0); 349 varset.left_margin = xatou32(argv[2]);
350 varset.right_margin = strtoul(argv[3], 0, 0); 350 varset.right_margin = xatou32(argv[3]);
351 varset.upper_margin = strtoul(argv[4], 0, 0); 351 varset.upper_margin = xatou32(argv[4]);
352 varset.lower_margin = strtoul(argv[5], 0, 0); 352 varset.lower_margin = xatou32(argv[5]);
353 varset.hsync_len = strtoul(argv[6], 0, 0); 353 varset.hsync_len = xatou32(argv[6]);
354 varset.vsync_len = strtoul(argv[7], 0, 0); 354 varset.vsync_len = xatou32(argv[7]);
355 break; 355 break;
356 case CMD_ALL: 356 case CMD_ALL:
357 g_options |= OPT_ALL; 357 g_options |= OPT_ALL;
@@ -361,13 +361,13 @@ int fbset_main(int argc, char **argv)
361 break; 361 break;
362#ifdef CONFIG_FEATURE_FBSET_FANCY 362#ifdef CONFIG_FEATURE_FBSET_FANCY
363 case CMD_XRES: 363 case CMD_XRES:
364 varset.xres = strtoul(argv[1], 0, 0); 364 varset.xres = xatou32(argv[1]);
365 break; 365 break;
366 case CMD_YRES: 366 case CMD_YRES:
367 varset.yres = strtoul(argv[1], 0, 0); 367 varset.yres = xatou32(argv[1]);
368 break; 368 break;
369 case CMD_DEPTH: 369 case CMD_DEPTH:
370 varset.bits_per_pixel = strtoul(argv[1], 0, 0); 370 varset.bits_per_pixel = xatou32(argv[1]);
371 break; 371 break;
372#endif 372#endif
373 } 373 }
diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
index 85acaa4aa..3bf78ee04 100644
--- a/util-linux/fdisk.c
+++ b/util-linux/fdisk.c
@@ -1222,8 +1222,7 @@ edit_int(int def, char *mesg)
1222 printf(" (%d): ", def); 1222 printf(" (%d): ", def);
1223 if (!read_line()) 1223 if (!read_line())
1224 return def; 1224 return def;
1225 } 1225 } while (!isdigit(*line_ptr));
1226 while (!isdigit(*line_ptr)); /* FIXME: ?!! */
1227 return atoi(line_ptr); 1226 return atoi(line_ptr);
1228} 1227}
1229 1228
@@ -5664,14 +5663,14 @@ int fdisk_main(int argc, char **argv)
5664#ifdef CONFIG_FEATURE_FDISK_BLKSIZE 5663#ifdef CONFIG_FEATURE_FDISK_BLKSIZE
5665 "s" 5664 "s"
5666#endif 5665#endif
5667 )) != -1) { 5666 )) != -1) {
5668 switch (c) { 5667 switch (c) {
5669 case 'b': 5668 case 'b':
5670 /* Ugly: this sector size is really per device, 5669 /* Ugly: this sector size is really per device,
5671 so cannot be combined with multiple disks, 5670 so cannot be combined with multiple disks,
5672 and te same goes for the C/H/S options. 5671 and te same goes for the C/H/S options.
5673 */ 5672 */
5674 sector_size = atoi(optarg); 5673 sector_size = xatoi_u(optarg);
5675 if (sector_size != 512 && sector_size != 1024 && 5674 if (sector_size != 512 && sector_size != 1024 &&
5676 sector_size != 2048) 5675 sector_size != 2048)
5677 bb_show_usage(); 5676 bb_show_usage();
@@ -5679,15 +5678,15 @@ int fdisk_main(int argc, char **argv)
5679 user_set_sector_size = 1; 5678 user_set_sector_size = 1;
5680 break; 5679 break;
5681 case 'C': 5680 case 'C':
5682 user_cylinders = atoi(optarg); 5681 user_cylinders = xatoi_u(optarg);
5683 break; 5682 break;
5684 case 'H': 5683 case 'H':
5685 user_heads = atoi(optarg); 5684 user_heads = xatoi_u(optarg);
5686 if (user_heads <= 0 || user_heads >= 256) 5685 if (user_heads <= 0 || user_heads >= 256)
5687 user_heads = 0; 5686 user_heads = 0;
5688 break; 5687 break;
5689 case 'S': 5688 case 'S':
5690 user_sectors = atoi(optarg); 5689 user_sectors = xatoi_u(optarg);
5691 if (user_sectors <= 0 || user_sectors >= 64) 5690 if (user_sectors <= 0 || user_sectors >= 64)
5692 user_sectors = 0; 5691 user_sectors = 0;
5693 break; 5692 break;
diff --git a/util-linux/hexdump.c b/util-linux/hexdump.c
index e038005f5..03b222dd0 100644
--- a/util-linux/hexdump.c
+++ b/util-linux/hexdump.c
@@ -79,10 +79,10 @@ int hexdump_main(int argc, char **argv)
79 bb_dump_addfile(optarg); 79 bb_dump_addfile(optarg);
80 } /* else */ 80 } /* else */
81 if (ch == 'n') { 81 if (ch == 'n') {
82 bb_dump_length = bb_xgetularg10_bnd(optarg, 0, INT_MAX); 82 bb_dump_length = xatoi_u(optarg);
83 } /* else */ 83 } /* else */
84 if (ch == 's') { 84 if (ch == 's') {
85 bb_dump_skip = bb_xgetularg_bnd_sfx(optarg, 10, 0, LONG_MAX, suffixes); 85 bb_dump_skip = xatoul_range_sfx(optarg, 0, LONG_MAX, suffixes);
86 } /* else */ 86 } /* else */
87 if (ch == 'v') { 87 if (ch == 'v') {
88 bb_dump_vflag = ALL; 88 bb_dump_vflag = ALL;
diff --git a/util-linux/ipcs.c b/util-linux/ipcs.c
index 5e58e81da..ba81ea97c 100644
--- a/util-linux/ipcs.c
+++ b/util-linux/ipcs.c
@@ -581,7 +581,7 @@ int ipcs_main(int argc, char **argv)
581 581
582 opt = getopt32(argc, argv, "i:aqsmtcplu", &opt_i); 582 opt = getopt32(argc, argv, "i:aqsmtcplu", &opt_i);
583 if (opt & 0x1) { // -i 583 if (opt & 0x1) { // -i
584 id = atoi(opt_i); 584 id = xatoi(opt_i);
585 flags |= flag_print; 585 flags |= flag_print;
586 } 586 }
587 if (opt & 0x2) flags |= flag_msg | flag_sem | flag_shm; // -a 587 if (opt & 0x2) flags |= flag_msg | flag_sem | flag_shm; // -a
diff --git a/util-linux/losetup.c b/util-linux/losetup.c
index 8882ee4da..c7eb85a91 100644
--- a/util-linux/losetup.c
+++ b/util-linux/losetup.c
@@ -16,7 +16,7 @@ int losetup_main(int argc, char **argv)
16{ 16{
17 unsigned opt; 17 unsigned opt;
18 char *opt_o; 18 char *opt_o;
19 int offset = 0; 19 unsigned long long offset = 0;
20 20
21 opt = getopt32(argc, argv, "do:", &opt_o); 21 opt = getopt32(argc, argv, "do:", &opt_o);
22 argc -= optind; 22 argc -= optind;
@@ -35,7 +35,7 @@ int losetup_main(int argc, char **argv)
35 } 35 }
36 36
37 if (opt == 0x2) // -o 37 if (opt == 0x2) // -o
38 offset = bb_xparse_number(opt_o, NULL); 38 offset = xatoull(opt_o);
39 39
40 /* -o or no option */ 40 /* -o or no option */
41 41
diff --git a/util-linux/mount.c b/util-linux/mount.c
index 141517ba0..531fb4520 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -856,7 +856,7 @@ static int nfsmount(struct mntent *mp, int vfsflags, char *filteropts)
856 for (opt = strtok(filteropts, ","); opt; opt = strtok(NULL, ",")) { 856 for (opt = strtok(filteropts, ","); opt; opt = strtok(NULL, ",")) {
857 char *opteq = strchr(opt, '='); 857 char *opteq = strchr(opt, '=');
858 if (opteq) { 858 if (opteq) {
859 int val = atoi(opteq + 1); 859 int val = xatoi_u(opteq + 1);
860 *opteq = '\0'; 860 *opteq = '\0';
861 if (!strcmp(opt, "rsize")) 861 if (!strcmp(opt, "rsize"))
862 data.rsize = val; 862 data.rsize = val;
diff --git a/util-linux/readprofile.c b/util-linux/readprofile.c
index ff70bf79b..b368067ef 100644
--- a/util-linux/readprofile.c
+++ b/util-linux/readprofile.c
@@ -38,8 +38,8 @@
38#define S_LEN 128 38#define S_LEN 128
39 39
40/* These are the defaults */ 40/* These are the defaults */
41static const char defaultmap[]="/boot/System.map"; 41static const char defaultmap[] = "/boot/System.map";
42static const char defaultpro[]="/proc/profile"; 42static const char defaultpro[] = "/proc/profile";
43 43
44int readprofile_main(int argc, char **argv) 44int readprofile_main(int argc, char **argv)
45{ 45{
@@ -78,7 +78,7 @@ int readprofile_main(int argc, char **argv)
78 * not sizeof(int), the multiplier is not changed 78 * not sizeof(int), the multiplier is not changed
79 */ 79 */
80 if (mult) { 80 if (mult) {
81 multiplier = strtoul(mult, 0, 10); 81 multiplier = xatoi_u(mult);
82 to_write = sizeof(int); 82 to_write = sizeof(int);
83 } else { 83 } else {
84 multiplier = 0; 84 multiplier = 0;