]>
Commit | Line | Data |
---|---|---|
5d429b61 | 1 | /* |
2 | * Command line oriented Moira users tool. | |
3 | * | |
4 | * zacheiss@mit.edu, September 2001 | |
5 | * | |
6 | * Inspired by blanche | |
7 | * | |
8 | * Copyright (C) 2000, 2001 by the Massachusetts Institute of Technology. | |
9 | * For copying and distribution information, please see the file | |
10 | * <mit-copyright.h>. | |
11 | */ | |
12 | ||
13 | #include <mit-copyright.h> | |
14 | #include <moira.h> | |
15 | #include <moira_site.h> | |
16 | #include <mrclient.h> | |
17 | ||
18 | #include <ctype.h> | |
19 | #include <errno.h> | |
20 | #include <stdio.h> | |
21 | #include <stdlib.h> | |
22 | #include <string.h> | |
23 | ||
24 | RCSID("$Header$"); | |
25 | ||
26 | struct string_list { | |
27 | char *string; | |
28 | struct string_list *next; | |
29 | }; | |
30 | ||
31 | /* argument parsing macro */ | |
32 | #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b)) | |
33 | ||
34 | /* flags from command line */ | |
35 | int info_flag, update_flag, create_flag, deact_flag, reg_flag; | |
36 | int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth; | |
37 | ||
38 | struct string_list *reservation_add_queue, *reservation_remove_queue; | |
39 | ||
40 | char *username, *whoami; | |
41 | ||
42 | char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status; | |
43 | char *clearid, *class, *comment, *secure; | |
44 | ||
45 | static char *states[] = { | |
46 | "Registerable (0)", | |
47 | "Active (1)", | |
48 | "Half Registered (2)", | |
49 | "Deleted (3)", | |
50 | "Not registerable (4)", | |
51 | "Enrolled/Registerable (5)", | |
52 | "Enrolled/Not Registerable (6)", | |
53 | "Half Enrolled (7)" | |
54 | }; | |
55 | ||
56 | static char *UserState(int state) | |
57 | { | |
58 | static char buf[BUFSIZ]; | |
59 | ||
60 | if (state < 0 || state >= US_END) | |
61 | { | |
62 | sprintf(buf, "Unknown (%d)", state); | |
63 | return buf; | |
64 | } | |
65 | return states[state]; | |
66 | } | |
67 | ||
68 | void usage(char **argv); | |
69 | int save_query_info(int argc, char **argv, void *hint); | |
70 | int show_reservations(int argc, char **argv, void *hint); | |
71 | void show_user_info(char **argv); | |
72 | void show_user_info_unformatted(char **argv); | |
73 | struct string_list *add_to_string_list(struct string_list *old_list, char *s); | |
74 | int wrap_mr_query(char *handle, int argc, char **argv, | |
75 | int (*callback)(int, char **, void *), void *callarg); | |
76 | void print_query(char *query_name, int argc, char **argv); | |
77 | ||
78 | int main(int argc, char **argv) | |
79 | { | |
80 | int status; | |
81 | char **arg = argv; | |
82 | char *server = NULL; | |
83 | ||
84 | /* clear all flags & lists */ | |
85 | info_flag = update_flag = create_flag = deact_flag = reg_flag = 0; | |
86 | list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0; | |
87 | newlogin = uid = shell = winshell = last = first = middle = NULL; | |
88 | u_status = clearid = class = comment = secure = NULL; | |
89 | reservation_add_queue = reservation_remove_queue = NULL; | |
90 | whoami = argv[0]; | |
91 | ||
92 | /* parse args */ | |
93 | while (++arg - argv < argc) | |
94 | { | |
95 | if (**arg == '-') | |
96 | { | |
97 | if (argis("i", "info")) | |
98 | info_flag++; | |
99 | else if (argis("C", "create")) | |
100 | create_flag++; | |
101 | else if (argis("D", "deact")) | |
102 | deact_flag++; | |
103 | else if (argis("r", "register")) | |
104 | reg_flag++; | |
105 | else if (argis("R", "rename")) { | |
106 | if (arg - argv < argc - 1) { | |
107 | arg++; | |
108 | update_flag++; | |
109 | newlogin = *arg; | |
110 | } else | |
111 | usage(argv); | |
112 | } | |
113 | else if (argis("U", "uid")) { | |
114 | if (arg - argv < argc - 1) { | |
115 | arg++; | |
116 | update_flag++; | |
117 | uid = *arg; | |
118 | } else | |
119 | usage(argv); | |
120 | } | |
121 | else if (argis("s", "shell")) { | |
122 | if (arg - argv < argc - 1) { | |
123 | arg++; | |
124 | update_flag++; | |
125 | shell = *arg; | |
126 | } else | |
127 | usage(argv); | |
128 | } | |
129 | else if (argis("w", "winshell")) { | |
130 | if (arg - argv < argc - 1) { | |
131 | arg++; | |
132 | update_flag++; | |
133 | winshell = *arg; | |
134 | } else | |
135 | usage(argv); | |
136 | } | |
137 | else if (argis("L", "last")) { | |
138 | if (arg - argv < argc - 1) { | |
139 | arg++; | |
140 | update_flag++; | |
141 | last = *arg; | |
142 | } else | |
143 | usage(argv); | |
144 | } | |
145 | else if (argis("F", "first")) { | |
146 | if (arg - argv < argc - 1) { | |
147 | arg++; | |
148 | update_flag++; | |
149 | first = *arg; | |
150 | } else | |
151 | usage(argv); | |
152 | } | |
153 | else if (argis("M", "middle")) { | |
154 | if (arg - argv < argc - 1) { | |
155 | arg++; | |
156 | update_flag++; | |
157 | middle = *arg; | |
158 | } else | |
159 | usage(argv); | |
160 | } | |
161 | else if (argis("S", "status")) { | |
162 | if (arg - argv < argc - 1) { | |
163 | int i; | |
164 | int len; | |
165 | ||
166 | arg++; | |
167 | update_flag++; | |
168 | u_status = *arg; | |
169 | len = strlen(u_status); | |
170 | for (i = 0; i < len; i++) { | |
171 | if (!isdigit(u_status[i])) { | |
172 | printf("Error: status code %s is not numeric.\n", u_status); | |
173 | exit(1); | |
174 | } | |
175 | } | |
176 | } else | |
177 | usage(argv); | |
178 | } | |
179 | else if (argis("I", "clearid")) { | |
180 | if (arg - argv < argc - 1) { | |
181 | arg++; | |
182 | update_flag++; | |
183 | clearid = *arg; | |
184 | } else | |
185 | usage(argv); | |
186 | } | |
187 | else if (argis("cl", "class")) { | |
188 | if (arg - argv < argc - 1) { | |
189 | arg++; | |
190 | update_flag++; | |
191 | class = *arg; | |
192 | } else | |
193 | usage(argv); | |
194 | } | |
195 | else if (argis("c", "comment")) { | |
196 | if (arg - argv < argc - 1) { | |
197 | arg++; | |
198 | update_flag++; | |
199 | comment = *arg; | |
200 | } else | |
201 | usage(argv); | |
202 | } | |
203 | else if (argis("6", "secure")) { | |
204 | if (arg - argv < argc - 1) { | |
205 | arg++; | |
206 | update_flag++; | |
207 | secure = *arg; | |
208 | } else | |
209 | usage(argv); | |
210 | } | |
211 | else if (argis("ar", "addreservation")) { | |
212 | if (arg - argv < argc - 1) { | |
213 | arg++; | |
214 | reservation_add_queue = add_to_string_list(reservation_add_queue, | |
215 | *arg); | |
216 | } else | |
217 | usage(argv); | |
218 | update_res_flag++; | |
219 | } | |
220 | else if (argis("dr", "deletereservation")) { | |
221 | if (arg - argv < argc - 1) { | |
222 | arg++; | |
223 | reservation_remove_queue = add_to_string_list(reservation_remove_queue, *arg); | |
224 | } else | |
225 | usage(argv); | |
226 | update_res_flag++; | |
227 | } | |
ec7f0346 | 228 | else if (argis("lr", "listreservation")) |
5d429b61 | 229 | list_res_flag++; |
230 | else if (argis("u", "unformatted")) | |
231 | unformatted_flag++; | |
232 | else if (argis("n", "noauth")) | |
233 | noauth++; | |
234 | else if (argis("v", "verbose")) | |
235 | verbose++; | |
236 | else if (argis("db", "database")) | |
237 | { | |
238 | if (arg - argv < argc - 1) | |
239 | { | |
240 | ++arg; | |
241 | server = *arg; | |
242 | } | |
243 | else | |
244 | usage(argv); | |
245 | } | |
246 | else | |
247 | usage(argv); | |
248 | } | |
249 | else if (username == NULL) | |
250 | username = *arg; | |
251 | else | |
252 | usage(argv); | |
253 | } | |
ec7f0346 | 254 | if (username == NULL && !create_flag) |
5d429b61 | 255 | usage(argv); |
256 | ||
257 | /* default to info_flag if nothing else was specified */ | |
258 | if(!(info_flag || update_flag || create_flag || \ | |
259 | deact_flag || reg_flag || list_res_flag || \ | |
260 | update_res_flag)) { | |
261 | info_flag++; | |
262 | } | |
263 | ||
264 | /* fire up Moira */ | |
265 | status = mrcl_connect(server, "stanley", 8, !noauth); | |
266 | if (status == MRCL_AUTH_ERROR) | |
267 | { | |
268 | com_err(whoami, 0, "Try the -noauth flag if you don't " | |
269 | "need authentication."); | |
270 | } | |
271 | if (status) | |
272 | exit(2); | |
273 | ||
274 | /* create if needed */ | |
275 | if (create_flag) | |
276 | { | |
277 | char *argv[20]; | |
278 | int cnt; | |
279 | ||
280 | for (cnt = 0; cnt < 14; cnt++) { | |
ec7f0346 | 281 | argv[cnt] = ""; |
5d429b61 | 282 | } |
283 | ||
ec7f0346 | 284 | if (username) |
285 | argv[U_NAME] = username; | |
286 | else | |
287 | argv[U_NAME] = UNIQUE_LOGIN; | |
5d429b61 | 288 | if (uid) |
289 | argv[U_UID] = uid; | |
290 | else | |
291 | argv[U_UID] = UNIQUE_UID; | |
292 | if (shell) | |
293 | argv[U_SHELL] = shell; | |
294 | else | |
295 | argv[U_SHELL] = "/bin/athena/tcsh"; | |
296 | if (winshell) | |
297 | argv[U_WINCONSOLESHELL] = winshell; | |
298 | else | |
299 | argv[U_WINCONSOLESHELL] = "cmd"; | |
300 | if (last) | |
301 | argv[U_LAST] = last; | |
302 | if (first) | |
303 | argv[U_FIRST] = first; | |
304 | if (middle) | |
305 | argv[U_MIDDLE] = middle; | |
306 | if (u_status) | |
307 | argv[U_STATE] = u_status; | |
308 | else | |
309 | argv[U_STATE] = "0"; | |
310 | if (clearid) | |
311 | argv[U_MITID] = clearid; | |
312 | if (class) | |
313 | argv[U_CLASS] = class; | |
314 | if (comment) | |
315 | argv[U_COMMENT] = comment; | |
316 | /* Signature field always is the empty string */ | |
317 | argv[U_SIGNATURE] = ""; | |
318 | if (secure) | |
319 | argv[U_SECURE] = secure; | |
320 | else | |
321 | argv[U_SECURE] = "0"; | |
322 | ||
323 | status = wrap_mr_query("add_user_account", 13, argv, NULL, NULL); | |
5d429b61 | 324 | if (status) |
325 | { | |
326 | com_err(whoami, status, "while adding user account."); | |
327 | exit(1); | |
328 | } | |
329 | } | |
330 | else if (update_flag) | |
331 | { | |
332 | char *old_argv[20]; | |
333 | char *argv[20]; | |
334 | char *args[5]; | |
335 | ||
336 | args[0] = username; | |
337 | ||
338 | status = wrap_mr_query("get_user_account_by_login", 1, args, | |
339 | save_query_info, old_argv); | |
340 | if (status) | |
341 | { | |
342 | com_err(whoami, status, "while getting user information."); | |
343 | exit(1); | |
344 | } | |
345 | ||
346 | argv[1] = old_argv[0]; | |
347 | argv[2] = old_argv[1]; | |
348 | argv[3] = old_argv[2]; | |
349 | argv[4] = old_argv[3]; | |
350 | argv[5] = old_argv[4]; | |
351 | argv[6] = old_argv[5]; | |
352 | argv[7] = old_argv[6]; | |
353 | argv[8] = old_argv[7]; | |
354 | argv[9] = old_argv[8]; | |
355 | argv[10] = old_argv[9]; | |
356 | argv[11] = old_argv[10]; | |
357 | argv[12] = old_argv[11]; | |
358 | argv[13] = old_argv[12]; | |
359 | ||
360 | argv[0] = username; | |
361 | if (newlogin) | |
362 | argv[1] = newlogin; | |
363 | if (uid) | |
364 | argv[2] = uid; | |
365 | if (shell) | |
366 | argv[3] = shell; | |
367 | if (winshell) | |
368 | argv[4] = winshell; | |
369 | if (last) | |
370 | argv[5] = last; | |
371 | if (first) | |
372 | argv[6] = first; | |
373 | if (middle) | |
374 | argv[7] = middle; | |
375 | if (u_status) | |
376 | argv[8] = u_status; | |
377 | if (clearid) | |
378 | argv[9] = clearid; | |
379 | if (class) | |
380 | argv[10] = class; | |
381 | if (comment) | |
382 | argv[11] = comment; | |
383 | if (secure) | |
384 | argv[13] = secure; | |
385 | ||
386 | status = wrap_mr_query("update_user_account", 14, argv, NULL, NULL); | |
387 | ||
388 | if (status) | |
389 | com_err(whoami, status, "while updating user."); | |
390 | else if (newlogin) | |
391 | username = newlogin; | |
392 | } | |
393 | ||
ec7f0346 | 394 | /* Deactivate a user, and the matching list and filesystem if they exist */ |
5d429b61 | 395 | if (deact_flag) |
396 | { | |
397 | char *args[2]; | |
398 | char *argv[20]; | |
399 | int i; | |
400 | ||
401 | args[0] = username; | |
402 | args[1] = "3"; | |
403 | ||
404 | status = wrap_mr_query("update_user_status", 2, args, NULL, NULL); | |
405 | if (status) | |
406 | { | |
407 | com_err(whoami, status, "while deactivating user."); | |
408 | exit(1); | |
409 | } | |
410 | ||
ec7f0346 | 411 | status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv); |
412 | if (status == MR_SUCCESS) | |
5d429b61 | 413 | { |
ec7f0346 | 414 | for (i = 13; i > 0; i--) |
415 | argv[i + 1] = argv[i]; | |
416 | argv[1] = username; | |
417 | argv[L_ACTIVE + 1] = "0"; | |
418 | ||
419 | status = wrap_mr_query("update_list", 14, argv, NULL, NULL); | |
420 | if (status) | |
421 | { | |
422 | com_err(whoami, status, "while updating list, " | |
423 | "not deactivating list or filesystem."); | |
424 | exit(1); | |
425 | } | |
5d429b61 | 426 | } |
ec7f0346 | 427 | else if (status && status != MR_NO_MATCH) |
5d429b61 | 428 | { |
ec7f0346 | 429 | com_err(whoami, status, "while retrieving list information."); |
5d429b61 | 430 | exit(1); |
431 | } | |
432 | ||
433 | status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info, | |
434 | argv); | |
ec7f0346 | 435 | if (status == MR_SUCCESS) |
5d429b61 | 436 | { |
ec7f0346 | 437 | for (i = 11; i > 0; i--) |
438 | argv[i + 1] = argv[i]; | |
439 | argv[1] = username; | |
440 | argv[FS_TYPE + 1] = "ERR"; | |
441 | argv[FS_COMMENTS + 1] = "Locker disabled; call 3-1325 for help"; | |
442 | ||
443 | status = wrap_mr_query("update_filesys", 12, argv, NULL, NULL); | |
444 | if (status) | |
445 | { | |
446 | com_err(whoami, status, "while updating filesystem, " | |
447 | "not deactivating filesystem."); | |
448 | exit(1); | |
449 | } | |
5d429b61 | 450 | } |
ec7f0346 | 451 | else if (status && status != MR_NO_MATCH) |
5d429b61 | 452 | { |
ec7f0346 | 453 | com_err(whoami, status, "while retrieving filesystem information."); |
5d429b61 | 454 | exit(1); |
455 | } | |
456 | } | |
457 | ||
458 | /* Display user info */ | |
459 | if (info_flag) | |
460 | { | |
461 | char *args[2]; | |
462 | char *argv[20]; | |
463 | ||
464 | args[0] = username; | |
465 | status = wrap_mr_query("get_user_account_by_login", 1, args, | |
466 | save_query_info, argv); | |
467 | if (status) | |
468 | { | |
469 | com_err(whoami, status, "while getting user information."); | |
470 | exit(1); | |
471 | } | |
472 | if (unformatted_flag) | |
473 | show_user_info_unformatted(argv); | |
474 | else | |
475 | show_user_info(argv); | |
476 | } | |
477 | ||
478 | /* register a user */ | |
479 | if (reg_flag) | |
480 | { | |
481 | char *args[3]; | |
482 | char *argv[20]; | |
5d429b61 | 483 | |
484 | args[0] = username; | |
485 | status = wrap_mr_query("get_user_account_by_login", 1, args, | |
486 | save_query_info, argv); | |
487 | if (status) | |
488 | { | |
489 | com_err(whoami, status, "while looking up uid."); | |
490 | exit(1); | |
491 | } | |
492 | ||
493 | args[0] = argv[U_UID]; | |
ec7f0346 | 494 | args[1] = username; |
495 | args[2] = "IMAP"; | |
5d429b61 | 496 | |
497 | status = wrap_mr_query("register_user", 3, args, NULL, NULL); | |
498 | if (status) | |
499 | { | |
500 | com_err(whoami, status, "while registering user."); | |
501 | exit(1); | |
502 | } | |
503 | } | |
504 | ||
505 | /* list user reservations */ | |
506 | if (list_res_flag) | |
507 | { | |
508 | char *args[1]; | |
509 | ||
510 | args[0] = username; | |
511 | status = wrap_mr_query("get_user_reservations", 1, args, | |
512 | show_reservations, NULL); | |
513 | if (status) | |
514 | if (status != MR_NO_MATCH) { | |
515 | com_err(whoami, status, "while getting user reservations."); | |
516 | exit(1); | |
517 | } | |
518 | } | |
519 | ||
520 | /* add user reservations */ | |
521 | if (reservation_add_queue) | |
522 | { | |
523 | struct string_list *q = reservation_add_queue; | |
524 | ||
525 | while (q) | |
526 | { | |
527 | char *reservation = q->string; | |
528 | char *args[2]; | |
529 | ||
530 | args[0] = username; | |
531 | args[1] = reservation; | |
532 | status = wrap_mr_query("add_user_reservation", 2, args, NULL, NULL); | |
533 | if (status) | |
534 | { | |
535 | com_err(whoami, status, "while adding user reservation."); | |
536 | exit(1); | |
537 | } | |
538 | ||
539 | q = q->next; | |
540 | } | |
541 | } | |
542 | ||
543 | /* delete user reservations */ | |
544 | if (reservation_remove_queue) | |
545 | { | |
546 | struct string_list *q = reservation_remove_queue; | |
547 | ||
548 | while (q) | |
549 | { | |
550 | char *reservation = q->string; | |
551 | char *args[2]; | |
552 | ||
553 | args[0] = username; | |
554 | args[1] = reservation; | |
555 | status = wrap_mr_query("delete_user_reservation", 2, args, NULL, | |
556 | NULL); | |
557 | if (status) | |
558 | { | |
559 | com_err(whoami, status, "while deleting user reservation."); | |
560 | exit(1); | |
561 | } | |
562 | ||
563 | q = q->next; | |
564 | } | |
565 | } | |
566 | /* We're done! */ | |
567 | mr_disconnect(); | |
568 | exit(0); | |
569 | } | |
570 | ||
571 | int save_query_info(int argc, char **argv, void *hint) | |
572 | { | |
573 | int i; | |
574 | char **nargv = hint; | |
575 | ||
576 | for(i = 0; i < argc; i++) | |
577 | nargv[i] = strdup(argv[i]); | |
578 | ||
579 | return MR_CONT; | |
580 | } | |
581 | ||
582 | int show_reservations(int argc, char **argv, void *hint) | |
583 | { | |
584 | printf("Reservation: %s\n", argv[0]); | |
585 | ||
586 | return MR_CONT; | |
587 | } | |
588 | ||
589 | struct string_list *add_to_string_list(struct string_list *old_list, char *s) { | |
590 | struct string_list *new_list; | |
591 | ||
592 | new_list = (struct string_list *)malloc(sizeof(struct string_list *)); | |
593 | new_list->next = old_list; | |
594 | new_list->string = s; | |
595 | ||
596 | return new_list; | |
597 | } | |
598 | ||
599 | int wrap_mr_query(char *handle, int argc, char **argv, | |
600 | int (*callback)(int, char **, void *), void *callarg) { | |
601 | if (verbose) | |
602 | print_query(handle, argc, argv); | |
603 | ||
604 | return mr_query(handle, argc, argv, callback, callarg); | |
605 | } | |
606 | ||
607 | void print_query(char *query_name, int argc, char **argv) { | |
608 | int cnt; | |
609 | ||
610 | printf("qy %s", query_name); | |
611 | for(cnt = 0; cnt < argc; cnt++) | |
612 | printf(" <%s>", argv[cnt]); | |
613 | printf("\n"); | |
614 | } | |
615 | ||
5d429b61 | 616 | void show_user_info(char **argv) |
617 | { | |
618 | char tbuf[BUFSIZ]; | |
619 | int status; | |
620 | ||
621 | sprintf(tbuf, "%s, %s %s", argv[U_LAST], argv[U_FIRST], argv[U_MIDDLE]); | |
622 | printf("Login name: %-20s Full name: %s\n", argv[U_NAME], tbuf); | |
623 | printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]); | |
624 | printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS], | |
625 | argv[U_WINCONSOLESHELL]); | |
626 | printf("Account is: %-20s MIT ID number: %s\n", | |
627 | UserState(atoi(argv[U_STATE])), argv[U_MITID]); | |
628 | status = atoi(argv[U_STATE]); | |
629 | if (status == 0 || status == 2) | |
630 | { | |
ec7f0346 | 631 | printf("User %s secure Account Coupon to register\n", |
5d429b61 | 632 | atoi(argv[U_SECURE]) ? "needs" : "does not need"); |
633 | } | |
634 | printf("Comments: %s\n", argv[U_COMMENT]); | |
635 | printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME], | |
636 | argv[U_MODWITH]); | |
637 | } | |
638 | ||
639 | void show_user_info_unformatted(char **argv) | |
640 | { | |
641 | int status; | |
642 | ||
643 | printf("Login name: %s\n", argv[U_NAME]); | |
644 | printf("Full name: %s, %s %s\n", argv[U_LAST], argv[U_FIRST], | |
645 | argv[U_MIDDLE]); | |
646 | printf("User id: %s\n", argv[U_UID]); | |
647 | printf("Class: %s\n", argv[U_CLASS]); | |
648 | printf("Login shell: %s\n", argv[U_SHELL]); | |
649 | printf("Windows Console Shell: %s\n", argv[U_WINCONSOLESHELL]); | |
650 | printf("Account is: %s\n", UserState(atoi(argv[U_STATE]))); | |
651 | printf("MIT ID number: %s\n", argv[U_MITID]); | |
652 | printf("Secure: %s\n", argv[U_SECURE]); | |
653 | printf("Comments: %s\n", argv[U_COMMENT]); | |
654 | printf("Last mod by: %s\n", argv[U_MODBY]); | |
655 | printf("Last mod on: %s\n", argv[U_MODTIME]); | |
656 | printf("Last mod with: %s\n", argv[U_MODWITH]); | |
657 | } | |
ec7f0346 | 658 | |
659 | void usage(char **argv) | |
660 | { | |
661 | #define USAGE_OPTIONS_FORMAT " %-39s%s\n" | |
662 | fprintf(stderr, "Usage: %s username [options]\n", argv[0]); | |
663 | fprintf(stderr, "Options are\n"); | |
664 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C | -create", | |
665 | "-D | -deact"); | |
666 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-r | -register", | |
667 | "-R | -rename newname"); | |
668 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-U | -uid uid", | |
669 | "-s | -shell shell"); | |
670 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S | -status status", | |
671 | "-w | -winshell winshell"); | |
672 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F | -first firstname", | |
673 | "-L | -last lastname"); | |
674 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M | -middle middlename", | |
675 | "-I | -clearid mitid"); | |
676 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl | -class class", | |
677 | "-c | -comment comment"); | |
678 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6 | -secure 0|1", | |
679 | "-lr | -listreservation"); | |
680 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar | -addreservation reservation", | |
681 | "-dr | -deletereservation reservation"); | |
682 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u | -unformatted", | |
683 | "-n | -noauth"); | |
684 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v | -verbose", | |
685 | "-db | -database host[:port]"); | |
686 | ||
687 | exit(1); | |
688 | } |