aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-10-14 02:23:43 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-10-14 02:23:43 +0000
commit9e617927e057d79ceb2ac4869b18b1e84567dc68 (patch)
tree37b7584ae40b99edb5583fbc4392b62ffdadf278
parent6147e0907e5b5e3a07a4c8976097a585faaa3895 (diff)
downloadbusybox-w32-9e617927e057d79ceb2ac4869b18b1e84567dc68.tar.gz
busybox-w32-9e617927e057d79ceb2ac4869b18b1e84567dc68.tar.bz2
busybox-w32-9e617927e057d79ceb2ac4869b18b1e84567dc68.zip
add open_read_close() and similar stuff
git-svn-id: svn://busybox.net/trunk/busybox@16377 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r--archival/libunarchive/get_header_ar.c2
-rw-r--r--archival/libunarchive/open_transformer.c16
-rw-r--r--archival/tar.c2
-rw-r--r--coreutils/diff.c6
-rw-r--r--editors/vi.c6
-rw-r--r--include/libbb.h23
-rw-r--r--init/init.c2
-rw-r--r--libbb/Kbuild4
-rw-r--r--libbb/full_read.c42
-rw-r--r--libbb/procps.c10
-rw-r--r--libbb/read.c133
-rw-r--r--libbb/safe_read.c26
-rw-r--r--libbb/xfuncs.c32
-rw-r--r--loginutils/deluser.c2
-rw-r--r--miscutils/crond.c4
-rw-r--r--miscutils/crontab.c2
-rw-r--r--miscutils/makedevs.c4
-rw-r--r--miscutils/nmeter.c14
-rw-r--r--modutils/insmod.c4
-rw-r--r--modutils/lsmod.c8
-rw-r--r--modutils/modprobe.c31
-rw-r--r--networking/fakeidentd.c2
-rw-r--r--networking/ftpgetput.c2
-rw-r--r--networking/inetd.c2
-rw-r--r--networking/libiproute/libnetlink.c2
-rw-r--r--networking/netstat.c8
-rw-r--r--networking/traceroute.c8
-rw-r--r--networking/udhcp/arpping.c2
-rw-r--r--networking/udhcp/clientpacket.c7
-rw-r--r--networking/udhcp/options.c2
-rw-r--r--networking/udhcp/signalpipe.c2
-rw-r--r--networking/wget.c4
-rw-r--r--procps/fuser.c4
-rw-r--r--procps/top.c2
-rw-r--r--shell/msh.c6
-rw-r--r--util-linux/hwclock.c8
-rw-r--r--util-linux/mdev.c4
-rw-r--r--util-linux/readprofile.c24
38 files changed, 228 insertions, 234 deletions
diff --git a/archival/libunarchive/get_header_ar.c b/archival/libunarchive/get_header_ar.c
index 7372ada32..b91c6f97d 100644
--- a/archival/libunarchive/get_header_ar.c
+++ b/archival/libunarchive/get_header_ar.c
@@ -79,7 +79,7 @@ char get_header_ar(archive_handle_t *archive_handle)
79 (saved in variable long_name) that conatains the real filename */ 79 (saved in variable long_name) that conatains the real filename */
80 const unsigned int long_offset = atoi(&ar.formatted.name[1]); 80 const unsigned int long_offset = atoi(&ar.formatted.name[1]);
81 if (long_offset >= ar_long_name_size) { 81 if (long_offset >= ar_long_name_size) {
82 bb_error_msg_and_die("Cant resolve long filename"); 82 bb_error_msg_and_die("can't resolve long filename");
83 } 83 }
84 typed->name = xstrdup(ar_long_names + long_offset); 84 typed->name = xstrdup(ar_long_names + long_offset);
85 } 85 }
diff --git a/archival/libunarchive/open_transformer.c b/archival/libunarchive/open_transformer.c
index 99e71ec2e..456d3e986 100644
--- a/archival/libunarchive/open_transformer.c
+++ b/archival/libunarchive/open_transformer.c
@@ -18,23 +18,23 @@ int open_transformer(int src_fd,
18 int pid; 18 int pid;
19 19
20 if (pipe(fd_pipe) != 0) { 20 if (pipe(fd_pipe) != 0) {
21 bb_perror_msg_and_die("Can't create pipe"); 21 bb_perror_msg_and_die("can't create pipe");
22 } 22 }
23 23
24 pid = fork(); 24 pid = fork();
25 if (pid == -1) { 25 if (pid == -1) {
26 bb_perror_msg_and_die("Fork failed"); 26 bb_perror_msg_and_die("fork failed");
27 } 27 }
28 28
29 if (pid == 0) { 29 if (pid == 0) {
30 /* child process */ 30 /* child process */
31 close(fd_pipe[0]); /* We don't wan't to read from the parent */ 31 close(fd_pipe[0]); /* We don't wan't to read from the parent */
32 // FIXME: error check? 32 // FIXME: error check?
33 transformer(src_fd, fd_pipe[1]); 33 transformer(src_fd, fd_pipe[1]);
34 close(fd_pipe[1]); /* Send EOF */ 34 close(fd_pipe[1]); /* Send EOF */
35 close(src_fd); 35 close(src_fd);
36 exit(0); 36 exit(0);
37 /* notreached */ 37 /* notreached */
38 } 38 }
39 39
40 /* parent process */ 40 /* parent process */
diff --git a/archival/tar.c b/archival/tar.c
index 5935ccaa3..2c4280cc4 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -457,7 +457,7 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
457 457
458 if (n == 0 && vfork_exec_errno != 0) { 458 if (n == 0 && vfork_exec_errno != 0) {
459 errno = vfork_exec_errno; 459 errno = vfork_exec_errno;
460 bb_perror_msg_and_die("Could not exec %s", zip_exec); 460 bb_perror_msg_and_die("cannot exec %s", zip_exec);
461 } else if ((n < 0) && (errno == EAGAIN || errno == EINTR)) 461 } else if ((n < 0) && (errno == EAGAIN || errno == EINTR))
462 continue; /* try it again */ 462 continue; /* try it again */
463 break; 463 break;
diff --git a/coreutils/diff.c b/coreutils/diff.c
index 65757d7d1..2915d4009 100644
--- a/coreutils/diff.c
+++ b/coreutils/diff.c
@@ -1202,7 +1202,7 @@ int diff_main(int argc, char **argv)
1202 * driver routine. Both drivers use the contents of stb1 and stb2. 1202 * driver routine. Both drivers use the contents of stb1 and stb2.
1203 */ 1203 */
1204 if (argc < 2) { 1204 if (argc < 2) {
1205 bb_error_msg("Missing filename"); 1205 bb_error_msg("missing filename");
1206 bb_show_usage(); 1206 bb_show_usage();
1207 } 1207 }
1208 if (strcmp(argv[0], "-") == 0) { 1208 if (strcmp(argv[0], "-") == 0) {
@@ -1216,12 +1216,12 @@ int diff_main(int argc, char **argv)
1216 } else 1216 } else
1217 xstat(argv[1], &stb2); 1217 xstat(argv[1], &stb2);
1218 if (gotstdin && (S_ISDIR(stb1.st_mode) || S_ISDIR(stb2.st_mode))) 1218 if (gotstdin && (S_ISDIR(stb1.st_mode) || S_ISDIR(stb2.st_mode)))
1219 bb_error_msg_and_die("Can't compare - to a directory"); 1219 bb_error_msg_and_die("can't compare - to a directory");
1220 if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) { 1220 if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) {
1221#if ENABLE_FEATURE_DIFF_DIR 1221#if ENABLE_FEATURE_DIFF_DIR
1222 diffdir(argv[0], argv[1]); 1222 diffdir(argv[0], argv[1]);
1223#else 1223#else
1224 bb_error_msg_and_die("Directory comparison not supported"); 1224 bb_error_msg_and_die("directory comparison not supported");
1225#endif 1225#endif
1226 } else { 1226 } else {
1227 if (S_ISDIR(stb1.st_mode)) { 1227 if (S_ISDIR(stb1.st_mode)) {
diff --git a/editors/vi.c b/editors/vi.c
index fa30cf29c..a25e96657 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -2353,7 +2353,7 @@ static int file_insert(Byte * fn, Byte * p, int size)
2353#endif 2353#endif
2354 fd = open((char *) fn, O_RDONLY); // try read-only 2354 fd = open((char *) fn, O_RDONLY); // try read-only
2355 if (fd < 0) { 2355 if (fd < 0) {
2356 psbs("\"%s\" %s", fn, "could not open file"); 2356 psbs("\"%s\" %s", fn, "cannot open file");
2357 goto fi0; 2357 goto fi0;
2358 } 2358 }
2359#ifdef CONFIG_FEATURE_VI_READONLY 2359#ifdef CONFIG_FEATURE_VI_READONLY
@@ -2367,11 +2367,11 @@ static int file_insert(Byte * fn, Byte * p, int size)
2367 if (cnt < 0) { 2367 if (cnt < 0) {
2368 cnt = -1; 2368 cnt = -1;
2369 p = text_hole_delete(p, p + size - 1); // un-do buffer insert 2369 p = text_hole_delete(p, p + size - 1); // un-do buffer insert
2370 psbs("could not read file \"%s\"", fn); 2370 psbs("cannot read file \"%s\"", fn);
2371 } else if (cnt < size) { 2371 } else if (cnt < size) {
2372 // There was a partial read, shrink unused space text[] 2372 // There was a partial read, shrink unused space text[]
2373 p = text_hole_delete(p + cnt, p + (size - cnt) - 1); // un-do buffer insert 2373 p = text_hole_delete(p + cnt, p + (size - cnt) - 1); // un-do buffer insert
2374 psbs("could not read all of file \"%s\"", fn); 2374 psbs("cannot read all of file \"%s\"", fn);
2375 } 2375 }
2376 if (cnt >= size) 2376 if (cnt >= size)
2377 file_modified++; 2377 file_modified++;
diff --git a/include/libbb.h b/include/libbb.h
index 767a3378b..0bcabf17b 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -205,12 +205,22 @@ extern int is_directory(const char *name, int followLinks, struct stat *statBuf)
205extern DIR *warn_opendir(const char *path); 205extern DIR *warn_opendir(const char *path);
206extern DIR *xopendir(const char *path); 206extern DIR *xopendir(const char *path);
207 207
208extern int remove_file(const char *path, int flags);
209extern int copy_file(const char *source, const char *dest, int flags);
210extern ssize_t safe_read(int fd, void *buf, size_t count); 208extern ssize_t safe_read(int fd, void *buf, size_t count);
211extern ssize_t full_read(int fd, void *buf, size_t len); 209extern ssize_t full_read(int fd, void *buf, size_t count);
210extern void xread(int fd, void *buf, size_t count);
211extern unsigned char xread_char(int fd);
212extern char *reads(int fd, char *buf, size_t count);
213ssize_t read_close(int fd, void *buf, size_t count);
214ssize_t open_read_close(const char *filename, void *buf, size_t count);
215void *xmalloc_open_read_close(const char *filename, size_t *sizep);
216
212extern ssize_t safe_write(int fd, const void *buf, size_t count); 217extern ssize_t safe_write(int fd, const void *buf, size_t count);
213extern ssize_t full_write(int fd, const void *buf, size_t len); 218extern ssize_t full_write(int fd, const void *buf, size_t count);
219extern void xwrite(int fd, void *buf, size_t count);
220
221extern int remove_file(const char *path, int flags);
222extern int copy_file(const char *source, const char *dest, int flags);
223
214extern int recursive_action(const char *fileName, int recurse, 224extern int recursive_action(const char *fileName, int recurse,
215 int followLinks, int depthFirst, 225 int followLinks, int depthFirst,
216 int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData), 226 int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData),
@@ -592,10 +602,7 @@ extern int obscure(const char *old, const char *newval, const struct passwd *pwd
592extern void xsetenv(const char *key, const char *value); 602extern void xsetenv(const char *key, const char *value);
593extern int xopen(const char *pathname, int flags); 603extern int xopen(const char *pathname, int flags);
594extern int xopen3(const char *pathname, int flags, int mode); 604extern int xopen3(const char *pathname, int flags, int mode);
595extern void xread(int fd, void *buf, size_t count); 605extern off_t xlseek(int fd, off_t offset, int whence);
596extern unsigned char xread_char(int fd);
597extern void xlseek(int fd, off_t offset, int whence);
598extern void xwrite(int fd, void *buf, size_t count);
599 606
600extern const char bb_uuenc_tbl_base64[]; 607extern const char bb_uuenc_tbl_base64[];
601extern const char bb_uuenc_tbl_std[]; 608extern const char bb_uuenc_tbl_std[];
diff --git a/init/init.c b/init/init.c
index 8257b7fb0..99a11e526 100644
--- a/init/init.c
+++ b/init/init.c
@@ -561,7 +561,7 @@ static pid_t run(const struct init_action *a)
561 execv(cmdpath, cmd); 561 execv(cmdpath, cmd);
562 562
563 /* We're still here? Some error happened. */ 563 /* We're still here? Some error happened. */
564 message(LOG | CONSOLE, "Bummer, could not run '%s': %m", cmdpath); 564 message(LOG | CONSOLE, "Bummer, cannot run '%s': %m", cmdpath);
565 _exit(-1); 565 _exit(-1);
566 } 566 }
567 sigprocmask(SIG_SETMASK, &omask, NULL); 567 sigprocmask(SIG_SETMASK, &omask, NULL);
diff --git a/libbb/Kbuild b/libbb/Kbuild
index 27ed68c2c..3b16f5c45 100644
--- a/libbb/Kbuild
+++ b/libbb/Kbuild
@@ -9,7 +9,7 @@ lib-y:= \
9 compare_string_array.o concat_path_file.o copy_file.o copyfd.o \ 9 compare_string_array.o concat_path_file.o copy_file.o copyfd.o \
10 crc32.o create_icmp_socket.o create_icmp6_socket.o \ 10 crc32.o create_icmp_socket.o create_icmp6_socket.o \
11 device_open.o dump.o error_msg.o error_msg_and_die.o \ 11 device_open.o dump.o error_msg.o error_msg_and_die.o \
12 find_pid_by_name.o find_root_device.o fgets_str.o full_read.o \ 12 find_pid_by_name.o find_root_device.o fgets_str.o \
13 full_write.o get_last_path_component.o get_line_from_file.o \ 13 full_write.o get_last_path_component.o get_line_from_file.o \
14 herror_msg.o herror_msg_and_die.o \ 14 herror_msg.o herror_msg_and_die.o \
15 human_readable.o inet_common.o inode_hash.o isdirectory.o \ 15 human_readable.o inet_common.o inode_hash.o isdirectory.o \
@@ -19,7 +19,7 @@ lib-y:= \
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 \
22 restricted_shell.o run_parts.o run_shell.o safe_read.o safe_write.o \ 22 restricted_shell.o run_parts.o run_shell.o read.o safe_write.o \
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 \
diff --git a/libbb/full_read.c b/libbb/full_read.c
deleted file mode 100644
index 068d16698..000000000
--- a/libbb/full_read.c
+++ /dev/null
@@ -1,42 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10#include <stdio.h>
11#include <unistd.h>
12#include "libbb.h"
13
14/*
15 * Read all of the supplied buffer from a file.
16 * This does multiple reads as necessary.
17 * Returns the amount read, or -1 on an error.
18 * A short read is returned on an end of file.
19 */
20ssize_t full_read(int fd, void *buf, size_t len)
21{
22 ssize_t cc;
23 ssize_t total;
24
25 total = 0;
26
27 while (len) {
28 cc = safe_read(fd, buf, len);
29
30 if (cc < 0)
31 return cc; /* read() returns -1 on failure. */
32
33 if (cc == 0)
34 break;
35
36 buf = ((char *)buf) + cc;
37 total += cc;
38 len -= cc;
39 }
40
41 return total;
42}
diff --git a/libbb/procps.c b/libbb/procps.c
index 2bcd2cced..eba90705c 100644
--- a/libbb/procps.c
+++ b/libbb/procps.c
@@ -22,15 +22,9 @@
22 22
23static int read_to_buf(const char *filename, void *buf) 23static int read_to_buf(const char *filename, void *buf)
24{ 24{
25 int fd;
26 ssize_t ret; 25 ssize_t ret;
27 26 ret = open_read_close(filename, buf, PROCPS_BUFSIZE-1);
28 fd = open(filename, O_RDONLY); 27 ((char *)buf)[ret > 0 ? ret : 0] = '\0';
29 if (fd < 0)
30 return -1;
31 ret = read(fd, buf, PROCPS_BUFSIZE-1);
32 ((char *)buf)[ret > 0 ? ret : 0] = 0;
33 close(fd);
34 return ret; 28 return ret;
35} 29}
36 30
diff --git a/libbb/read.c b/libbb/read.c
new file mode 100644
index 000000000..1c2945f45
--- /dev/null
+++ b/libbb/read.c
@@ -0,0 +1,133 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10#include "libbb.h"
11
12ssize_t safe_read(int fd, void *buf, size_t count)
13{
14 ssize_t n;
15
16 do {
17 n = read(fd, buf, count);
18 } while (n < 0 && errno == EINTR);
19
20 return n;
21}
22
23/*
24 * Read all of the supplied buffer from a file.
25 * This does multiple reads as necessary.
26 * Returns the amount read, or -1 on an error.
27 * A short read is returned on an end of file.
28 */
29ssize_t full_read(int fd, void *buf, size_t len)
30{
31 ssize_t cc;
32 ssize_t total;
33
34 total = 0;
35
36 while (len) {
37 cc = safe_read(fd, buf, len);
38
39 if (cc < 0)
40 return cc; /* read() returns -1 on failure. */
41
42 if (cc == 0)
43 break;
44
45 buf = ((char *)buf) + cc;
46 total += cc;
47 len -= cc;
48 }
49
50 return total;
51}
52
53// Die with an error message if we can't read the entire buffer.
54void xread(int fd, void *buf, size_t count)
55{
56 if (count) {
57 ssize_t size = full_read(fd, buf, count);
58 if (size != count)
59 bb_error_msg_and_die("short read");
60 }
61}
62
63// Die with an error message if we can't read one character.
64unsigned char xread_char(int fd)
65{
66 char tmp;
67
68 xread(fd, &tmp, 1);
69
70 return tmp;
71}
72
73// Read one line a-la fgets. Works only on seekable streams
74char *reads(int fd, char *buffer, size_t size)
75{
76 char *p;
77
78 if (size < 2)
79 return NULL;
80 size = full_read(fd, buffer, size-1);
81 if ((ssize_t)size <= 0)
82 return NULL;
83
84 buffer[size] = '\0';
85 p = strchr(buffer, '\n');
86 if (p) {
87 off_t offset;
88 *p++ = '\0';
89 offset = (p-buffer) - size;
90 // set fd position the right after the \n
91 if (offset && lseek(fd, offset, SEEK_CUR) == (off_t)-1)
92 return NULL;
93 }
94 return buffer;
95}
96
97ssize_t read_close(int fd, void *buf, size_t size)
98{
99 int e;
100 size = full_read(fd, buf, size);
101 e = errno;
102 close(fd);
103 errno = e;
104 return size;
105}
106
107ssize_t open_read_close(const char *filename, void *buf, size_t size)
108{
109 int fd = open(filename, O_RDONLY);
110 if (fd < 0)
111 return fd;
112 return read_close(fd, buf, size);
113}
114
115void *xmalloc_open_read_close(const char *filename, size_t *sizep)
116{
117 char *buf;
118 size_t size = sizep ? *sizep : INT_MAX;
119 int fd = xopen(filename, O_RDONLY);
120 off_t len = xlseek(fd, 0, SEEK_END);
121 xlseek(fd, 0, SEEK_SET);
122
123 if (len > size)
124 bb_error_msg_and_die("file '%s' is too big", filename);
125 size = len;
126 buf = xmalloc(size+1);
127 size = read_close(fd, buf, size);
128 if ((ssize_t)size < 0)
129 bb_perror_msg_and_die("'%s'", filename);
130 buf[size] = '\0';
131 if (sizep) *sizep = size;
132 return buf;
133}
diff --git a/libbb/safe_read.c b/libbb/safe_read.c
deleted file mode 100644
index a59934a4d..000000000
--- a/libbb/safe_read.c
+++ /dev/null
@@ -1,26 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10#include <stdio.h>
11#include <errno.h>
12#include <unistd.h>
13#include "libbb.h"
14
15
16
17ssize_t safe_read(int fd, void *buf, size_t count)
18{
19 ssize_t n;
20
21 do {
22 n = read(fd, buf, count);
23 } while (n < 0 && errno == EINTR);
24
25 return n;
26}
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index efc919491..0a5abb878 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -95,7 +95,7 @@ int xopen(const char *pathname, int flags)
95 if (ENABLE_DEBUG && (flags & O_CREAT)) 95 if (ENABLE_DEBUG && (flags & O_CREAT))
96 bb_error_msg_and_die("xopen() with O_CREAT"); 96 bb_error_msg_and_die("xopen() with O_CREAT");
97 97
98 return xopen3(pathname, flags, 0777); 98 return xopen3(pathname, flags, 0666);
99} 99}
100 100
101// Die if we can't open a new file and return an fd. 101// Die if we can't open a new file and return an fd.
@@ -110,16 +110,6 @@ int xopen3(const char *pathname, int flags, int mode)
110 return ret; 110 return ret;
111} 111}
112 112
113// Die with an error message if we can't read the entire buffer.
114void xread(int fd, void *buf, size_t count)
115{
116 if (count) {
117 ssize_t size = full_read(fd, buf, count);
118 if (size != count)
119 bb_error_msg_and_die("short read");
120 }
121}
122
123// Die with an error message if we can't write the entire buffer. 113// Die with an error message if we can't write the entire buffer.
124void xwrite(int fd, void *buf, size_t count) 114void xwrite(int fd, void *buf, size_t count)
125{ 115{
@@ -131,20 +121,12 @@ void xwrite(int fd, void *buf, size_t count)
131} 121}
132 122
133// Die with an error message if we can't lseek to the right spot. 123// Die with an error message if we can't lseek to the right spot.
134void xlseek(int fd, off_t offset, int whence) 124off_t xlseek(int fd, off_t offset, int whence)
135{ 125{
136 if (offset != lseek(fd, offset, whence)) 126 off_t off = lseek(fd, offset, whence);
137 bb_error_msg_and_die("lseek"); 127 if (off == (off_t)-1)
138} 128 bb_perror_msg_and_die("lseek");
139 129 return off;
140// Die with an error message if we can't read one character.
141unsigned char xread_char(int fd)
142{
143 char tmp;
144
145 xread(fd, &tmp, 1);
146
147 return tmp;
148} 130}
149 131
150// Die with supplied error message if this FILE * has ferror set. 132// Die with supplied error message if this FILE * has ferror set.
@@ -309,7 +291,7 @@ off_t fdlength(int fd)
309 291
310 // If we can read from the current location, it's bigger. 292 // If we can read from the current location, it's bigger.
311 293
312 if (lseek(fd, pos, 0)>=0 && safe_read(fd, &temp, 1)==1) { 294 if (lseek(fd, pos, SEEK_SET)>=0 && safe_read(fd, &temp, 1)==1) {
313 if (bottom == top) bottom = top = (top+1) * 2; 295 if (bottom == top) bottom = top = (top+1) * 2;
314 else bottom = pos; 296 else bottom = pos;
315 297
diff --git a/loginutils/deluser.c b/loginutils/deluser.c
index f4320687e..bbbd77dbd 100644
--- a/loginutils/deluser.c
+++ b/loginutils/deluser.c
@@ -70,7 +70,7 @@ static void del_line_matching(const char *login, const char *filename)
70 fclose(passwd); 70 fclose(passwd);
71 } 71 }
72 } else { 72 } else {
73 bb_error_msg("Can't find '%s' in '%s'", login, filename); 73 bb_error_msg("can't find '%s' in '%s'", login, filename);
74 } 74 }
75 free(buffer); 75 free(buffer);
76 } 76 }
diff --git a/miscutils/crond.c b/miscutils/crond.c
index 623e8c359..eaed1ea69 100644
--- a/miscutils/crond.c
+++ b/miscutils/crond.c
@@ -120,7 +120,7 @@ static void crondlog(const char *ctl, ...)
120 close(logfd); 120 close(logfd);
121#if ENABLE_DEBUG_CROND_OPTION 121#if ENABLE_DEBUG_CROND_OPTION
122 } else { 122 } else {
123 bb_perror_msg("Can't open log file"); 123 bb_perror_msg("can't open log file");
124#endif 124#endif
125 } 125 }
126 } 126 }
@@ -924,7 +924,7 @@ static void RunJob(const char *user, CronLine * line)
924 line->cl_MailFlag = 1; 924 line->cl_MailFlag = 1;
925 fdprintf(mailFd, "To: %s\nSubject: cron: %s\n\n", user, 925 fdprintf(mailFd, "To: %s\nSubject: cron: %s\n\n", user,
926 line->cl_Shell); 926 line->cl_Shell);
927 line->cl_MailPos = lseek(mailFd, 0, 1); 927 line->cl_MailPos = lseek(mailFd, 0, SEEK_CUR);
928 } else { 928 } else {
929 crondlog("\024unable to create mail file user %s file %s, output to /dev/null\n", user, mailFile); 929 crondlog("\024unable to create mail file user %s file %s, output to /dev/null\n", user, mailFile);
930 } 930 }
diff --git a/miscutils/crontab.c b/miscutils/crontab.c
index a3bfd495d..6ae1b020c 100644
--- a/miscutils/crontab.c
+++ b/miscutils/crontab.c
@@ -171,7 +171,7 @@ int crontab_main(int ac, char **av)
171 } 171 }
172 EditFile(caller, tmp); 172 EditFile(caller, tmp);
173 remove(tmp); 173 remove(tmp);
174 lseek(fd, 0L, 0); 174 lseek(fd, 0L, SEEK_SET);
175 repFd = fd; 175 repFd = fd;
176 } 176 }
177 option = REPLACE; 177 option = REPLACE;
diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c
index e4658010c..6ff5cc223 100644
--- a/miscutils/makedevs.c
+++ b/miscutils/makedevs.c
@@ -187,7 +187,7 @@ int makedevs_main(int argc, char **argv)
187 sprintf(full_name_inc, "%s%d", full_name, i); 187 sprintf(full_name_inc, "%s%d", full_name, i);
188 rdev = (major << 8) + minor + (i * increment - start); 188 rdev = (major << 8) + minor + (i * increment - start);
189 if (mknod(full_name_inc, mode, rdev) == -1) { 189 if (mknod(full_name_inc, mode, rdev) == -1) {
190 bb_perror_msg("line %d: could not create node %s", linenum, full_name_inc); 190 bb_perror_msg("line %d: cannot create node %s", linenum, full_name_inc);
191 ret = EXIT_FAILURE; 191 ret = EXIT_FAILURE;
192 } 192 }
193 else if (chown(full_name_inc, uid, gid) == -1) { 193 else if (chown(full_name_inc, uid, gid) == -1) {
@@ -203,7 +203,7 @@ int makedevs_main(int argc, char **argv)
203 } else { 203 } else {
204 rdev = (major << 8) + minor; 204 rdev = (major << 8) + minor;
205 if (mknod(full_name, mode, rdev) == -1) { 205 if (mknod(full_name, mode, rdev) == -1) {
206 bb_perror_msg("line %d: could not create node %s", linenum, full_name); 206 bb_perror_msg("line %d: cannot create node %s", linenum, full_name);
207 ret = EXIT_FAILURE; 207 ret = EXIT_FAILURE;
208 } 208 }
209 else if (chown(full_name, uid, gid) == -1) { 209 else if (chown(full_name, uid, gid) == -1) {
diff --git a/miscutils/nmeter.c b/miscutils/nmeter.c
index e83de38ec..d71bd6add 100644
--- a/miscutils/nmeter.c
+++ b/miscutils/nmeter.c
@@ -88,12 +88,7 @@ static void put_question_marks(int count)
88 88
89static int readfile_z(char *buf, int sz, const char* fname) 89static int readfile_z(char *buf, int sz, const char* fname)
90{ 90{
91 int fd; 91 sz = open_read_close(fname, buf, sz-1);
92 fd = xopen(fname, O_RDONLY);
93 // We are not checking for short reads (valid only because
94 // we are reading /proc files)
95 sz = read(fd, buf, sz-1);
96 close(fd);
97 if (sz < 0) { 92 if (sz < 0) {
98 buf[0] = '\0'; 93 buf[0] = '\0';
99 return 1; 94 return 1;
@@ -776,15 +771,12 @@ int nmeter_main(int argc, char* argv[])
776 s_stat *last = NULL; 771 s_stat *last = NULL;
777 s_stat *s; 772 s_stat *s;
778 char *cur, *prev; 773 char *cur, *prev;
779 int fd;
780 774
781 if (argc != 2) 775 if (argc != 2)
782 bb_show_usage(); 776 bb_show_usage();
783 777
784 fd = xopen("/proc/version", O_RDONLY); 778 if (open_read_close("/proc/version", buf, sizeof(buf)) > 0)
785 if (read(fd, buf, sizeof(buf)) > 0) 779 is26 = (strstr(buf, " 2.4.")==NULL);
786 is26 = (strstr(buf, "Linux version 2.4.")==NULL);
787 close(fd);
788 780
789 // Can use argv[1] directly, but this will mess up 781 // Can use argv[1] directly, but this will mess up
790 // parameters as seen by e.g. ps. Making a copy... 782 // parameters as seen by e.g. ps. Making a copy...
diff --git a/modutils/insmod.c b/modutils/insmod.c
index 3d9add19a..882fcf80f 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -4186,10 +4186,10 @@ int insmod_main( int argc, char **argv)
4186 m_addr = create_module(m_name, m_size); 4186 m_addr = create_module(m_name, m_size);
4187 if (m_addr == -1) switch (errno) { 4187 if (m_addr == -1) switch (errno) {
4188 case EEXIST: 4188 case EEXIST:
4189 bb_error_msg("A module named %s already exists", m_name); 4189 bb_error_msg("a module named %s already exists", m_name);
4190 goto out; 4190 goto out;
4191 case ENOMEM: 4191 case ENOMEM:
4192 bb_error_msg("Can't allocate kernel memory for module; needed %lu bytes", 4192 bb_error_msg("can't allocate kernel memory for module; needed %lu bytes",
4193 m_size); 4193 m_size);
4194 goto out; 4194 goto out;
4195 default: 4195 default:
diff --git a/modutils/lsmod.c b/modutils/lsmod.c
index ac1cded2b..2bf4afbe9 100644
--- a/modutils/lsmod.c
+++ b/modutils/lsmod.c
@@ -147,9 +147,8 @@ int lsmod_main(int argc, char **argv)
147 check_tainted(); 147 check_tainted();
148#if defined(CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT) 148#if defined(CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT)
149 { 149 {
150 char line[4096]; 150 char *line;
151 151 while ((line = xmalloc_fgets(file)) != NULL) {
152 while (fgets(line, sizeof(line), file)) {
153 char *tok; 152 char *tok;
154 153
155 tok = strtok(line, " \t"); 154 tok = strtok(line, " \t");
@@ -175,7 +174,8 @@ int lsmod_main(int argc, char **argv)
175 tok = ""; 174 tok = "";
176 printf(" %s", tok); 175 printf(" %s", tok);
177 } 176 }
178 printf("\n"); 177 puts("");
178 free(line);
179 } 179 }
180 fclose(file); 180 fclose(file);
181 } 181 }
diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index b629390e4..ab595c847 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -93,35 +93,6 @@ static int parse_tag_value ( char *buffer, char **ptag, char **pvalue )
93 return 1; 93 return 1;
94} 94}
95 95
96/* Jump through hoops to simulate how fgets() grabs just one line at a
97 * time... Don't use any stdio since modprobe gets called from a kernel
98 * thread and stdio junk can overflow the limited stack...
99 */
100static char *reads ( int fd, char *buffer, size_t len )
101{
102 int n = read ( fd, buffer, len );
103
104 if ( n > 0 ) {
105 char *p;
106
107 buffer [len-1] = 0;
108 p = strchr ( buffer, '\n' );
109
110 if ( p ) {
111 off_t offset;
112
113 offset = lseek ( fd, 0L, SEEK_CUR ); // Get the current file descriptor offset
114 lseek ( fd, offset-n + (p-buffer) + 1, SEEK_SET ); // Set the file descriptor offset to right after the \n
115
116 p[1] = 0;
117 }
118 return buffer;
119 }
120
121 else
122 return 0;
123}
124
125/* 96/*
126 * This function appends an option to a list 97 * This function appends an option to a list
127 */ 98 */
@@ -913,7 +884,7 @@ int modprobe_main(int argc, char** argv)
913 depend = build_dep ( ); 884 depend = build_dep ( );
914 885
915 if ( !depend ) 886 if ( !depend )
916 bb_error_msg_and_die ( "could not parse modules.dep" ); 887 bb_error_msg_and_die ( "cannot parse modules.dep" );
917 888
918 if (remove_opt) { 889 if (remove_opt) {
919 do { 890 do {
diff --git a/networking/fakeidentd.c b/networking/fakeidentd.c
index c8d32765a..18e86c50b 100644
--- a/networking/fakeidentd.c
+++ b/networking/fakeidentd.c
@@ -140,7 +140,7 @@ static int godaemon(void)
140 case 0: 140 case 0:
141 pw = getpwnam(nobodystr); 141 pw = getpwnam(nobodystr);
142 if (pw == NULL) 142 if (pw == NULL)
143 bb_error_msg_and_die("Cannot find uid/gid of user '%s'", nobodystr); 143 bb_error_msg_and_die("cannot find uid/gid of user '%s'", nobodystr);
144 nobody = pw->pw_uid; 144 nobody = pw->pw_uid;
145 nogrp = pw->pw_gid; 145 nogrp = pw->pw_gid;
146 writepid(nobody, nogrp); 146 writepid(nobody, nogrp);
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c
index 47126ee83..aafeaf6e9 100644
--- a/networking/ftpgetput.c
+++ b/networking/ftpgetput.c
@@ -166,7 +166,7 @@ int ftp_receive(ftp_host_info_t *server, FILE *control_stream,
166 if (do_continue) { 166 if (do_continue) {
167 fd_local = xopen(local_path, O_APPEND | O_WRONLY); 167 fd_local = xopen(local_path, O_APPEND | O_WRONLY);
168 } else { 168 } else {
169 fd_local = xopen3(local_path, O_CREAT | O_TRUNC | O_WRONLY, 0777); 169 fd_local = xopen3(local_path, O_CREAT | O_TRUNC | O_WRONLY, 0666);
170 } 170 }
171 } 171 }
172 172
diff --git a/networking/inetd.c b/networking/inetd.c
index 966425385..75b2b14a7 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -1371,7 +1371,7 @@ inetd_main(int argc, char *argv[])
1371 socklen_t plen = sizeof(peer); 1371 socklen_t plen = sizeof(peer);
1372 1372
1373 if (getpeername(ctrl, (struct sockaddr *) &peer, &plen) < 0) { 1373 if (getpeername(ctrl, (struct sockaddr *) &peer, &plen) < 0) {
1374 bb_error_msg("could not getpeername"); 1374 bb_error_msg("cannot getpeername");
1375 close(ctrl); 1375 close(ctrl);
1376 continue; 1376 continue;
1377 } 1377 }
diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c
index de11d9dac..a595e967f 100644
--- a/networking/libiproute/libnetlink.c
+++ b/networking/libiproute/libnetlink.c
@@ -126,7 +126,7 @@ int rtnl_dump_filter(struct rtnl_handle *rth,
126 int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *), 126 int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
127 void *arg2) 127 void *arg2)
128{ 128{
129 char buf[8192]; 129 char buf[8192];
130 struct sockaddr_nl nladdr; 130 struct sockaddr_nl nladdr;
131 struct iovec iov = { buf, sizeof(buf) }; 131 struct iovec iov = { buf, sizeof(buf) };
132 132
diff --git a/networking/netstat.c b/networking/netstat.c
index bc5c61974..8e481f67b 100644
--- a/networking/netstat.c
+++ b/networking/netstat.c
@@ -496,7 +496,6 @@ static void unix_do_one(int nr, const char *line)
496 496
497static void do_info(const char *file, const char *name, void (*proc)(int, const char *)) 497static void do_info(const char *file, const char *name, void (*proc)(int, const char *))
498{ 498{
499 char buffer[8192];
500 int lnr = 0; 499 int lnr = 0;
501 FILE *procinfo; 500 FILE *procinfo;
502 501
@@ -505,12 +504,15 @@ static void do_info(const char *file, const char *name, void (*proc)(int, const
505 if (errno != ENOENT) { 504 if (errno != ENOENT) {
506 perror(file); 505 perror(file);
507 } else { 506 } else {
508 bb_error_msg("no support for `%s' on this system", name); 507 bb_error_msg("no support for '%s' on this system", name);
509 } 508 }
510 } else { 509 } else {
511 do { 510 do {
512 if (fgets(buffer, sizeof(buffer), procinfo)) 511 char *buffer = xmalloc_fgets(procinfo);
512 if (buffer) {
513 (proc)(lnr++, buffer); 513 (proc)(lnr++, buffer);
514 free(buffer);
515 }
514 } while (!feof(procinfo)); 516 } while (!feof(procinfo));
515 fclose(procinfo); 517 fclose(procinfo);
516 } 518 }
diff --git a/networking/traceroute.c b/networking/traceroute.c
index 84ce8ae69..3b590630c 100644
--- a/networking/traceroute.c
+++ b/networking/traceroute.c
@@ -417,7 +417,7 @@ ifaddrlist(struct IFADDRLIST **ipaddrp)
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
423 *ipaddrp = st_ifaddrlist; 423 *ipaddrp = st_ifaddrlist;
@@ -472,7 +472,7 @@ findsaddr(const struct sockaddr_in *to, struct sockaddr_in *from)
472 fclose(f); 472 fclose(f);
473 473
474 if (device[0] == '\0') 474 if (device[0] == '\0')
475 bb_error_msg_and_die ("Can't find interface"); 475 bb_error_msg_and_die ("can't find interface");
476 476
477 /* Get the interface address list */ 477 /* Get the interface address list */
478 n = ifaddrlist(&al); 478 n = ifaddrlist(&al);
@@ -482,7 +482,7 @@ findsaddr(const struct sockaddr_in *to, struct sockaddr_in *from)
482 if (strcmp(device, al->device) == 0) 482 if (strcmp(device, al->device) == 0)
483 break; 483 break;
484 if (i <= 0) 484 if (i <= 0)
485 bb_error_msg_and_die("Can't find interface %s", device); 485 bb_error_msg_and_die("can't find interface %s", device);
486 486
487 setsin(from, al->addr); 487 setsin(from, al->addr);
488} 488}
@@ -1156,7 +1156,7 @@ traceroute_main(int argc, char *argv[])
1156 if (strcmp(device, al->device) == 0) 1156 if (strcmp(device, al->device) == 0)
1157 break; 1157 break;
1158 if (i <= 0) { 1158 if (i <= 0) {
1159 bb_error_msg_and_die("Can't find interface %s", device); 1159 bb_error_msg_and_die("can't find interface %s", device);
1160 } 1160 }
1161 } 1161 }
1162 1162
diff --git a/networking/udhcp/arpping.c b/networking/udhcp/arpping.c
index 587339f9b..086692082 100644
--- a/networking/udhcp/arpping.c
+++ b/networking/udhcp/arpping.c
@@ -49,7 +49,7 @@ int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
49 } 49 }
50 50
51 if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)) == -1) { 51 if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)) == -1) {
52 bb_perror_msg("Could not setsocketopt on raw socket"); 52 bb_perror_msg("cannot setsocketopt on raw socket");
53 close(s); 53 close(s);
54 return -1; 54 return -1;
55 } 55 }
diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c
index f9f5a3b8c..439aa0250 100644
--- a/networking/udhcp/clientpacket.c
+++ b/networking/udhcp/clientpacket.c
@@ -39,16 +39,13 @@ unsigned long random_xid(void)
39{ 39{
40 static int initialized; 40 static int initialized;
41 if (!initialized) { 41 if (!initialized) {
42 int fd;
43 unsigned long seed; 42 unsigned long seed;
44 43
45 fd = open("/dev/urandom", 0); 44 if (open_read_close("/dev/urandom", &seed, sizeof(seed)) < 0) {
46 if (fd < 0 || read(fd, &seed, sizeof(seed)) < 0) { 45 bb_info_msg("Cannot load seed "
47 bb_info_msg("Could not load seed "
48 "from /dev/urandom: %s", strerror(errno)); 46 "from /dev/urandom: %s", strerror(errno));
49 seed = time(0); 47 seed = time(0);
50 } 48 }
51 if (fd >= 0) close(fd);
52 srand(seed); 49 srand(seed);
53 initialized++; 50 initialized++;
54 } 51 }
diff --git a/networking/udhcp/options.c b/networking/udhcp/options.c
index ded0f7b9b..8dba2ef69 100644
--- a/networking/udhcp/options.c
+++ b/networking/udhcp/options.c
@@ -171,6 +171,6 @@ int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data)
171 } 171 }
172 } 172 }
173 173
174 bb_error_msg("Could not add option 0x%02x", code); 174 bb_error_msg("cannot add option 0x%02x", code);
175 return 0; 175 return 0;
176} 176}
diff --git a/networking/udhcp/signalpipe.c b/networking/udhcp/signalpipe.c
index 6c4a9f1f2..bece4193a 100644
--- a/networking/udhcp/signalpipe.c
+++ b/networking/udhcp/signalpipe.c
@@ -36,7 +36,7 @@ static int signal_pipe[2];
36static void signal_handler(int sig) 36static void signal_handler(int sig)
37{ 37{
38 if (send(signal_pipe[1], &sig, sizeof(sig), MSG_DONTWAIT) < 0) 38 if (send(signal_pipe[1], &sig, sizeof(sig), MSG_DONTWAIT) < 0)
39 bb_perror_msg("Could not send signal"); 39 bb_perror_msg("cannot send signal");
40} 40}
41 41
42 42
diff --git a/networking/wget.c b/networking/wget.c
index 264ae4483..7a931f363 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -219,9 +219,7 @@ int wget_main(int argc, char **argv)
219 } else if (opt & WGET_OPT_CONTINUE) { 219 } else if (opt & WGET_OPT_CONTINUE) {
220 output_fd = open(fname_out, O_WRONLY); 220 output_fd = open(fname_out, O_WRONLY);
221 if (output_fd >= 0) { 221 if (output_fd >= 0) {
222 beg_range = lseek(output_fd, 0, SEEK_END); 222 beg_range = xlseek(output_fd, 0, SEEK_END);
223 if (beg_range == (off_t)-1)
224 bb_perror_msg_and_die("lseek");
225 } 223 }
226 /* File doesn't exist. We do not create file here yet. 224 /* File doesn't exist. We do not create file here yet.
227 We are not sure it exists on remove side */ 225 We are not sure it exists on remove side */
diff --git a/procps/fuser.c b/procps/fuser.c
index aae24f50c..4906797cf 100644
--- a/procps/fuser.c
+++ b/procps/fuser.c
@@ -292,7 +292,7 @@ static int fuser_kill_pid_list(pid_list *plist, int sig)
292 if(curr->pid > 0 && curr->pid != mypid) { 292 if(curr->pid > 0 && curr->pid != mypid) {
293 if (kill(curr->pid, sig) != 0) { 293 if (kill(curr->pid, sig) != 0) {
294 bb_perror_msg( 294 bb_perror_msg(
295 "Could not kill pid '%d'", curr->pid); 295 "cannot kill pid '%d'", curr->pid);
296 success = 0; 296 success = 0;
297 } 297 }
298 } 298 }
@@ -342,7 +342,7 @@ int fuser_main(int argc, char **argv)
342 if(!fuser_file_to_dev_inode( 342 if(!fuser_file_to_dev_inode(
343 argv[fni[i]], &dev, &inode)) { 343 argv[fni[i]], &dev, &inode)) {
344 if (ENABLE_FEATURE_CLEAN_UP) free(inodes); 344 if (ENABLE_FEATURE_CLEAN_UP) free(inodes);
345 bb_perror_msg_and_die("Could not open '%s'", argv[fni[i]]); 345 bb_perror_msg_and_die("cannot open '%s'", argv[fni[i]]);
346 } 346 }
347 fuser_add_inode(inodes, dev, inode); 347 fuser_add_inode(inodes, dev, inode);
348 } 348 }
diff --git a/procps/top.c b/procps/top.c
index 14a3870a1..06a84c90c 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -448,7 +448,7 @@ int top_main(int argc, char **argv)
448 memcpy(top + n, p, sizeof(procps_status_t)); 448 memcpy(top + n, p, sizeof(procps_status_t));
449 } 449 }
450 if (ntop == 0) { 450 if (ntop == 0) {
451 bb_error_msg_and_die("Can't find process info in /proc"); 451 bb_error_msg_and_die("can't find process info in /proc");
452 } 452 }
453#ifdef CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE 453#ifdef CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
454 if (!prev_hist_count) { 454 if (!prev_hist_count) {
diff --git a/shell/msh.c b/shell/msh.c
index df6f321aa..cb2947137 100644
--- a/shell/msh.c
+++ b/shell/msh.c
@@ -2954,7 +2954,7 @@ static int iosetup(struct ioword *iop, int pipein, int pipeout)
2954 2954
2955 case IOWRITE | IOCAT: 2955 case IOWRITE | IOCAT:
2956 if ((u = open(cp, 1)) >= 0) { 2956 if ((u = open(cp, 1)) >= 0) {
2957 lseek(u, (long) 0, 2); 2957 lseek(u, (long) 0, SEEK_END);
2958 break; 2958 break;
2959 } 2959 }
2960 case IOWRITE: 2960 case IOWRITE:
@@ -4686,7 +4686,7 @@ static void pushio(struct ioarg *argp, int (*fn) (struct ioarg *))
4686 /* This line appears to be active when running scripts from command line */ 4686 /* This line appears to be active when running scripts from command line */
4687 if ((isatty(e.iop->argp->afile) == 0) 4687 if ((isatty(e.iop->argp->afile) == 0)
4688 && (e.iop == &iostack[0] 4688 && (e.iop == &iostack[0]
4689 || lseek(e.iop->argp->afile, 0L, 1) != -1)) { 4689 || lseek(e.iop->argp->afile, 0L, SEEK_CUR) != -1)) {
4690 if (++bufid == AFID_NOBUF) /* counter rollover check, AFID_NOBUF = 11111111 */ 4690 if (++bufid == AFID_NOBUF) /* counter rollover check, AFID_NOBUF = 11111111 */
4691 bufid = AFID_ID; /* AFID_ID = 0 */ 4691 bufid = AFID_ID; /* AFID_ID = 0 */
4692 4692
@@ -4831,7 +4831,7 @@ static int filechar(struct ioarg *ap)
4831 if ((i = ap->afid != bp->id) || bp->bufp == bp->ebufp) { 4831 if ((i = ap->afid != bp->id) || bp->bufp == bp->ebufp) {
4832 4832
4833 if (i) 4833 if (i)
4834 lseek(ap->afile, ap->afpos, 0); 4834 lseek(ap->afile, ap->afpos, SEEK_SET);
4835 4835
4836 i = safe_read(ap->afile, bp->buf, sizeof(bp->buf)); 4836 i = safe_read(ap->afile, bp->buf, sizeof(bp->buf));
4837 4837
diff --git a/util-linux/hwclock.c b/util-linux/hwclock.c
index cce31335e..1aff87c11 100644
--- a/util-linux/hwclock.c
+++ b/util-linux/hwclock.c
@@ -51,11 +51,11 @@ static time_t read_rtc(int utc)
51 51
52 if (( rtc = open ( "/dev/rtc", O_RDONLY )) < 0 ) { 52 if (( rtc = open ( "/dev/rtc", O_RDONLY )) < 0 ) {
53 if (( rtc = open ( "/dev/misc/rtc", O_RDONLY )) < 0 ) 53 if (( rtc = open ( "/dev/misc/rtc", O_RDONLY )) < 0 )
54 bb_perror_msg_and_die ( "Could not access RTC" ); 54 bb_perror_msg_and_die ( "cannot access RTC" );
55 } 55 }
56 memset ( &tm, 0, sizeof( struct tm )); 56 memset ( &tm, 0, sizeof( struct tm ));
57 if ( ioctl ( rtc, RTC_RD_TIME, &tm ) < 0 ) 57 if ( ioctl ( rtc, RTC_RD_TIME, &tm ) < 0 )
58 bb_perror_msg_and_die ( "Could not read time from RTC" ); 58 bb_perror_msg_and_die ( "cannot read time from RTC" );
59 tm.tm_isdst = -1; /* not known */ 59 tm.tm_isdst = -1; /* not known */
60 60
61 close ( rtc ); 61 close ( rtc );
@@ -85,14 +85,14 @@ static void write_rtc(time_t t, int utc)
85 85
86 if (( rtc = open ( "/dev/rtc", O_WRONLY )) < 0 ) { 86 if (( rtc = open ( "/dev/rtc", O_WRONLY )) < 0 ) {
87 if (( rtc = open ( "/dev/misc/rtc", O_WRONLY )) < 0 ) 87 if (( rtc = open ( "/dev/misc/rtc", O_WRONLY )) < 0 )
88 bb_perror_msg_and_die ( "Could not access RTC" ); 88 bb_perror_msg_and_die ( "cannot access RTC" );
89 } 89 }
90 90
91 tm = *( utc ? gmtime ( &t ) : localtime ( &t )); 91 tm = *( utc ? gmtime ( &t ) : localtime ( &t ));
92 tm.tm_isdst = 0; 92 tm.tm_isdst = 0;
93 93
94 if ( ioctl ( rtc, RTC_SET_TIME, &tm ) < 0 ) 94 if ( ioctl ( rtc, RTC_SET_TIME, &tm ) < 0 )
95 bb_perror_msg_and_die ( "Could not set the RTC time" ); 95 bb_perror_msg_and_die ( "cannot set the RTC time" );
96 96
97 close ( rtc ); 97 close ( rtc );
98} 98}
diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index f43393692..1df144fa9 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -39,10 +39,8 @@ static void make_device(char *path, int delete)
39 39
40 if (!delete) { 40 if (!delete) {
41 strcat(path, "/dev"); 41 strcat(path, "/dev");
42 fd = open(path, O_RDONLY); 42 len = open_read_close(path, temp + 1, 64);
43 len = read(fd, temp + 1, 64);
44 *temp++ = 0; 43 *temp++ = 0;
45 close(fd);
46 if (len < 1) return; 44 if (len < 1) return;
47 } 45 }
48 46
diff --git a/util-linux/readprofile.c b/util-linux/readprofile.c
index b368067ef..e635f6bf3 100644
--- a/util-linux/readprofile.c
+++ b/util-linux/readprofile.c
@@ -44,9 +44,9 @@ static const char defaultpro[] = "/proc/profile";
44int readprofile_main(int argc, char **argv) 44int readprofile_main(int argc, char **argv)
45{ 45{
46 FILE *map; 46 FILE *map;
47 int proFd;
48 const char *mapFile, *proFile, *mult=0; 47 const char *mapFile, *proFile, *mult=0;
49 unsigned long len=0, indx=1; 48 unsigned long indx=1;
49 size_t len;
50 uint64_t add0=0; 50 uint64_t add0=0;
51 unsigned int step; 51 unsigned int step;
52 unsigned int *buf, total, fn_len; 52 unsigned int *buf, total, fn_len;
@@ -97,20 +97,8 @@ int readprofile_main(int argc, char **argv)
97 /* 97 /*
98 * Use an fd for the profiling buffer, to skip stdio overhead 98 * Use an fd for the profiling buffer, to skip stdio overhead
99 */ 99 */
100 100 len = INT_MAX;
101 proFd = xopen(proFile,O_RDONLY); 101 buf = xmalloc_open_read_close(proFile, &len);
102
103 if (((int)(len=lseek(proFd,0,SEEK_END)) < 0)
104 || (lseek(proFd,0,SEEK_SET) < 0))
105 bb_perror_msg_and_die(proFile);
106
107 buf = xmalloc(len);
108
109 if (read(proFd,buf,len) != len)
110 bb_perror_msg_and_die(proFile);
111
112 close(proFd);
113
114 if (!optNative) { 102 if (!optNative) {
115 int entries = len/sizeof(*buf); 103 int entries = len/sizeof(*buf);
116 int big = 0,small = 0,i; 104 int big = 0,small = 0,i;
@@ -123,8 +111,8 @@ int readprofile_main(int argc, char **argv)
123 small++; 111 small++;
124 } 112 }
125 if (big > small) { 113 if (big > small) {
126 bb_error_msg("Assuming reversed byte order. " 114 bb_error_msg("assuming reversed byte order, "
127 "Use -n to force native byte order."); 115 "use -n to force native byte order");
128 for (p = buf; p < buf+entries; p++) 116 for (p = buf; p < buf+entries; p++)
129 for (i = 0; i < sizeof(*buf)/2; i++) { 117 for (i = 0; i < sizeof(*buf)/2; i++) {
130 unsigned char *b = (unsigned char *) p; 118 unsigned char *b = (unsigned char *) p;