1 /*
2 * Copyright 1995-2002 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
5
6 #pragma ident "%Z%%M% %I% %E% SMI"
7
8 /*
9 * Test client for kwarnd. This program is not shipped on the binary
10 * release. This code was taken and modified from gssdtest.c
11 */
12
13 #include <stdio.h>
14 #include <strings.h>
15 #include <ctype.h>
16 #include <stdlib.h>
17 #include "kwarnd.h"
18 #include <rpc/rpc.h>
19
20 #define LOOP_COUNTER 100
21
22 #define OCTAL_MACRO "%03.3o."
23 #define MALLOC(n) malloc(n)
24 #define CALLOC(n, s) calloc((n), (s))
25 #define FREE(x, n) free(x)
26
27 static void instructs(void);
28 static void usage(void);
29 static int parse_input_line(char *, int *, char ***);
30 extern uid_t getuid(void);
31
32 static void _kwarnd_add_warning(int, char **);
33 static void _kwarnd_del_warning(int, char **);
34
35 static int do_kwarndtest(char *buf);
36
37 extern OM_UINT32 kwarn_add_warning();
38 extern OM_UINT32 kwarn_del_warning();
39
read_line(char * buf,int size)40 static int read_line(char *buf, int size)
41 {
42 int len;
43
44 /* read the next line. If cntl-d, return with zero char count */
45 printf(gettext("\n> "));
46
47 if (fgets(buf, size, stdin) == NULL)
48 return (0);
49
50 len = strlen(buf);
51 buf[--len] = '\0';
52 return (len);
53 }
54
55 int
main()56 main()
57 {
58 char buf[512];
59 int len, ret;
60
61 /* Print out usage and instructions to start off the session */
62
63 instructs();
64 usage();
65
66 /*
67 * Loop, repeatedly calling parse_input_line() to get the
68 * next line and parse it into argc and argv. Act on the
69 * arguements found on the line.
70 */
71
72 do {
73 len = read_line(buf, 512);
74 if (len)
75 ret = do_kwarndtest(buf);
76 } while (len && !ret);
77
78 return (0);
79 }
80
81 static int
do_kwarndtest(char * buf)82 do_kwarndtest(char *buf)
83 {
84 int argc;
85 char **argv, **argv_array;
86
87 char *cmd;
88
89 argv = 0;
90
91 if (parse_input_line(buf, &argc, &argv) == 0) {
92 printf(gettext("\n"));
93 return (1);
94 }
95
96 if (argc == 0) {
97 usage();
98 /*LINTED*/
99 FREE(argv_array, (argc+1)*sizeof (char *));
100 return (0);
101 }
102
103 /*
104 * remember argv_array address, which is memory calloc'd by
105 * parse_input_line, so it can be free'd at the end of the loop.
106 */
107
108 argv_array = argv;
109
110 cmd = argv[0];
111
112 argc--;
113 argv++;
114
115 if (strcmp(cmd, "kwarn_add_warning") == 0 ||
116 strcmp(cmd, "add") == 0) {
117 _kwarnd_add_warning(argc, argv);
118 } else if (strcmp(cmd, "kwarn_del_warning") == 0 ||
119 strcmp(cmd, "delete") == 0) {
120 _kwarnd_del_warning(argc, argv);
121 } else if (strcmp(cmd, "exit") == 0) {
122 printf(gettext("\n"));
123 FREE(argv_array, (argc+2) * sizeof (char *));
124 return (1);
125 } else
126 usage();
127
128 /* free argv array */
129
130 FREE(argv_array, (argc+2) * sizeof (char *));
131 return (0);
132 }
133
134 static void
_kwarnd_add_warning(int argc,char ** argv)135 _kwarnd_add_warning(int argc, char **argv)
136 {
137 OM_UINT32 status;
138 time_t exptime;
139 time_t now;
140
141 /* set up the arguments specified in the input parameters */
142
143 if (argc == 0) {
144 usage();
145 return;
146 }
147
148 if (argc != 2) {
149 usage();
150 return;
151 }
152
153 time(&now);
154 exptime = atol(argv[1]);
155 exptime = now + exptime;
156
157 status = kwarn_add_warning(argv[0], exptime);
158
159 if (status == 0) {
160 printf(gettext("\nadd of credential\n\n"));
161 printf(gettext("warning message successful for \"%s\"\n\n"),
162 argv[0]);
163 } else {
164 printf(gettext("server ret err (octal) %o (%s)\n"),
165 status, gettext("add warning error"));
166 }
167
168 return;
169
170 }
171
172 static void
_kwarnd_del_warning(int argc,char ** argv)173 _kwarnd_del_warning(int argc, char **argv)
174 {
175 OM_UINT32 status;
176
177 if (argc != 1) {
178 usage();
179 return;
180 }
181
182 status = kwarn_del_warning(argv[0]);
183
184 if (status == 0) {
185 printf(gettext("delete of principal warning message"
186 "for %s successful"),
187 argv[0]);
188 } else {
189 printf(gettext("delete of principal %s unsuccessful\n\n"),
190 argv[0]);
191 }
192 }
193
194 static void
instructs(void)195 instructs(void)
196 {
197 fprintf(stderr,
198 gettext(
199 "\nThis program will test kwarnd. kwarnd must be running as root. Enter\n"
200 "the desired command and the principal to be added/deleted. If adding a\n"
201 "principal, also include the expiration time in seconds.\n"));
202 }
203
204 static void
usage(void)205 usage(void)
206 {
207 fprintf(stderr,
208 gettext(
209 "\nusage:\t[kwarn_add_warning | add] (principal) (exptime)\n"
210 "\t[kwarn_del_warning | delete] (principal)\n"
211 "\texit\n\n"));
212 }
213
214 /* Copied from parse_argv(), then modified */
215
216 static int
parse_input_line(char * input_line,int * argc,char *** argv)217 parse_input_line(char *input_line, int *argc, char ***argv)
218 {
219 const char nil = '\0';
220 char *chptr;
221 int chr_cnt;
222 int arg_cnt = 0;
223 int ch_was_space = 1;
224 int ch_is_space;
225
226 chr_cnt = strlen(input_line);
227
228 /* Count the arguments in the input_line string */
229
230 *argc = 1;
231
232 for (chptr = &input_line[0]; *chptr != nil; chptr++) {
233 ch_is_space = isspace(*chptr);
234 if (ch_is_space && !ch_was_space) {
235 (*argc)++;
236 }
237 ch_was_space = ch_is_space;
238 }
239
240 if (ch_was_space) {
241 (*argc)--;
242 } /* minus trailing spaces */
243
244 /* Now that we know how many args calloc the argv array */
245
246 *argv = (char **)CALLOC((*argc)+1, sizeof (char *));
247 chptr = (char *)(&input_line[0]);
248
249 for (ch_was_space = 1; *chptr != nil; chptr++) {
250 ch_is_space = isspace(*chptr);
251 if (ch_is_space) {
252 *chptr = nil; /* replace each space with nil */
253 } else if (ch_was_space) { /* begining of word? */
254 (*argv)[arg_cnt++] = chptr; /* new argument ? */
255 }
256
257 ch_was_space = ch_is_space;
258 }
259
260 return (chr_cnt);
261 }
262