@item %b - Number of blocks allocated (see @samp{%B})
@item %B - The size in bytes of each block reported by @samp{%b}
@item %C - The SELinux security context of a file, if available
-@item %d - Device number in decimal
-@item %D - Device number in hex
+@item %d - Device number in decimal (st_dev)
+@item %D - Device number in hex (st_dev)
+@item %Hd - Major device number in decimal
+@item %Ld - Minor device number in decimal
@item %f - Raw mode in hex
@item %F - File type
@item %g - Group ID of owner
@item %N - Quoted file name with dereference if symbolic link (see below)
@item %o - Optimal I/O transfer size hint
@item %s - Total size, in bytes
+@item %r - Device type in decimal (st_rdev)
+@item %R - Device type in hex (st_rdev)
+@item %Hr - Major device type in decimal (see below)
+@item %Lr - Minor device type in decimal (see below)
@item %t - Major device type in hex (see below)
@item %T - Minor device type in hex (see below)
@item %u - User ID of owner
the default value is @samp{shell-escape-always}. Valid quoting styles are:
@quotingStyles
-The @samp{%t} and @samp{%T} formats operate on the st_rdev member of
-the stat(2) structure, and are only defined for character and block
+The @samp{r}, @samp{R}, @samp{%t}, and @samp{%T} formats operate on the st_rdev
+member of the stat(2) structure, i.e., the represented device rather than
+the containing device, and so are only defined for character and block
special files. On some systems or file types, st_rdev may be used to
represent other quantities.
static size_t decimal_point_len;
static bool
-print_stat (char *pformat, size_t prefix_len, unsigned int m,
+print_stat (char *pformat, size_t prefix_len, char mod, char m,
int fd, char const *filename, void const *data);
/* Return the type of the specified file system.
/* Print statfs info. Return zero upon success, nonzero upon failure. */
static bool ATTRIBUTE_WARN_UNUSED_RESULT
-print_statfs (char *pformat, size_t prefix_len, unsigned int m,
+print_statfs (char *pformat, size_t prefix_len, char mod _GL_UNUSED, char m,
int fd, char const *filename,
void const *data)
{
Return zero upon success, nonzero upon failure. */
static bool ATTRIBUTE_WARN_UNUSED_RESULT
print_it (char const *format, int fd, char const *filename,
- bool (*print_func) (char *, size_t, unsigned int,
+ bool (*print_func) (char *, size_t, char, char,
int, char const *, void const *),
void const *data)
{
case '%':
{
size_t len = format_code_offset (b);
- char const *fmt_char = b + len;
+ char fmt_char = *(b + len);
+ char mod_char = 0;
memcpy (dest, b, len);
b += len;
- switch (*fmt_char)
+ switch (fmt_char)
{
case '\0':
--b;
case '%':
if (1 < len)
{
- dest[len] = *fmt_char;
+ dest[len] = fmt_char;
dest[len + 1] = '\0';
die (EXIT_FAILURE, 0, _("%s: invalid directive"),
quote (dest));
}
putchar ('%');
break;
+ case 'H':
+ case 'L':
+ mod_char = fmt_char;
+ fmt_char = *(b + 1);
+ if (print_func == print_stat
+ && (fmt_char == 'd' || fmt_char == 'r'))
+ {
+ b++;
+ }
+ else
+ {
+ fmt_char = mod_char;
+ mod_char = 0;
+ }
+ FALLTHROUGH;
default:
- fail |= print_func (dest, len, to_uchar (*fmt_char),
+ fail |= print_func (dest, len, mod_char, fmt_char,
fd, filename, data);
break;
}
/* Print stat info. Return zero upon success, nonzero upon failure. */
static bool
-print_stat (char *pformat, size_t prefix_len, unsigned int m,
+print_stat (char *pformat, size_t prefix_len, char mod, char m,
int fd, char const *filename, void const *data)
{
struct print_args *parg = (struct print_args *) data;
}
break;
case 'd':
- out_uint (pformat, prefix_len, statbuf->st_dev);
+ if (mod == 'H')
+ out_uint (pformat, prefix_len, major (statbuf->st_dev));
+ else if (mod == 'L')
+ out_uint (pformat, prefix_len, minor (statbuf->st_dev));
+ else
+ out_uint (pformat, prefix_len, statbuf->st_dev);
break;
case 'D':
out_uint_x (pformat, prefix_len, statbuf->st_dev);
case 's':
out_int (pformat, prefix_len, statbuf->st_size);
break;
+ case 'r':
+ if (mod == 'H')
+ out_uint (pformat, prefix_len, major (statbuf->st_rdev));
+ else if (mod == 'L')
+ out_uint (pformat, prefix_len, minor (statbuf->st_rdev));
+ else
+ out_uint (pformat, prefix_len, statbuf->st_rdev);
+ break;
+ case 'R':
+ out_uint_x (pformat, prefix_len, statbuf->st_rdev);
+ break;
case 't':
out_uint_x (pformat, prefix_len, major (statbuf->st_rdev));
break;
%C SELinux security context string\n\
"), stdout);
fputs (_("\
- %d device number in decimal\n\
- %D device number in hex\n\
+ %d device number in decimal (st_dev)\n\
+ %D device number in hex (st_dev)\n\
+ %Hd major device number in decimal\n\
+ %Ld minor device number in decimal\n\
%f raw mode in hex\n\
%F file type\n\
%g group ID of owner\n\
%N quoted file name with dereference if symbolic link\n\
%o optimal I/O transfer size hint\n\
%s total size, in bytes\n\
+ %r device type in decimal (st_rdev)\n\
+ %R device type in hex (st_rdev)\n\
+ %Hr major device type in decimal, for character/block device special files\n\
+ %Lr minor device type in decimal, for character/block device special files\n\
%t major device type in hex, for character/block device special files\n\
%T minor device type in hex, for character/block device special files\n\
"), stdout);