Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/krb5/src/util/ss/list_rqs.c
34889 views
1
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
/*
3
* Copyright 1987, 1988 by MIT Student Information Processing Board
4
*
5
* For copyright information, see copyright.h.
6
*/
7
#include "copyright.h"
8
#include "ss_internal.h"
9
#include <signal.h>
10
#include <setjmp.h>
11
#include <sys/wait.h>
12
13
#ifdef lint /* "lint returns a value which is sometimes ignored" */
14
#define DONT_USE(x) x=x;
15
#else /* !lint */
16
#define DONT_USE(x) ;
17
#endif /* lint */
18
19
static char const twentyfive_spaces[26] =
20
" ";
21
static char const NL[2] = "\n";
22
23
void
24
ss_list_requests(int argc, const char * const *argv, int sci_idx,
25
void *info_ptr)
26
{
27
ss_request_entry *entry;
28
char const *const *name;
29
int spacing;
30
ss_request_table **table;
31
32
char buffer[BUFSIZ];
33
FILE *output;
34
int fd;
35
#ifdef POSIX_SIGNALS
36
struct sigaction nsig, osig;
37
sigset_t nmask, omask;
38
#else
39
int mask;
40
void (*func)();
41
#endif
42
#ifndef WAIT_USES_INT
43
union wait waitb;
44
#else
45
int waitb;
46
#endif
47
48
DONT_USE(argc);
49
DONT_USE(argv);
50
51
#ifdef POSIX_SIGNALS
52
sigemptyset(&nmask);
53
sigaddset(&nmask, SIGINT);
54
sigprocmask(SIG_BLOCK, &nmask, &omask);
55
56
nsig.sa_handler = SIG_IGN;
57
sigemptyset(&nsig.sa_mask);
58
nsig.sa_flags = 0;
59
sigaction(SIGINT, &nsig, &osig);
60
#else
61
mask = sigblock(sigmask(SIGINT));
62
func = signal(SIGINT, SIG_IGN);
63
#endif
64
65
fd = ss_pager_create(); /* FD_CLOEXEC set */
66
output = fdopen(fd, "w");
67
68
#ifdef POSIX_SIGNALS
69
sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
70
#else
71
sigsetmask(mask);
72
#endif
73
74
fprintf (output, "Available %s requests:\n\n",
75
ss_info (sci_idx) -> subsystem_name);
76
77
for (table = ss_info(sci_idx)->rqt_tables; *table; table++) {
78
entry = (*table)->requests;
79
for (; entry->command_names; entry++) {
80
spacing = -2;
81
buffer[0] = '\0';
82
if (entry->flags & SS_OPT_DONT_LIST)
83
continue;
84
buffer[sizeof(buffer) - 1] = '\0';
85
for (name = entry->command_names; *name; name++) {
86
int len = strlen(*name);
87
strncat(buffer, *name, sizeof(buffer) - 1 - strlen(buffer));
88
spacing += len + 2;
89
if (name[1]) {
90
strncat(buffer, ", ", sizeof(buffer) - 1 - strlen(buffer));
91
}
92
}
93
if (spacing > 23) {
94
strncat(buffer, NL, sizeof(buffer) - 1 - strlen(buffer));
95
fputs(buffer, output);
96
spacing = 0;
97
buffer[0] = '\0';
98
}
99
strncat(buffer, twentyfive_spaces, sizeof(buffer) - 1 - (25-spacing));
100
strncpy(buffer + 25, entry->info_string, sizeof(buffer) - 1 - 25);
101
strncat(buffer, NL, sizeof(buffer) - 1 - strlen(buffer));
102
fputs(buffer, output);
103
}
104
}
105
fclose(output);
106
#ifndef NO_FORK
107
wait(&waitb);
108
#endif
109
#ifdef POSIX_SIGNALS
110
sigaction(SIGINT, &osig, (struct sigaction *)0);
111
#else
112
(void) signal(SIGINT, func);
113
#endif
114
}
115
116