list_rqs.c revision e0ed7404719a9ddd2ba427a80db5365c8bad18c0
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Copyright 1987, 1988 by MIT Student Information Processing Board
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Permission to use, copy, modify, and distribute this software and
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * its documentation for any purpose is hereby granted, provided that
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * advertising or publicity pertaining to distribution of the software
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * without specific, written prior permission.  M.I.T. and the
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * M.I.T. S.I.P.B. make no representations about the suitability of
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * this software for any purpose.  It is provided "as is" without
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * express or implied warranty.
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ss_internal.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <signal.h>
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <setjmp.h>
16b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include <sys/wait.h>
1786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
18b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.comtypedef void sigret_t;
19b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic char const twentyfive_spaces[26] =
21fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com    "                         ";
22fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.comstatic char const NL[2] = "\n";
23fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com
24fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.comvoid ss_list_requests(int argc __SS_ATTR((unused)),
25fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com		      const char * const *argv __SS_ATTR((unused)),
26fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com		      int sci_idx, void *infop __SS_ATTR((unused)))
27fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com{
28fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com    ss_request_entry *entry;
29fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com    char const * const *name;
30fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com    int spacing;
317ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    ss_request_table **table;
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
330456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com    char buffer[BUFSIZ];
340456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com    FILE *output;
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int fd;
3630da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com    sigset_t omask, igmask;
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    sigret_t (*func)(int);
3830da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com#ifndef NO_FORK
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int waitb;
4030da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com#endif
411447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
42d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    sigemptyset(&igmask);
43d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    sigaddset(&igmask, SIGINT);
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    sigprocmask(SIG_BLOCK, &igmask, &omask);
45d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    func = signal(SIGINT, SIG_IGN);
46d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    fd = ss_pager_create();
47d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    if (fd < 0) {
48d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        perror("ss_pager_create");
49d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        (void) signal(SIGINT, func);
50d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        return;
51d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    }
52d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    output = fdopen(fd, "w");
53d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0);
54d252db03d9650013b545ef9781fe993c07f8f314reed@android.com
551447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com    fprintf (output, "Available %s requests:\n\n",
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com	     ss_info (sci_idx) -> subsystem_name);
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
581447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com    for (table = ss_info(sci_idx)->rqt_tables; *table; table++) {
59d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        entry = (*table)->requests;
60d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        for (; entry->command_names; entry++) {
61d252db03d9650013b545ef9781fe993c07f8f314reed@android.com            spacing = -2;
621447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com            buffer[0] = '\0';
63d252db03d9650013b545ef9781fe993c07f8f314reed@android.com            if (entry->flags & SS_OPT_DONT_LIST)
641447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com                continue;
65d252db03d9650013b545ef9781fe993c07f8f314reed@android.com            for (name = entry->command_names; *name; name++) {
661447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com                int len = strlen(*name);
67d252db03d9650013b545ef9781fe993c07f8f314reed@android.com                strncat(buffer, *name, len);
68d252db03d9650013b545ef9781fe993c07f8f314reed@android.com                spacing += len + 2;
69d252db03d9650013b545ef9781fe993c07f8f314reed@android.com                if (name[1]) {
70d252db03d9650013b545ef9781fe993c07f8f314reed@android.com                    strcat(buffer, ", ");
71d252db03d9650013b545ef9781fe993c07f8f314reed@android.com                }
72d252db03d9650013b545ef9781fe993c07f8f314reed@android.com            }
73d252db03d9650013b545ef9781fe993c07f8f314reed@android.com            if (spacing > 23) {
7430da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com                strcat(buffer, NL);
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fputs(buffer, output);
7643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com                spacing = 0;
7743c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com                buffer[0] = '\0';
78f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com            }
7943c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com            strncat(buffer, twentyfive_spaces, 25-spacing);
8030da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com            strcat(buffer, entry->info_string);
811447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com            strcat(buffer, NL);
82a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com            fputs(buffer, output);
83a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        }
84a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    }
85a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    fclose(output);
86a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#ifndef NO_FORK
87a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    wait(&waitb);
88a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#endif
898da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com    (void) signal(SIGINT, func);
908da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com}
918da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com