summaryrefslogtreecommitdiffstats
path: root/sys-utils/lsipc.c
diff options
context:
space:
mode:
authorKarel Zak2015-07-01 11:04:21 +0200
committerKarel Zak2015-07-20 11:48:09 +0200
commit32cfe498b8224f8c18c00e83aeb8c9393ff794f3 (patch)
treeaefb52172587c24bec60fa063e8fe45c2e101e71 /sys-utils/lsipc.c
parentinclude/xalloc: add err_oom() (diff)
downloadkernel-qcow2-util-linux-32cfe498b8224f8c18c00e83aeb8c9393ff794f3.tar.gz
kernel-qcow2-util-linux-32cfe498b8224f8c18c00e83aeb8c9393ff794f3.tar.xz
kernel-qcow2-util-linux-32cfe498b8224f8c18c00e83aeb8c9393ff794f3.zip
lsipc: improve --global
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'sys-utils/lsipc.c')
-rw-r--r--sys-utils/lsipc.c203
1 files changed, 93 insertions, 110 deletions
diff --git a/sys-utils/lsipc.c b/sys-utils/lsipc.c
index e2c0c6736..bee052fda 100644
--- a/sys-utils/lsipc.c
+++ b/sys-utils/lsipc.c
@@ -98,7 +98,7 @@ enum {
/* summary (--global) */
COLDESC_IDX_SUM_FIRST,
- COL_RESOURCE,
+ COL_RESOURCE = COLDESC_IDX_SUM_FIRST,
COL_DESC,
COL_USED,
COL_LIMIT,
@@ -183,7 +183,7 @@ static const struct lsipc_coldesc coldescs[] =
/* cols for summarized information */
[COL_RESOURCE] = { "RESOURCE", N_("Resource name"), N_("Resource"), 1 },
[COL_DESC] = { "DESCRIPTION",N_("Resource description"), N_("Description"), 1 },
- [COL_USED] = { "USED", N_("Currently used"), N_("Used"), 1 },
+ [COL_USED] = { "USED", N_("Currently used"), N_("Used"), 1, SCOLS_FL_RIGHT },
[COL_LIMIT] = { "LIMIT", N_("System-wide limit"), N_("Limit"), 1, SCOLS_FL_RIGHT },
};
@@ -270,7 +270,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
fputs(_(" -m, --shmems shared memory segments\n"), out);
fputs(_(" -q, --queues message queues\n"), out);
fputs(_(" -s, --semaphores semaphores\n"), out);
- fputs(_(" -g, --global display info about about system-wide usage\n"), out);
+ fputs(_(" -g, --global info about system-wide usage (may be used with -m, -q and -s)\n"), out);
fputs(_(" -i, --id <id> print details on resource identified by <id>\n"), out);
fputs(USAGE_OPTIONS, out);
@@ -290,23 +290,23 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
fputs(_(" -z, --print0 delimit user entries with a nul character\n"), out);
fprintf(out, _("\nGeneric columns:\n"));
- for (i = COLDESC_IDX_GEN_FIRST; i < COLDESC_IDX_GEN_LAST; i++)
+ for (i = COLDESC_IDX_GEN_FIRST; i <= COLDESC_IDX_GEN_LAST; i++)
fprintf(out, " %14s %s\n", coldescs[i].name, _(coldescs[i].help));
fprintf(out, _("\nShared memory columns (--shmems):\n"));
- for (i = COLDESC_IDX_SHM_FIRST; i < COLDESC_IDX_SHM_LAST; i++)
+ for (i = COLDESC_IDX_SHM_FIRST; i <= COLDESC_IDX_SHM_LAST; i++)
fprintf(out, " %14s %s\n", coldescs[i].name, _(coldescs[i].help));
fprintf(out, _("\nMessages queues columns (--queues):\n"));
- for (i = COLDESC_IDX_MSG_FIRST; i < COLDESC_IDX_MSG_LAST; i++)
+ for (i = COLDESC_IDX_MSG_FIRST; i <= COLDESC_IDX_MSG_LAST; i++)
fprintf(out, " %14s %s\n", coldescs[i].name, _(coldescs[i].help));
fprintf(out, _("\nSemaphores columns (--semaphores):\n"));
- for (i = COLDESC_IDX_SEM_FIRST; i < COLDESC_IDX_SEM_LAST; i++)
+ for (i = COLDESC_IDX_SEM_FIRST; i <= COLDESC_IDX_SEM_LAST; i++)
fprintf(out, " %14s %s\n", coldescs[i].name, _(coldescs[i].help));
fprintf(out, _("\nSummary columns (--global):\n"));
- for (i = COLDESC_IDX_SUM_FIRST; i < COLDESC_IDX_SUM_LAST; i++)
+ for (i = COLDESC_IDX_SUM_FIRST; i <= COLDESC_IDX_SUM_LAST; i++)
fprintf(out, " %14s %s\n", coldescs[i].name, _(coldescs[i].help));
fprintf(out, USAGE_MAN_TAIL("lsipc(1)"));
@@ -458,6 +458,43 @@ static char *make_time(int mode, time_t time)
return xstrdup(buf);
}
+static void global_set_data(struct libscols_table *tb, const char *resource,
+ const char *desc, uintmax_t used, uintmax_t limit)
+{
+ struct libscols_line *ln;
+ int n;
+
+ ln = scols_table_new_line(tb, NULL);
+ if (!ln)
+ err_oom();
+
+ for (n = 0; n < ncolumns; n++) {
+ int rc = 0;
+ char *arg = NULL;
+
+ switch (columns[n]) {
+ case COL_RESOURCE:
+ rc = scols_line_set_data(ln, n, resource);
+ break;
+ case COL_DESC:
+ rc = scols_line_set_data(ln, n, desc);
+ break;
+ case COL_USED:
+ xasprintf(&arg, "%ju", used);
+ rc = scols_line_set_data(ln, n, arg);
+ break;
+ case COL_LIMIT:
+ xasprintf(&arg, "%ju", limit);
+ rc = scols_line_set_data(ln, n, arg);
+ break;
+ }
+
+ if (rc != 0)
+ err(EXIT_FAILURE, _("failed to set data"));
+ free(arg);
+ }
+}
+
static void do_sem(int id, struct lsipc_control *ctl, struct libscols_table *tb)
{
int n = 0;
@@ -600,46 +637,20 @@ static void do_sem_global(struct libscols_table *tb)
{
struct sem_data *semds, *semdsp;
struct ipc_limits lim;
- int sems = 0, sets = 0, n = 0;
- struct libscols_line *ln;
- char *result = NULL;
+ int nsems = 0, nsets = 0;
- if (ipc_sem_get_info(-1, &semds) < 1)
- return;
ipc_sem_get_limits(&lim);
- for (semdsp = semds; semdsp->next != NULL; semdsp = semdsp->next) {
- ++sets;
- sems += semds->sem_nsems;
+ if (ipc_sem_get_info(-1, &semds) > 0) {
+ for (semdsp = semds; semdsp->next != NULL; semdsp = semdsp->next) {
+ ++nsets;
+ nsems += semds->sem_nsems;
+ }
+ ipc_sem_free_info(semds);
}
- ln = scols_table_new_line(tb, NULL);
- scols_line_set_data(ln, n++, "SEMMNS");
- scols_line_set_data(ln, n++, "Total number of semaphores");
-
- xasprintf(&result, "%d", sems);
- scols_line_set_data(ln, n++, result);
- free(result);
-
- xasprintf(&result, "%d", lim.semmns);
- scols_line_set_data(ln, n, result);
- free(result);
-
-
- n = 0;
- ln = scols_table_new_line(tb, NULL);
-
- scols_line_set_data(ln, n++, "SEMMNI");
- scols_line_set_data(ln, n++, "Number of Semaphore IDs");
- xasprintf(&result, "%d", sets);
- scols_line_set_data(ln, n++, result);
- free(result);
-
- xasprintf(&result, "%d", lim.semmni);
- scols_line_set_data(ln, n, result);
- free(result);
-
- ipc_sem_free_info(semds);
+ global_set_data(tb, "SEMMNS", _("Total number of semaphores"), nsems, lim.semmns);
+ global_set_data(tb, "SEMMNI", _("Number of Semaphore IDs"), nsets, lim.semmni);
}
static void do_msg(int id, struct lsipc_control *ctl, struct libscols_table *tb)
@@ -781,34 +792,25 @@ static void do_msg(int id, struct lsipc_control *ctl, struct libscols_table *tb)
ipc_msg_free_info(msgds);
}
+
static void do_msg_global(struct libscols_table *tb)
{
struct msg_data *msgds, *msgdsp;
struct ipc_limits lim;
- struct libscols_line *ln = scols_table_new_line(tb, NULL);
- int msgqs = 0, n = 0;
- char *result;
+ int msgqs = 0;
- if (ipc_msg_get_info(-1, &msgds) < 1)
- return;
ipc_msg_get_limits(&lim);
- for (msgdsp = msgds; msgdsp->next != NULL; msgdsp = msgdsp->next) {
- ++msgqs;
+ /* count number of used queues */
+ if (ipc_msg_get_info(-1, &msgds) > 0) {
+ for (msgdsp = msgds; msgdsp->next != NULL; msgdsp = msgdsp->next)
+ ++msgqs;
+ ipc_msg_free_info(msgds);
}
- scols_line_set_data(ln, n++, "MSGMNI");
- scols_line_set_data(ln, n++, "Number of message queues");
-
- xasprintf(&result, "%d", msgqs);
- scols_line_set_data(ln, n++, result);
- free(result);
-
- xasprintf(&result, "%d", lim.msgmni);
- scols_line_set_data(ln, n, result);
- free(result);
-
- ipc_msg_free_info(msgds);
+ global_set_data(tb, "MSGMNI", _("Number of message queues"), msgqs, lim.msgmni);
+ global_set_data(tb, "MSGMAX", _("Max size of message (bytes)"), 0, lim.msgmax);
+ global_set_data(tb, "MSGMNB", _("Default max size of queue (bytes)"), 0, lim.msgmnb);
}
static void do_shm(int id, struct lsipc_control *ctl, struct libscols_table *tb)
@@ -829,6 +831,8 @@ static void do_shm(int id, struct lsipc_control *ctl, struct libscols_table *tb)
for (shmdsp = shmds; shmdsp->next != NULL || id > -1 ; shmdsp = shmdsp->next) {
ln = scols_table_new_line(tb, NULL);
+ if (!ln)
+ err_oom();
/* no need to call getpwuid() for the same user */
if (!(pw && pw->pw_uid == shmdsp->shm_perm.uid))
@@ -991,48 +995,20 @@ static void do_shm(int id, struct lsipc_control *ctl, struct libscols_table *tb)
static void do_shm_global(struct libscols_table *tb)
{
struct shm_data *shmds, *shmdsp;
- int n = 0;
- uint64_t segs = 0, segsz = 0;
+ uint64_t nsegs = 0, sum_segsz = 0;
struct ipc_limits lim;
- struct libscols_line *ln;
- char *result = NULL;
- if (ipc_shm_get_info(-1, &shmds) < 1)
- return;
ipc_shm_get_limits(&lim);
- for (shmdsp = shmds; shmdsp->next != NULL; shmdsp = shmdsp->next) {
- ++segs;
- segsz += shmdsp->shm_segsz;
+ if (ipc_shm_get_info(-1, &shmds) > 0) {
+ for (shmdsp = shmds; shmdsp->next != NULL; shmdsp = shmdsp->next) {
+ ++nsegs;
+ sum_segsz += shmdsp->shm_segsz;
+ }
}
- ln = scols_table_new_line(tb, NULL);
-
- scols_line_set_data(ln, n++, "SHMMNI");
- scols_line_set_data(ln, n++, "Shared memory segments");
-
- xasprintf(&result, "%lu", segs);
- scols_line_set_data(ln, n++, result);
- free(result);
-
- xasprintf(&result, "%lu", lim.shmmni);
- scols_line_set_data(ln, n, result);
- free(result);
-
-
- n = 0;
- ln = scols_table_new_line(tb, NULL);
-
- scols_line_set_data(ln, n++, "SHMALL");
- scols_line_set_data(ln, n++, "Shared memory pages");
-
- xasprintf(&result, "%lu", segsz / getpagesize());
- scols_line_set_data(ln, n++, result);
- free(result);
-
- xasprintf(&result, "%lu", lim.shmall);
- scols_line_set_data(ln, n, result);
- free(result);
+ global_set_data(tb, "SHMMNI", _("Shared memory segments"), nsegs, lim.shmmni);
+ global_set_data(tb, "SHMALL", _("Shared memory pages"), sum_segsz / getpagesize(), lim.shmall);
ipc_shm_free_info(shmds);
}
@@ -1082,7 +1058,8 @@ int main(int argc, char *argv[])
static const ul_excl_t excl[] = { /* rows and cols in ASCII order */
{ 'J', 'e', 'n', 'r', 'z', OPT_COLON },
- { 'c', 'g', 'i', 'o', 't' },
+ { 'c', 'g', 'i', 't' },
+ { 'c', 'i', 'o', 't' },
{ 'm', 'q', 's' },
{ 0 }
};
@@ -1126,16 +1103,18 @@ int main(int argc, char *argv[])
break;
case 'g':
global = 1;
+ LOWER = COLDESC_IDX_SUM_FIRST;
+ UPPER = COLDESC_IDX_SUM_LAST;
break;
case 'q':
msg = 1;
- LOWER = COL_USEDBYTES;
- UPPER = COL_LRPID;
+ LOWER = COLDESC_IDX_MSG_FIRST;
+ UPPER = COLDESC_IDX_MSG_LAST;
break;
case 'm':
shm = 1;
- LOWER = COL_SIZE;
- UPPER = COL_LPID;
+ LOWER = COLDESC_IDX_SHM_FIRST;
+ UPPER = COLDESC_IDX_SHM_LAST;
break;
case 'n':
outmode = OUT_NEWLINE;
@@ -1145,8 +1124,8 @@ int main(int argc, char *argv[])
break;
case 's':
sem = 1;
- LOWER = COL_NSEMS;
- UPPER = COL_OTIME;
+ LOWER = COLDESC_IDX_SEM_FIRST;
+ UPPER = COLDESC_IDX_SEM_LAST;
break;
case OPT_NOTRUNC:
ctl->notrunc = 1;
@@ -1179,11 +1158,13 @@ int main(int argc, char *argv[])
}
}
- if (msg + shm + sem != 1)
+ if (msg + shm + sem != 1 && !global)
errx (EXIT_FAILURE,
_("One of --shmems, --queues or --semaphores must be specified"));
+ if (global && msg + shm + sem == 0)
+ msg = shm = sem = 1;
- if (global) {
+ if (global && !opt_o) {
add_column(columns, ncolumns++, COL_RESOURCE);
add_column(columns, ncolumns++, COL_DESC);
add_column(columns, ncolumns++, COL_USED);
@@ -1261,16 +1242,18 @@ int main(int argc, char *argv[])
do_msg_global(tb);
else
do_msg(id, ctl, tb);
- } else if (shm) {
+ }
+ if (shm) {
if (global)
do_shm_global(tb);
else
do_shm(id, ctl, tb);
- } else if (sem) {
+ }
+ if (sem) {
if (global)
do_sem_global(tb);
else
- do_sem(id, ctl, tb);
+ do_sem(id, ctl, tb);
}
print_table(tb);