119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright 1987, 1988 by MIT Student Information Processing Board 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Permission to use, copy, modify, and distribute this software and 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * its documentation for any purpose is hereby granted, provided that 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * advertising or publicity pertaining to distribution of the software 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * without specific, written prior permission. M.I.T. and the 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * M.I.T. S.I.P.B. make no representations about the suitability of 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * this software for any purpose. It is provided "as is" without 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * express or implied warranty. 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ss_internal.h" 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <signal.h> 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <setjmp.h> 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/wait.h> 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttypedef void sigret_t; 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char const twentyfive_spaces[26] = 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project " "; 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char const NL[2] = "\n"; 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ss_list_requests(int argc __SS_ATTR((unused)), 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char * const *argv __SS_ATTR((unused)), 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int sci_idx, void *infop __SS_ATTR((unused))) 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_request_entry *entry; 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char const * const *name; 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int spacing; 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_request_table **table; 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buffer[BUFSIZ]; 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *output; 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd; 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sigset_t omask, igmask; 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sigret_t (*func)(int); 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef NO_FORK 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int waitb; 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sigemptyset(&igmask); 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sigaddset(&igmask, SIGINT); 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sigprocmask(SIG_BLOCK, &igmask, &omask); 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project func = signal(SIGINT, SIG_IGN); 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = ss_pager_create(); 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project output = fdopen(fd, "w"); 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sigprocmask(SIG_SETMASK, &omask, (sigset_t *) 0); 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf (output, "Available %s requests:\n\n", 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_info (sci_idx) -> subsystem_name); 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (table = ss_info(sci_idx)->rqt_tables; *table; table++) { 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project entry = (*table)->requests; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (; entry->command_names; entry++) { 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project spacing = -2; 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project buffer[0] = '\0'; 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (entry->flags & SS_OPT_DONT_LIST) 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (name = entry->command_names; *name; name++) { 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int len = strlen(*name); 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strncat(buffer, *name, len); 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project spacing += len + 2; 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (name[1]) { 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcat(buffer, ", "); 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (spacing > 23) { 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcat(buffer, NL); 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(buffer, output); 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project spacing = 0; 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project buffer[0] = '\0'; 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strncat(buffer, twentyfive_spaces, 25-spacing); 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcat(buffer, entry->info_string); 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcat(buffer, NL); 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(buffer, output); 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fclose(output); 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef NO_FORK 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project wait(&waitb); 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (void) signal(SIGINT, func); 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 86