Clarify usage of st_rdev. Use it if HAVE_STRUCT_STAT_ST_RDEV is defined.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Andrew Borodin 2017-01-02 10:55:26 +03:00
parent d1c2c2d47e
commit bf40acf420
6 changed files with 39 additions and 3 deletions

View File

@ -967,7 +967,9 @@ vfs_s_default_stat (struct vfs_class *me, mode_t mode)
st.st_mode = mode;
st.st_ino = 0;
st.st_dev = 0;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
st.st_rdev = 0;
#endif
st.st_uid = getuid ();
st.st_gid = getgid ();
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE

View File

@ -186,9 +186,13 @@ main (int argc, char **argv)
die ();
if (fstat (console_fd, &st) < 0 || !S_ISCHR (st.st_mode))
die ();
#ifdef HAVE_STRUCT_STAT_ST_RDEV
if ((st.st_rdev & 0xff00) != 0x0400)
die ();
console_minor = (int) (st.st_rdev & 0x00ff);
#else
console_minor = 1; /* FIXME */
#endif
if (console_minor < 1 || console_minor > 63)
die ();
if (st.st_uid != uid)

View File

@ -1602,7 +1602,13 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
if (S_ISCHR (src_stat.st_mode) || S_ISBLK (src_stat.st_mode) || S_ISFIFO (src_stat.st_mode)
|| S_ISNAM (src_stat.st_mode) || S_ISSOCK (src_stat.st_mode))
{
while (mc_mknod (dst_vpath, src_stat.st_mode & ctx->umask_kill, src_stat.st_rdev) < 0
dev_t rdev = 0;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
rdev = src_stat.st_rdev;
#endif
while (mc_mknod (dst_vpath, src_stat.st_mode & ctx->umask_kill, rdev) < 0
&& !ctx->skip_all)
{
return_status = file_error (_("Cannot create special file \"%s\"\n%s"), dst_path);

View File

@ -388,6 +388,7 @@ cpio_create_entry (struct vfs_class *me, struct vfs_s_super *super, struct stat
/* cppcheck-suppress syntaxError */
case S_IFNAM:
#endif
#ifdef HAVE_STRUCT_STAT_ST_RDEV
if ((st->st_size != 0) && (st->st_rdev == 0x0001))
{
/* FIXME: representation of major/minor differs between */
@ -395,6 +396,7 @@ cpio_create_entry (struct vfs_class *me, struct vfs_s_super *super, struct stat
st->st_rdev = (unsigned) st->st_size;
st->st_size = 0;
}
#endif
break;
default:
break;
@ -583,7 +585,9 @@ cpio_read_bin_head (struct vfs_class *me, struct vfs_s_super *super)
st.st_nlink = u.buf.c_nlink;
st.st_uid = u.buf.c_uid;
st.st_gid = u.buf.c_gid;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
st.st_rdev = u.buf.c_rdev;
#endif
st.st_size = (u.buf.c_filesizes[0] << 16) | u.buf.c_filesizes[1];
st.st_atime = st.st_mtime = st.st_ctime = (u.buf.c_mtimes[0] << 16) | u.buf.c_mtimes[1];
@ -650,7 +654,9 @@ cpio_read_oldc_head (struct vfs_class *me, struct vfs_s_super *super)
u.st.st_nlink = hd.c_nlink;
u.st.st_uid = hd.c_uid;
u.st.st_gid = hd.c_gid;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
u.st.st_rdev = hd.c_rdev;
#endif
u.st.st_size = hd.c_filesize;
u.st.st_atime = u.st.st_mtime = u.st.st_ctime = hd.c_mtime;
@ -726,7 +732,9 @@ cpio_read_crc_head (struct vfs_class *me, struct vfs_s_super *super)
u.st.st_nlink = hd.c_nlink;
u.st.st_uid = hd.c_uid;
u.st.st_gid = hd.c_gid;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
u.st.st_rdev = makedev (hd.c_rdev, hd.c_rdevmin);
#endif
u.st.st_size = hd.c_filesize;
u.st.st_atime = u.st.st_mtime = u.st.st_ctime = hd.c_mtime;

View File

@ -401,7 +401,10 @@ tar_fill_stat (struct vfs_s_super *archive, struct stat *st, union record *heade
st->st_mode |= S_IFREG;
st->st_dev = 0;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
st->st_rdev = 0;
#endif
switch (arch->type)
{
case TAR_USTAR:
@ -420,9 +423,12 @@ tar_fill_stat (struct vfs_s_super *archive, struct stat *st, union record *heade
{
case LF_BLK:
case LF_CHR:
#ifdef HAVE_STRUCT_STAT_ST_RDEV
st->st_rdev =
(tar_from_oct (8, header->header.devmajor) << 8) |
tar_from_oct (8, header->header.devminor);
makedev (tar_from_oct (8, header->header.devmajor),
tar_from_oct (8, header->header.devminor));
#endif
break;
default:
break;
}

View File

@ -119,7 +119,9 @@ fill_stat_struct (struct stat *etalon_stat, int iterator)
etalon_stat->st_nlink = 10;
etalon_stat->st_uid = 500;
etalon_stat->st_gid = 500;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
etalon_stat->st_rdev = 0;
#endif
etalon_stat->st_size = 4096;
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
etalon_stat->st_blksize = 512;
@ -138,7 +140,9 @@ fill_stat_struct (struct stat *etalon_stat, int iterator)
etalon_stat->st_nlink = 10;
etalon_stat->st_uid = 500;
etalon_stat->st_gid = 500;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
etalon_stat->st_rdev = 0;
#endif
etalon_stat->st_size = 11;
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
etalon_stat->st_blksize = 512;
@ -157,7 +161,9 @@ fill_stat_struct (struct stat *etalon_stat, int iterator)
etalon_stat->st_nlink = 10;
etalon_stat->st_uid = 500;
etalon_stat->st_gid = 500;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
etalon_stat->st_rdev = 0;
#endif
etalon_stat->st_size = 4096;
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
etalon_stat->st_blksize = 512;
@ -176,7 +182,9 @@ fill_stat_struct (struct stat *etalon_stat, int iterator)
etalon_stat->st_nlink = 10;
etalon_stat->st_uid = 500;
etalon_stat->st_gid = 500;
#ifdef HAVE_STRUCT_STAT_ST_RDEV
etalon_stat->st_rdev = 0;
#endif
etalon_stat->st_size = 4096;
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
etalon_stat->st_blksize = 512;
@ -275,7 +283,9 @@ START_PARAMETRIZED_TEST (test_vfs_parse_ls_lga, test_vfs_parse_ls_lga_ds)
mctest_assert_int_eq (etalon_stat.st_mode, test_stat.st_mode);
mctest_assert_int_eq (etalon_stat.st_uid, test_stat.st_uid);
mctest_assert_int_eq (etalon_stat.st_gid, test_stat.st_gid);
#ifdef HAVE_STRUCT_STAT_ST_RDEV
mctest_assert_int_eq (etalon_stat.st_rdev, test_stat.st_rdev);
#endif
mctest_assert_int_eq (etalon_stat.st_size, test_stat.st_size);
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
mctest_assert_int_eq (etalon_stat.st_blksize, test_stat.st_blksize);