diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2018-11-01 21:46:50 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2018-11-01 21:46:50 -0400 |
commit | 8c3b9aaaab11be9d0fe24a72ebb16e171ca22125 (patch) | |
tree | 1eceebe2763cec5a010a193d48b50edef5fb78a2 | |
parent | b74261ac825ec2b9c02d73e36f7b44b64c9d184c (diff) | |
download | bfs-8c3b9aaaab11be9d0fe24a72ebb16e171ca22125.tar.xz |
Print device major/minor numbers for -ls
-rw-r--r-- | eval.c | 14 | ||||
-rw-r--r-- | stat.c | 9 | ||||
-rw-r--r-- | stat.h | 11 | ||||
-rw-r--r-- | util.c | 16 | ||||
-rw-r--r-- | util.h | 15 |
5 files changed, 56 insertions, 9 deletions
@@ -658,9 +658,17 @@ bool eval_fls(const struct expr *expr, struct eval_state *state) { } } - uintmax_t size = statbuf->size; - if (fprintf(file, " %8ju", size) < 0) { - goto error; + if (ftwbuf->typeflag & (BFTW_BLK | BFTW_CHR)) { + int ma = bfs_major(statbuf->rdev); + int mi = bfs_minor(statbuf->rdev); + if (fprintf(file, " %3d, %3d", ma, mi) < 0) { + goto error; + } + } else { + uintmax_t size = statbuf->size; + if (fprintf(file, " %8ju", size) < 0) { + goto error; + } } time_t time = statbuf->mtime.tv_sec; @@ -32,7 +32,6 @@ #if HAVE_STATX || defined(__NR_statx) # define HAVE_BFS_STATX true -# include <sys/sysmacros.h> #endif #if __APPLE__ @@ -82,6 +81,9 @@ static void bfs_stat_convert(const struct stat *statbuf, struct bfs_stat *buf) { buf->blocks = statbuf->st_blocks; buf->mask |= BFS_STAT_BLOCKS; + buf->rdev = statbuf->st_rdev; + buf->mask |= BFS_STAT_RDEV; + buf->atime = statbuf->st_atim; buf->mask |= BFS_STAT_ATIME; @@ -154,7 +156,7 @@ static int bfs_statx_impl(int at_fd, const char *at_path, int at_flags, enum bfs buf->mask = 0; - buf->dev = makedev(xbuf.stx_dev_major, xbuf.stx_dev_minor); + buf->dev = bfs_makedev(xbuf.stx_dev_major, xbuf.stx_dev_minor); buf->mask |= BFS_STAT_DEV; if (xbuf.stx_mask & STATX_INO) { @@ -195,6 +197,9 @@ static int bfs_statx_impl(int at_fd, const char *at_path, int at_flags, enum bfs buf->mask |= BFS_STAT_BLOCKS; } + buf->rdev = bfs_makedev(xbuf.stx_rdev_major, xbuf.stx_rdev_minor); + buf->mask |= BFS_STAT_RDEV; + if (xbuf.stx_mask & STATX_ATIME) { buf->atime.tv_sec = xbuf.stx_atime.tv_sec; buf->atime.tv_nsec = xbuf.stx_atime.tv_nsec; @@ -35,10 +35,11 @@ enum bfs_stat_field { BFS_STAT_UID = 1 << 6, BFS_STAT_SIZE = 1 << 7, BFS_STAT_BLOCKS = 1 << 8, - BFS_STAT_ATIME = 1 << 9, - BFS_STAT_BTIME = 1 << 10, - BFS_STAT_CTIME = 1 << 11, - BFS_STAT_MTIME = 1 << 12, + BFS_STAT_RDEV = 1 << 9, + BFS_STAT_ATIME = 1 << 10, + BFS_STAT_BTIME = 1 << 11, + BFS_STAT_CTIME = 1 << 12, + BFS_STAT_MTIME = 1 << 13, }; /** @@ -80,6 +81,8 @@ struct bfs_stat { off_t size; /** Number of disk blocks allocated (of size BFS_STAT_BLKSIZE). */ blkcnt_t blocks; + /** The device ID represented by this file. */ + dev_t rdev; /** Access time. */ struct timespec atime; @@ -30,6 +30,10 @@ #include <sys/types.h> #include <unistd.h> +#if __GLIBC__ || __has_include(<sys/sysmacros.h>) +# include <sys/sysmacros.h> +#endif + int xreaddir(DIR *dir, struct dirent **de) { errno = 0; *de = readdir(dir); @@ -440,3 +444,15 @@ int ynprompt() { dstrfree(line); return ret; } + +dev_t bfs_makedev(int ma, int mi) { + return makedev(ma, mi); +} + +int bfs_major(dev_t dev) { + return major(dev); +} + +int bfs_minor(dev_t dev) { + return minor(dev); +} @@ -172,4 +172,19 @@ enum bftw_typeflag dirent_to_typeflag(const struct dirent *de); */ int ynprompt(void); +/** + * Portable version of makedev(). + */ +dev_t bfs_makedev(int ma, int mi); + +/** + * Portable version of major(). + */ +int bfs_major(dev_t dev); + +/** + * Portable version of minor(). + */ +int bfs_minor(dev_t dev); + #endif // BFS_UTIL_H |