2 * Copyright 1995-2002 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
5 * Copyright 2013 Nexenta Systems. All rights reserved.
9 * Test client for kwarnd. This program is not shipped on the binary
10 * release. This code was taken and modified from gssdtest.c
20 #define LOOP_COUNTER 100
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)
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);
32 static void _kwarnd_add_warning(int, char **);
33 static void _kwarnd_del_warning(int, char **);
35 static int do_kwarndtest(char *buf
);
37 extern OM_UINT32
kwarn_add_warning();
38 extern OM_UINT32
kwarn_del_warning();
40 static int read_line(char *buf
, int size
)
44 /* read the next line. If cntl-d, return with zero char count */
45 printf(gettext("\n> "));
47 if (fgets(buf
, size
, stdin
) == NULL
)
61 /* Print out usage and instructions to start off the session */
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.
73 len
= read_line(buf
, 512);
75 ret
= do_kwarndtest(buf
);
76 } while (len
&& !ret
);
82 do_kwarndtest(char *buf
)
85 char **argv
, **argv_array
;
91 if (parse_input_line(buf
, &argc
, &argv
) == 0) {
92 printf(gettext("\n"));
98 FREE(argv
, (argc
+1)*sizeof (char *));
103 * remember argv_array address, which is memory calloc'd by
104 * parse_input_line, so it can be free'd at the end of the loop.
114 if (strcmp(cmd
, "kwarn_add_warning") == 0 ||
115 strcmp(cmd
, "add") == 0) {
116 _kwarnd_add_warning(argc
, argv
);
117 } else if (strcmp(cmd
, "kwarn_del_warning") == 0 ||
118 strcmp(cmd
, "delete") == 0) {
119 _kwarnd_del_warning(argc
, argv
);
120 } else if (strcmp(cmd
, "exit") == 0) {
121 printf(gettext("\n"));
122 FREE(argv_array
, (argc
+2) * sizeof (char *));
127 /* free argv array */
129 FREE(argv_array
, (argc
+2) * sizeof (char *));
134 _kwarnd_add_warning(int argc
, char **argv
)
140 /* set up the arguments specified in the input parameters */
153 exptime
= atol(argv
[1]);
154 exptime
= now
+ exptime
;
156 status
= kwarn_add_warning(argv
[0], exptime
);
159 printf(gettext("\nadd of credential\n\n"));
160 printf(gettext("warning message successful for \"%s\"\n\n"),
163 printf(gettext("server ret err (octal) %o (%s)\n"),
164 status
, gettext("add warning error"));
172 _kwarnd_del_warning(int argc
, char **argv
)
181 status
= kwarn_del_warning(argv
[0]);
184 printf(gettext("delete of principal warning message"
185 "for %s successful"),
188 printf(gettext("delete of principal %s unsuccessful\n\n"),
198 "\nThis program will test kwarnd. kwarnd must be running as root. Enter\n"
199 "the desired command and the principal to be added/deleted. If adding a\n"
200 "principal, also include the expiration time in seconds.\n"));
208 "\nusage:\t[kwarn_add_warning | add] (principal) (exptime)\n"
209 "\t[kwarn_del_warning | delete] (principal)\n"
213 /* Copied from parse_argv(), then modified */
216 parse_input_line(char *input_line
, int *argc
, char ***argv
)
218 const char nil
= '\0';
222 int ch_was_space
= 1;
225 chr_cnt
= strlen(input_line
);
227 /* Count the arguments in the input_line string */
231 for (chptr
= &input_line
[0]; *chptr
!= nil
; chptr
++) {
232 ch_is_space
= isspace(*chptr
);
233 if (ch_is_space
&& !ch_was_space
) {
236 ch_was_space
= ch_is_space
;
241 } /* minus trailing spaces */
243 /* Now that we know how many args calloc the argv array */
245 *argv
= (char **)CALLOC((*argc
)+1, sizeof (char *));
246 chptr
= (char *)(&input_line
[0]);
248 for (ch_was_space
= 1; *chptr
!= nil
; chptr
++) {
249 ch_is_space
= isspace(*chptr
);
251 *chptr
= nil
; /* replace each space with nil */
252 } else if (ch_was_space
) { /* begining of word? */
253 (*argv
)[arg_cnt
++] = chptr
; /* new argument ? */
256 ch_was_space
= ch_is_space
;