diff options
author | Bernhard Reutner-Fischer | 2006-04-13 12:45:04 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer | 2006-04-13 12:45:04 +0000 |
commit | c2cb0f32b44a9918364af39c24b5643388c553f6 (patch) | |
tree | 378b5a002da81f8622913cc6a9aeac873e307ec9 | |
parent | 4f3d2deaa499af34c22a7f9be121131b0a5894b5 (diff) | |
download | busybox-c2cb0f32b44a9918364af39c24b5643388c553f6.zip busybox-c2cb0f32b44a9918364af39c24b5643388c553f6.tar.gz |
- patch from Denis Vlasenko to add and use bb_xopen3()
-rw-r--r-- | archival/gzip.c | 2 | ||||
-rw-r--r-- | coreutils/dd.c | 19 | ||||
-rw-r--r-- | include/libbb.h | 1 | ||||
-rw-r--r-- | libbb/Makefile.in | 2 | ||||
-rw-r--r-- | libbb/xfuncs.c | 13 | ||||
-rw-r--r-- | miscutils/crontab.c | 29 | ||||
-rw-r--r-- | miscutils/mt.c | 3 | ||||
-rw-r--r-- | miscutils/rx.c | 10 | ||||
-rw-r--r-- | modutils/insmod.c | 19 | ||||
-rw-r--r-- | networking/vconfig.c | 3 | ||||
-rw-r--r-- | util-linux/mkfs_minix.c | 4 | ||||
-rw-r--r-- | util-linux/mkswap.c | 4 |
12 files changed, 38 insertions, 71 deletions
diff --git a/archival/gzip.c b/archival/gzip.c index 5fb1187..c31706a 100644 --- a/archival/gzip.c +++ b/archival/gzip.c @@ -1228,7 +1228,7 @@ int gzip_main(int argc, char **argv) inFileNum = STDIN_FILENO; outFileNum = STDOUT_FILENO; } else { - inFileNum = bb_xopen(argv[i], O_RDONLY); + inFileNum = bb_xopen3(argv[i], O_RDONLY, 0); if (fstat(inFileNum, &statBuf) < 0) bb_perror_msg_and_die("%s", argv[i]); time_stamp = statBuf.st_ctime; diff --git a/coreutils/dd.c b/coreutils/dd.c index cba9085..ce8bcc6 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -5,20 +5,7 @@ * * Copyright (C) 2000,2001 Matt Kraai * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ #include <sys/types.h> @@ -119,9 +106,7 @@ int dd_main(int argc, char **argv) oflag |= O_TRUNC; } - if ((ofd = open(outfile, oflag, 0666)) < 0) { - bb_perror_msg_and_die("%s", outfile); - } + ofd = bb_xopen3(outfile, oflag, 0666); if (seek && trunc_flag) { if (ftruncate(ofd, seek * bs) < 0) { diff --git a/include/libbb.h b/include/libbb.h index e1ac912..8fc2dbb 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -440,6 +440,7 @@ extern struct spwd *pwd_to_spwd(const struct passwd *pw); extern int obscure(const char *old, const char *newval, const struct passwd *pwdp); extern int bb_xopen(const char *pathname, int flags); +extern int bb_xopen3(const char *pathname, int flags, int mode); extern ssize_t bb_xread(int fd, void *buf, size_t count); extern void bb_xread_all(int fd, void *buf, size_t count); extern unsigned char bb_xread_char(int fd); diff --git a/libbb/Makefile.in b/libbb/Makefile.in index eac14c6..102047d 100644 --- a/libbb/Makefile.in +++ b/libbb/Makefile.in @@ -68,7 +68,7 @@ $(LIBBB_MOBJ0):$(LIBBB_MSRC0) LIBBB_MSRC1:=$(srcdir)/xfuncs.c LIBBB_MOBJ1:=xmalloc.o xrealloc.o xcalloc.o xstrdup.o xstrndup.o \ - xfopen.o xopen.o xread.o xread_all.o xread_char.o \ + xfopen.o xopen.o xopen3.o xread.o xread_all.o xread_char.o \ xferror.o xferror_stdout.o xfflush_stdout.o strlen.o LIBBB_MOBJ1:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ1)) $(LIBBB_MOBJ1):$(LIBBB_MSRC1) diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index 9ee4fcd..3db526b 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -100,10 +100,17 @@ FILE *bb_xfopen(const char *path, const char *mode) #ifdef L_xopen int bb_xopen(const char *pathname, int flags) { + return bb_xopen3(pathname, flags, 0777); +} +#endif + +#ifdef L_xopen3 +int bb_xopen3(const char *pathname, int flags, int mode) +{ int ret; - ret = open(pathname, flags, 0777); - if (ret == -1) { + ret = open(pathname, flags, mode); + if (ret < 0) { bb_perror_msg_and_die("%s", pathname); } return ret; @@ -116,7 +123,7 @@ ssize_t bb_xread(int fd, void *buf, size_t count) ssize_t size; size = read(fd, buf, count); - if (size == -1) { + if (size < 0) { bb_perror_msg_and_die(bb_msg_read_error); } return(size); diff --git a/miscutils/crontab.c b/miscutils/crontab.c index 703d01e..1b2f46f 100644 --- a/miscutils/crontab.c +++ b/miscutils/crontab.c @@ -179,20 +179,16 @@ crontab_main(int ac, char **av) char buf[1024]; snprintf(tmp, sizeof(tmp), TMPDIR "/crontab.%d", getpid()); - if ((fd = open(tmp, O_RDWR|O_CREAT|O_TRUNC|O_EXCL, 0600)) >= 0) { - chown(tmp, getuid(), getgid()); - if ((fi = fopen(pas->pw_name, "r"))) { - while ((n = fread(buf, 1, sizeof(buf), fi)) > 0) - write(fd, buf, n); - } - EditFile(caller, tmp); - remove(tmp); - lseek(fd, 0L, 0); - repFd = fd; - } else { - bb_error_msg_and_die("unable to create %s", tmp); + fd = bb_xopen3(tmp, O_RDWR|O_CREAT|O_TRUNC|O_EXCL, 0600); + chown(tmp, getuid(), getgid()); + if ((fi = fopen(pas->pw_name, "r"))) { + while ((n = fread(buf, 1, sizeof(buf), fi)) > 0) + write(fd, buf, n); } - + EditFile(caller, tmp); + remove(tmp); + lseek(fd, 0L, 0); + repFd = fd; } option = REPLACE; /* fall through */ @@ -289,11 +285,8 @@ GetReplaceStream(const char *user, const char *file) if (ChangeUser(user, 0) < 0) exit(0); - fd = open(file, O_RDONLY); - if (fd < 0) { - bb_error_msg("unable to open %s", file); - exit(0); - } + bb_default_error_retval = 0; + fd = bb_xopen3(file, O_RDONLY, 0); buf[0] = 0; write(filedes[1], buf, 1); while ((n = read(fd, buf, sizeof(buf))) > 0) { diff --git a/miscutils/mt.c b/miscutils/mt.c index 44efedb..368fc66 100644 --- a/miscutils/mt.c +++ b/miscutils/mt.c @@ -101,8 +101,7 @@ int mt_main(int argc, char **argv) break; } - if ((fd = open(file, mode, 0)) < 0) - bb_perror_msg_and_die("%s", file); + fd = bb_xopen3(file, mode, 0); switch (code->value) { case MTTELL: diff --git a/miscutils/rx.c b/miscutils/rx.c index c7e82ea..3df4613 100644 --- a/miscutils/rx.c +++ b/miscutils/rx.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /*------------------------------------------------------------------------- * Filename: xmodem.c * Version: $Id: rx.c,v 1.2 2004/03/15 08:28:46 andersen Exp $ @@ -289,13 +290,8 @@ int rx_main(int argc, char **argv) bb_show_usage(); fn = argv[1]; - ttyfd = open("/dev/tty", O_RDWR); - if (ttyfd < 0) - bb_error_msg_and_die("%s: open on /dev/tty failed: %m\n", argv[0]); - - filefd = open(fn, O_RDWR|O_CREAT|O_TRUNC, 0666); - if (filefd < 0) - bb_error_msg_and_die("%s: open on %s failed: %m\n", argv[0], fn); + ttyfd = bb_xopen3("/dev/tty", O_RDWR, 0); + filefd = bb_xopen3(fn, O_RDWR|O_CREAT|O_TRUNC, 0666); if (tcgetattr(ttyfd, &tty) < 0) bb_error_msg_and_die("%s: tcgetattr failed: %m\n", argv[0]); diff --git a/modutils/insmod.c b/modutils/insmod.c index 2eebf56..f38daa2 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c @@ -55,20 +55,7 @@ * Restructured (and partly rewritten) by: * Björn Ekwall <bj0rn@blox.se> February 1999 * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ #include <stdlib.h> @@ -4297,9 +4284,7 @@ int insmod_ng_main( int argc, char **argv) strcat(options, " "); } - if ((fd = open(filename, O_RDONLY, 0)) < 0) { - bb_perror_msg_and_die("cannot open module `%s'", filename); - } + fd = bb_xopen3(filename, O_RDONLY, 0); fstat(fd, &st); len = st.st_size; diff --git a/networking/vconfig.c b/networking/vconfig.c index 72729c7..6cbbb54 100644 --- a/networking/vconfig.c +++ b/networking/vconfig.c @@ -123,7 +123,8 @@ int vconfig_main(int argc, char **argv) } /* Don't bother closing the filedes. It will be closed on cleanup. */ - bb_xopen(conf_file_name, O_RDONLY); /* Will die if 802.1q is not present */ + /* Will die if 802.1q is not present */ + bb_xopen3(conf_file_name, O_RDONLY, 0); memset(&ifr, 0, sizeof(struct vlan_ioctl_args)); diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c index 30bc9f1..d9388b1 100644 --- a/util-linux/mkfs_minix.c +++ b/util-linux/mkfs_minix.c @@ -307,7 +307,7 @@ static inline int get_size(const char *file) int fd; long size; - fd = bb_xopen(file, O_RDWR); + fd = bb_xopen3(file, O_RDWR, 0); if (ioctl(fd, BLKGETSIZE, &size) >= 0) { close(fd); return (size * 512); @@ -820,7 +820,7 @@ goodbye: tmp += dirsize; *(short *) tmp = 2; strcpy(tmp + 2, ".badblocks"); - DEV = bb_xopen(device_name, O_RDWR); + DEV = bb_xopen3(device_name, O_RDWR, 0); if (fstat(DEV, &statbuf) < 0) bb_error_msg_and_die("unable to stat %s", device_name); if (!S_ISBLK(statbuf.st_mode)) diff --git a/util-linux/mkswap.c b/util-linux/mkswap.c index 32021fe..44d809a 100644 --- a/util-linux/mkswap.c +++ b/util-linux/mkswap.c @@ -258,7 +258,7 @@ static inline long get_size(const char *file) int fd; long size; - fd = bb_xopen(file, O_RDONLY); + fd = bb_xopen3(file, O_RDONLY, 0); if (ioctl(fd, BLKGETSIZE, &size) >= 0) { size /= pagesize / 512; } else { @@ -341,7 +341,7 @@ int mkswap_main(int argc, char **argv) PAGES * goodpages); } - DEV = bb_xopen(device_name, O_RDWR); + DEV = bb_xopen3(device_name, O_RDWR, 0); if (fstat(DEV, &statbuf) < 0) bb_perror_msg_and_die("%s", device_name); if (!S_ISBLK(statbuf.st_mode)) |