libbb: add xfstat function
No binary (build failed)
—
(log yok)
| @@ -123,8 +123,7 @@ static int write_ar_archive(archive_handle_t *handle) | |
| struct stat st; | |
| archive_handle_t *out_handle; | |
| - | if (fstat(handle->src_fd, &st) == -1) |
| - | bb_simple_perror_msg_and_die(handle->ar__name); |
| + | xfstat(handle->src_fd, &st, handle->ar__name); |
| /* if archive exists, create a new handle for output. | |
| * we create it in place of the old one. | |
| @@ -572,8 +572,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, | |
| /* Store the stat info for the tarball's file, so | |
| * can avoid including the tarball into itself.... */ | |
| - | if (fstat(tbInfo.tarFd, &tbInfo.tarFileStatBuf) < 0) |
| - | bb_perror_msg_and_die("can't stat tar file"); |
| + | xfstat(tbInfo.tarFd, &tbInfo.tarFileStatBuf, "can't stat tar file"); |
| #if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2 | |
| if (gzip) | |
| @@ -411,6 +411,7 @@ void bb_unsetenv(const char *key) FAST_FUNC; | |
| void bb_unsetenv_and_free(char *key) FAST_FUNC; | |
| void xunlink(const char *pathname) FAST_FUNC; | |
| void xstat(const char *pathname, struct stat *buf) FAST_FUNC; | |
| + | void xfstat(int fd, struct stat *buf, const char *errmsg) FAST_FUNC; |
| int xopen(const char *pathname, int flags) FAST_FUNC; | |
| int xopen_nonblocking(const char *pathname) FAST_FUNC; | |
| int xopen3(const char *pathname, int flags, int mode) FAST_FUNC; | |
| @@ -323,9 +323,7 @@ static void do_skip(priv_dumper_t *dumper, const char *fname, int statok) | |
| struct stat sbuf; | |
| if (statok) { | |
| - | if (fstat(STDIN_FILENO, &sbuf)) { |
| - | bb_simple_perror_msg_and_die(fname); |
| - | } |
| + | xfstat(STDIN_FILENO, &sbuf, fname); |
| if (!(S_ISCHR(sbuf.st_mode) || S_ISBLK(sbuf.st_mode) || S_ISFIFO(sbuf.st_mode)) | |
| && dumper->pub.dump_skip >= sbuf.st_size | |
| ) { | |
| @@ -133,7 +133,7 @@ int FAST_FUNC update_passwd(const char *filename, | |
| goto close_old_fp; | |
| created: | |
| - | if (!fstat(old_fd, &sb)) { |
| + | if (fstat(old_fd, &sb) == 0) { |
| fchmod(new_fd, sb.st_mode & 0777); /* ignore errors */ | |
| fchown(new_fd, sb.st_uid, sb.st_gid); | |
| } | |
| @@ -436,6 +436,16 @@ void FAST_FUNC xstat(const char *name, struct stat *stat_buf) | |
| bb_perror_msg_and_die("can't stat '%s'", name); | |
| } | |
| + | void FAST_FUNC xfstat(int fd, struct stat *stat_buf, const char *errmsg) |
| + | { |
| + | /* errmsg is usually a file name, but not always: |
| + | * xfstat may be called in a spot where file name is no longer |
| + | * available, and caller may give e.g. "can't stat input file" string. |
| + | */ |
| + | if (fstat(fd, stat_buf)) |
| + | bb_simple_perror_msg_and_die(errmsg); |
| + | } |
| + | |
| // selinux_or_die() - die if SELinux is disabled. | |
| void FAST_FUNC selinux_or_die(void) | |
| { | |
| @@ -63,9 +63,9 @@ int ubi_attach_detach_main(int argc UNUSED_PARAM, char **argv) | |
| ubi_ctrl = argv[optind]; | |
| fd = xopen(ubi_ctrl, O_RDWR); | |
| - | //fstat(fd, &st); |
| + | //xfstat(fd, &st, ubi_ctrl); |
| //if (!S_ISCHR(st.st_mode)) | |
| - | // bb_error_msg_and_die("'%s' is not a char device", ubi_ctrl); |
| + | // bb_error_msg_and_die("%s: not a char device", ubi_ctrl); |
| if (do_attach) { | |
| if (!(opts & OPTION_M)) | |
| @@ -4989,9 +4989,13 @@ noclobberopen(const char *fname) | |
| * revealed that it was a regular file, and the file has not been | |
| * replaced, return the file descriptor. | |
| */ | |
| - | if (fstat(fd, &finfo2) == 0 && !S_ISREG(finfo2.st_mode) |
| - | && finfo.st_dev == finfo2.st_dev && finfo.st_ino == finfo2.st_ino) |
| + | if (fstat(fd, &finfo2) == 0 |
| + | && !S_ISREG(finfo2.st_mode) |
| + | && finfo.st_dev == finfo2.st_dev |
| + | && finfo.st_ino == finfo2.st_ino |
| + | ) { |
| return fd; | |
| + | } |
| /* The file has been replaced. badness. */ | |
| close(fd); | |
| @@ -221,7 +221,7 @@ int mkfs_ext2_main(int argc UNUSED_PARAM, char **argv) | |
| // open the device, check the device is a block device | |
| xmove_fd(xopen(argv[0], O_WRONLY), fd); | |
| - | fstat(fd, &st); |
| + | xfstat(fd, &st, argv[0]); |
| if (!S_ISBLK(st.st_mode) && !(option_mask32 & OPT_F)) | |
| bb_error_msg_and_die("%s: not a block device", argv[0]); | |
| @@ -686,8 +686,7 @@ int mkfs_minix_main(int argc UNUSED_PARAM, char **argv) | |
| bb_error_msg_and_die("can't format mounted filesystem"); | |
| xmove_fd(xopen(G.device_name, O_RDWR), dev_fd); | |
| - | if (fstat(dev_fd, &statbuf) < 0) |
| - | bb_error_msg_and_die("can't stat '%s'", G.device_name); |
| + | xfstat(dev_fd, &statbuf, G.device_name); |
| if (!S_ISBLK(statbuf.st_mode)) | |
| opt &= ~1; // clear -c (check) | |
| @@ -168,9 +168,9 @@ int mkfs_reiser_main(int argc UNUSED_PARAM, char **argv) | |
| // check the device is a block device | |
| fd = xopen(argv[0], O_WRONLY | O_EXCL); | |
| - | fstat(fd, &st); |
| + | xfstat(fd, &st, argv[0]); |
| if (!S_ISBLK(st.st_mode) && !(option_mask32 & OPT_f)) | |
| - | bb_error_msg_and_die("not a block device"); |
| + | bb_error_msg_and_die("%s: not a block device", argv[0]); |
| // check if it is mounted | |
| // N.B. what if we format a file? find_mount_point will return false negative since | |
| @@ -245,8 +245,7 @@ int mkfs_vfat_main(int argc UNUSED_PARAM, char **argv) | |
| volume_id = time(NULL); | |
| dev = xopen(device_name, O_RDWR); | |
| - | if (fstat(dev, &st) < 0) |
| - | bb_simple_perror_msg_and_die(device_name); |
| + | xfstat(dev, &st, device_name); |
| // | |
| // Get image size and sector size | |
| @@ -15,8 +15,7 @@ static void mkswap_selinux_setcontext(int fd, const char *path) | |
| if (!is_selinux_enabled()) | |
| return; | |
| - | if (fstat(fd, &stbuf) < 0) |
| - | bb_perror_msg_and_die("fstat failed"); |
| + | xfstat(fd, &stbuf, argv[0]); |
| if (S_ISREG(stbuf.st_mode)) { | |
| security_context_t newcon; | |
| security_context_t oldcon = NULL; | |