diff options
Diffstat (limited to 'kerberosIV/ss/list_rqs.c')
-rw-r--r-- | kerberosIV/ss/list_rqs.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/kerberosIV/ss/list_rqs.c b/kerberosIV/ss/list_rqs.c new file mode 100644 index 00000000000..ed596e3d007 --- /dev/null +++ b/kerberosIV/ss/list_rqs.c @@ -0,0 +1,124 @@ +/* $Id: list_rqs.c,v 1.1 1995/12/14 06:52:47 tholo Exp $ */ + +/*- + * Copyright 1987, 1988 by the Student Information Processing Board + * of the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software + * and its documentation for any purpose and without fee is + * hereby granted, provided that the above copyright notice + * appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, + * and that the names of M.I.T. and the M.I.T. S.I.P.B. not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * M.I.T. and the M.I.T. S.I.P.B. make no representations about + * the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + */ + +#include "ss_internal.h" +#include <signal.h> +#include <setjmp.h> +#include <sys/types.h> +#include <sys/wait.h> + +#ifdef lint /* "lint returns a value which is sometimes ignored" */ +#define DONT_USE(x) x=x; +#else /* !lint */ +#define DONT_USE(x) ; +#endif /* lint */ + +static char const twentyfive_spaces[26] = + " "; +static char const NL[2] = "\n"; + +int +ss_list_requests(argc, argv, sci_idx, info_ptr) + int argc; + char **argv; + int sci_idx; + pointer info_ptr; +{ + register ss_request_entry *entry; + register char const * const *name; + register int spacing; + register ss_request_table **table; + + char buffer[BUFSIZ]; + FILE *output; + int fd; +#ifndef NPOSIX + struct sigaction nsig, osig; + sigset_t nmask, omask; + int waitb; +#else + int (*func)(); + int mask; + union wait waitb; +#endif + + DONT_USE(argc); + DONT_USE(argv); + +#ifndef NPOSIX + sigemptyset(&nmask); + sigaddset(&nmask, SIGINT); + sigprocmask(SIG_BLOCK, &nmask, &omask); + + nsig.sa_handler = SIG_IGN; + sigemptyset(&nsig.sa_mask); + nsig.sa_flags = 0; + sigaction(SIGINT, &nsig, &osig); +#else + mask = sigblock(sigmask(SIGINT)); + func = signal(SIGINT, SIG_IGN); +#endif + fd = ss_pager_create(); + output = fdopen(fd, "w"); +#ifndef NPOSIX + sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); +#else + sigsetmask(mask); +#endif + + fprintf (output, "Available %s requests:\n\n", + ss_info (sci_idx) -> subsystem_name); + + for (table = ss_info(sci_idx)->rqt_tables; *table; table++) { + entry = (*table)->requests; + for (; entry->command_names; entry++) { + spacing = -2; + buffer[0] = '\0'; + if (entry->flags & SS_OPT_DONT_LIST) + continue; + for (name = entry->command_names; *name; name++) { + register int len = strlen(*name); + strncat(buffer, *name, len); + spacing += len + 2; + if (name[1]) { + strcat(buffer, ", "); + } + } + if (spacing > 23) { + strcat(buffer, NL); + fputs(buffer, output); + spacing = 0; + buffer[0] = '\0'; + } + strncat(buffer, twentyfive_spaces, 25-spacing); + strcat(buffer, entry->info_string); + strcat(buffer, NL); + fputs(buffer, output); + } + } + fclose(output); +#ifndef NO_FORK + wait(&waitb); +#endif +#ifndef NPOSIX + sigaction(SIGINT, &osig, (struct sigaction *)0); +#else + (void) signal(SIGINT, func); +#endif +} |