summaryrefslogtreecommitdiffstats
path: root/login-utils/lslogins.c
diff options
context:
space:
mode:
authorKarel Zak2014-07-18 13:17:48 +0200
committerKarel Zak2014-07-18 13:51:01 +0200
commit87a144a502cc4e7dc74aa60043409da89239035a (patch)
tree518c586bff90920bbd96d50442933bc3c2804cf8 /login-utils/lslogins.c
parentwdctl: clean up columns[] usage (diff)
downloadkernel-qcow2-util-linux-87a144a502cc4e7dc74aa60043409da89239035a.tar.gz
kernel-qcow2-util-linux-87a144a502cc4e7dc74aa60043409da89239035a.tar.xz
kernel-qcow2-util-linux-87a144a502cc4e7dc74aa60043409da89239035a.zip
lslogins: more robust usage of columns[]
For more details see commit dcc8dbdc8137cb3da5100158639b565565b89875. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'login-utils/lslogins.c')
-rw-r--r--login-utils/lslogins.c73
1 files changed, 45 insertions, 28 deletions
diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
index ed208f90d..c3e7131ba 100644
--- a/login-utils/lslogins.c
+++ b/login-utils/lslogins.c
@@ -273,9 +273,26 @@ struct lslogins_control {
/* these have to remain global since there's no other reasonable way to pass
* them for each call of fill_table() via twalk() */
static struct libscols_table *tb;
-static int columns[ARRAY_SIZE(coldescs)];
+
+/* columns[] array specifies all currently wanted output column. The columns
+ * are defined by coldescs[] array and you can specify (on command line) each
+ * column twice. That's enough, dynamically allocated array of the columns is
+ * unnecessary overkill and over-engineering in this case */
+static int columns[ARRAY_SIZE(coldescs) * 2];
static int ncolumns;
+static inline size_t err_columns_index(size_t arysz, size_t idx)
+{
+ if (idx >= arysz)
+ errx(EXIT_FAILURE, _("too many columns specified, "
+ "the limit is %zu columns."),
+ arysz - 1);
+ return idx;
+}
+
+#define add_column(ary, n, id) \
+ ((ary)[ err_columns_index(ARRAY_SIZE(ary), (n)) ] = (id))
+
static struct timeval now;
static int date_is_today(time_t t)
@@ -1270,8 +1287,8 @@ int main(int argc, char *argv[])
ctl->time_mode = TIME_SHORT;
/* very basic default */
- columns[ncolumns++] = COL_UID;
- columns[ncolumns++] = COL_USER;
+ add_column(columns, ncolumns++, COL_UID);
+ add_column(columns, ncolumns++, COL_USER);
while ((c = getopt_long(argc, argv, "acfGg:hLl:no:prsuVxzZ",
longopts, NULL)) != -1) {
@@ -1280,11 +1297,11 @@ int main(int argc, char *argv[])
switch (c) {
case 'a':
- columns[ncolumns++] = COL_PWD_WARN;
- columns[ncolumns++] = COL_PWD_CTIME_MIN;
- columns[ncolumns++] = COL_PWD_CTIME_MAX;
- columns[ncolumns++] = COL_PWD_CTIME;
- columns[ncolumns++] = COL_PWD_EXPIR;
+ add_column(columns, ncolumns++, COL_PWD_WARN);
+ add_column(columns, ncolumns++, COL_PWD_CTIME_MIN);
+ add_column(columns, ncolumns++, COL_PWD_CTIME_MAX);
+ add_column(columns, ncolumns++, COL_PWD_CTIME);
+ add_column(columns, ncolumns++, COL_PWD_EXPIR);
break;
case 'c':
outmode = OUT_COLON;
@@ -1293,14 +1310,14 @@ int main(int argc, char *argv[])
outmode = OUT_EXPORT;
break;
case 'f':
- columns[ncolumns++] = COL_FAILED_LOGIN;
- columns[ncolumns++] = COL_FAILED_TTY;
+ add_column(columns, ncolumns++, COL_FAILED_LOGIN);
+ add_column(columns, ncolumns++, COL_FAILED_TTY);
break;
case 'G':
- columns[ncolumns++] = COL_GID;
- columns[ncolumns++] = COL_GROUP;
- columns[ncolumns++] = COL_SGIDS;
- columns[ncolumns++] = COL_SGROUPS;
+ add_column(columns, ncolumns++, COL_GID);
+ add_column(columns, ncolumns++, COL_GROUP);
+ add_column(columns, ncolumns++, COL_SGIDS);
+ add_column(columns, ncolumns++, COL_SGROUPS);
break;
case 'g':
groups = optarg;
@@ -1309,9 +1326,9 @@ int main(int argc, char *argv[])
usage(stdout);
break;
case 'L':
- columns[ncolumns++] = COL_LAST_TTY;
- columns[ncolumns++] = COL_LAST_HOSTNAME;
- columns[ncolumns++] = COL_LAST_LOGIN;
+ add_column(columns, ncolumns++, COL_LAST_TTY);
+ add_column(columns, ncolumns++, COL_LAST_HOSTNAME);
+ add_column(columns, ncolumns++, COL_LAST_LOGIN);
break;
case 'l':
logins = optarg;
@@ -1345,11 +1362,11 @@ int main(int argc, char *argv[])
lslogins_flag |= F_USRAC;
break;
case 'p':
- columns[ncolumns++] = COL_PWDEMPTY;
- columns[ncolumns++] = COL_PWDLOCK;
- columns[ncolumns++] = COL_PWDDENY;
- columns[ncolumns++] = COL_NOLOGIN;
- columns[ncolumns++] = COL_HUSH_STATUS;
+ add_column(columns, ncolumns++, COL_PWDEMPTY);
+ add_column(columns, ncolumns++, COL_PWDLOCK);
+ add_column(columns, ncolumns++, COL_PWDDENY);
+ add_column(columns, ncolumns++, COL_NOLOGIN);
+ add_column(columns, ncolumns++, COL_HUSH_STATUS);
break;
case 'z':
outmode = OUT_NUL;
@@ -1392,7 +1409,7 @@ int main(int argc, char *argv[])
else
ctl->selinux_enabled = sl == 1;
#endif
- columns[ncolumns++] = COL_SELINUX;
+ add_column(columns, ncolumns++, COL_SELINUX);
break;
}
default:
@@ -1421,11 +1438,11 @@ int main(int argc, char *argv[])
} else if (ncolumns == 2 && !opt_o) {
/* default colummns */
- columns[ncolumns++] = COL_NPROCS;
- columns[ncolumns++] = COL_PWDLOCK;
- columns[ncolumns++] = COL_PWDDENY;
- columns[ncolumns++] = COL_LAST_LOGIN;
- columns[ncolumns++] = COL_GECOS;
+ add_column(columns, ncolumns++, COL_NPROCS);
+ add_column(columns, ncolumns++, COL_PWDLOCK);
+ add_column(columns, ncolumns++, COL_PWDDENY);
+ add_column(columns, ncolumns++, COL_LAST_LOGIN);
+ add_column(columns, ncolumns++, COL_GECOS);
}
if (require_wtmp())