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