blob: 7b61e980c345f4075221b978bcf74cc8e689b72b [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2020 Oracle. All Rights Reserved.
* Author: Darrick J. Wong <darrick.wong@oracle.com>
*/
#include "libxfs.h"
#include "command.h"
#include "output.h"
#include "init.h"
enum show_what {
SHOW_AUTO,
SHOW_CLASSIC,
SHOW_BIGTIME,
};
enum print_how {
PRINT_RAW,
PRINT_PRETTY,
PRINT_COMPACT,
};
static void
show_limit(
const char *tag,
int64_t limit,
enum print_how how)
{
if (how == PRINT_COMPACT) {
dbprintf("%" PRId64 " ", limit);
return;
}
if (how == PRINT_PRETTY && limit <= LONG_MAX && limit >= LONG_MIN) {
time_t tt = limit;
char *c;
c = ctime(&tt);
if (c) {
dbprintf("%s = %24.24s\n", tag, c);
return;
}
}
dbprintf("%s = %" PRId64 "\n", tag, limit);
}
static void
show_limits(
enum show_what whatkind,
enum print_how how)
{
enum print_how grace_how = how;
switch (whatkind) {
case SHOW_AUTO:
/* should never get here */
break;
case SHOW_CLASSIC:
show_limit("time.min", XFS_LEGACY_TIME_MIN, how);
show_limit("time.max", XFS_LEGACY_TIME_MAX, how);
show_limit("dqtimer.min", XFS_DQ_LEGACY_EXPIRY_MIN, how);
show_limit("dqtimer.max", XFS_DQ_LEGACY_EXPIRY_MAX, how);
break;
case SHOW_BIGTIME:
show_limit("time.min",
xfs_bigtime_to_unix(XFS_BIGTIME_TIME_MIN), how);
show_limit("time.max",
xfs_bigtime_to_unix(XFS_BIGTIME_TIME_MAX), how);
show_limit("dqtimer.min",
xfs_dq_bigtime_to_unix(XFS_DQ_BIGTIME_EXPIRY_MIN),
how);
show_limit("dqtimer.max",
xfs_dq_bigtime_to_unix(XFS_DQ_BIGTIME_EXPIRY_MAX),
how);
break;
}
/* grace periods are always integers */
if (grace_how != PRINT_COMPACT)
grace_how = PRINT_RAW;
show_limit("dqgrace.min", XFS_DQ_GRACE_MIN, grace_how);
show_limit("dqgrace.min", XFS_DQ_GRACE_MAX, grace_how);
if (how == PRINT_COMPACT)
dbprintf("\n");
}
static int
timelimit_f(
int argc,
char **argv)
{
enum show_what whatkind = SHOW_AUTO;
enum print_how how = PRINT_RAW;
int i;
for (i = 1; i < argc; i++) {
if (!strcmp("--classic", argv[i]))
whatkind = SHOW_CLASSIC;
else if (!strcmp("--bigtime", argv[i]))
whatkind = SHOW_BIGTIME;
else if (!strcmp("--pretty", argv[i]))
how = PRINT_PRETTY;
else if (!strcmp("--compact", argv[i]))
how = PRINT_COMPACT;
else {
dbprintf(_("%s: bad option for timelimit command\n"),
argv[i]);
return 1;
}
}
if (whatkind == SHOW_AUTO) {
if (xfs_has_bigtime(mp))
whatkind = SHOW_BIGTIME;
else
whatkind = SHOW_CLASSIC;
}
show_limits(whatkind, how);
return 0;
}
static void
timelimit_help(void)
{
dbprintf(_(
"\n"
" Print the minimum and maximum supported values for inode timestamps,\n"
" disk quota expiration timers, and disk quota grace periods supported\n"
" by this filesystem.\n"
"\n"
" Options:\n"
" --classic -- Force printing of the classic time limits.\n"
" --bigtime -- Force printing of the bigtime limits.\n"
" --pretty -- Pretty-print the time limits.\n"
" --compact -- Print the limits in a single line.\n"
"\n"
));
}
static const cmdinfo_t timelimit_cmd = {
.name = "timelimit",
.cfunc = timelimit_f,
.argmin = 0,
.argmax = -1,
.canpush = 0,
.args = N_("[--classic|--bigtime] [--pretty]"),
.oneline = N_("display timestamp limits"),
.help = timelimit_help,
};
void
timelimit_init(void)
{
add_command(&timelimit_cmd);
}