]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - sys-utils/ipcs.c
su: use lib/pty-session.c code for --pty
[thirdparty/util-linux.git] / sys-utils / ipcs.c
index 4f3d23d90762afcc0cd1560d8c92b6133a260ba7..2d18a13cced6db1640b86f2febf28e2fa4f408ec 100644 (file)
@@ -46,8 +46,9 @@ static void print_msg (int id, int unit);
 /* we read time as int64_t from /proc, so cast... */
 #define xctime(_x)     ctime((time_t *) (_x))
 
-static void __attribute__ ((__noreturn__)) usage(FILE * out)
+static void __attribute__((__noreturn__)) usage(void)
 {
+       FILE *out = stdout;
        fputs(USAGE_HEADER, out);
        fprintf(out, _(" %1$s [resource-option...] [output-option]\n"
                       " %1$s -m|-q|-s -i <id>\n"), program_invocation_short_name);
@@ -57,8 +58,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
 
        fputs(USAGE_OPTIONS, out);
        fputs(_(" -i, --id <id>  print details on resource identified by <id>\n"), out);
-       fputs(USAGE_HELP, out);
-       fputs(USAGE_VERSION, out);
+       printf(USAGE_HELP_OPTIONS(16));
 
        fputs(USAGE_SEPARATOR, out);
        fputs(_("Resource options:\n"), out);
@@ -76,9 +76,9 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
        fputs(_(" -u, --summary     show status summary\n"), out);
        fputs(_("     --human       show sizes in human-readable format\n"), out);
        fputs(_(" -b, --bytes       show sizes in bytes\n"), out);
-       fprintf(out, USAGE_MAN_TAIL("ipcs(1)"));
+       printf(USAGE_MAN_TAIL("ipcs(1)"));
 
-       exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
+       exit(EXIT_SUCCESS);
 }
 
 int main (int argc, char **argv)
@@ -108,7 +108,7 @@ int main (int argc, char **argv)
        setlocale(LC_ALL, "");
        bindtextdomain(PACKAGE, LOCALEDIR);
        textdomain(PACKAGE);
-       atexit(close_stdout);
+       close_stdout_atexit();
 
        while ((opt = getopt_long(argc, argv, options, longopts, NULL)) != -1) {
                switch (opt) {
@@ -149,11 +149,11 @@ int main (int argc, char **argv)
                case 'b':
                        unit = IPC_UNIT_BYTES;
                        break;
+
                case 'h':
-                       usage(stdout);
+                       usage();
                case 'V':
-                       printf(UTIL_LINUX_VERSION);
-                       return EXIT_SUCCESS;
+                       print_version(EXIT_SUCCESS);
                default:
                        errtryhelp(EXIT_FAILURE);
                }
@@ -198,6 +198,7 @@ static void do_shm (char format, int unit)
        case LIMITS:
        {
                struct ipc_limits lim;
+               uint64_t tmp, pgsz = getpagesize();
 
                if (ipc_shm_get_limits(&lim)) {
                        printf (_("unable to fetch shared memory limits\n"));
@@ -207,9 +208,14 @@ static void do_shm (char format, int unit)
                printf (_("max number of segments = %ju\n"), lim.shmmni);
                ipc_print_size(unit == IPC_UNIT_DEFAULT ? IPC_UNIT_KB : unit,
                               _("max seg size"), lim.shmmax, "\n", 0);
+
+               tmp = (uint64_t) lim.shmall * pgsz;
+               /* overflow handling, at least we don't print ridiculous small values */
+               if (lim.shmall != 0 && tmp / lim.shmall != pgsz) {
+                       tmp = UINT64_MAX - (UINT64_MAX % pgsz);
+               }
                ipc_print_size(unit == IPC_UNIT_DEFAULT ? IPC_UNIT_KB : unit,
-                              _("max total shared memory"),
-                              (uint64_t) lim.shmall * getpagesize(), "\n", 0);
+                              _("max total shared memory"), tmp, "\n", 0);
                ipc_print_size(unit == IPC_UNIT_DEFAULT ? IPC_UNIT_BYTES : unit,
                               _("min seg size"), lim.shmmin, "\n", 0);
                return;