From c2cb0f32b44a9918364af39c24b5643388c553f6 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Thu, 13 Apr 2006 12:45:04 +0000 Subject: [PATCH] - patch from Denis Vlasenko to add and use bb_xopen3() --- archival/gzip.c | 2 +- coreutils/dd.c | 19 ++----------------- include/libbb.h | 1 + libbb/Makefile.in | 2 +- libbb/xfuncs.c | 13 ++++++++++--- miscutils/crontab.c | 29 +++++++++++------------------ miscutils/mt.c | 3 +-- miscutils/rx.c | 10 +++------- modutils/insmod.c | 19 ++----------------- networking/vconfig.c | 3 ++- util-linux/mkfs_minix.c | 4 ++-- util-linux/mkswap.c | 4 ++-- 12 files changed, 38 insertions(+), 71 deletions(-) diff --git a/archival/gzip.c b/archival/gzip.c index 5fb118706..c31706af3 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 cba90857f..ce8bcc6a5 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 @@ -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 e1ac912f6..8fc2dbbc8 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 eac14c60c..102047d73 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 9ee4fcd65..3db526b85 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -99,11 +99,18 @@ 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 703d01ecc..1b2f46f3a 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 44efedbe3..368fc66b9 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 c7e82ead5..3df461349 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 2eebf560f..f38daa257 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c @@ -55,20 +55,7 @@ * Restructured (and partly rewritten) by: * Björn Ekwall 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 @@ -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 72729c7ed..6cbbb54ca 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 30bc9f12d..d9388b1d7 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 32021fe08..44d809a36 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))