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.
/* 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)
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;
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
) {
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);
}
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)
{
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))
* 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);
// 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]);
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)
// 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
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
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;