]> andersk Git - moira.git/blob - clients/stanley/stanley.c
tcsh is dead. Long live bash.
[moira.git] / clients / stanley / stanley.c
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 owner_type {
27   int type;
28   char *name;
29 };
30
31 struct string_list {
32   char *string;
33   struct string_list *next;
34 };
35
36 #define M_ANY           0
37 #define M_USER          1
38 #define M_LIST          2
39 #define M_KERBEROS      3
40 #define M_NONE          4
41
42 /* argument parsing macro */
43 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
44
45 /* flags from command line */
46 int info_flag, update_flag, create_flag, deact_flag, reg_flag;
47 int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth;
48
49 struct owner_type *sponsor;
50 struct string_list *reservation_add_queue, *reservation_remove_queue;
51
52 char *username, *whoami;
53
54 char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status;
55 char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir, *expiration;
56
57 struct owner_type *parse_member(char *s);
58
59 static char *states[] = {
60   "Registerable (0)",
61   "Active (1)",
62   "Half Registered (2)",
63   "Deleted (3)",
64   "Not registerable (4)",
65   "Enrolled/Registerable (5)",
66   "Enrolled/Not Registerable (6)",
67   "Half Enrolled (7)",
68   "Registerable, Kerberos only (8)",
69   "Active, Kerberos only (9)"
70 };
71
72 static char *UserState(int state)
73 {
74   static char buf[BUFSIZ];
75
76   if (state < 0 || state >= US_END)
77     {
78       sprintf(buf, "Unknown (%d)", state);
79       return buf;
80     }
81   return states[state];
82 }
83
84 void usage(char **argv);
85 int save_query_info(int argc, char **argv, void *hint);
86 int show_reservations(int argc, char **argv, void *hint);
87 void show_user_info(char **argv);
88 void show_user_info_unformatted(char **argv);
89 struct string_list *add_to_string_list(struct string_list *old_list, char *s);
90 int wrap_mr_query(char *handle, int argc, char **argv,
91                   int (*callback)(int, char **, void *), void *callarg);
92 void print_query(char *query_name, int argc, char **argv);
93
94 int main(int argc, char **argv)
95 {
96   int status;
97   char **arg = argv;
98   char *server = NULL;
99
100   /* clear all flags & lists */
101   info_flag = update_flag = create_flag = deact_flag = reg_flag = 0;
102   list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0;
103   newlogin = uid = shell = winshell = last = first = middle = NULL;
104   u_status = clearid = class = comment = secure = NULL;
105   winhomedir = winprofiledir = expiration = NULL;
106   reservation_add_queue = reservation_remove_queue = NULL;
107   sponsor = NULL;
108   whoami = argv[0];
109
110   /* parse args */
111   while (++arg - argv < argc)
112     {
113       if (**arg == '-')
114         {
115           if (argis("i", "info"))
116             info_flag++;
117           else if (argis("C", "create"))
118             create_flag++;
119           else if (argis("D", "deact"))
120             deact_flag++;
121           else if (argis("r", "register"))
122             reg_flag++;
123           else if (argis("R", "rename")) {
124             if (arg - argv < argc - 1) {
125               arg++;
126               update_flag++;
127               newlogin = *arg;
128             } else
129               usage(argv);
130           }
131           else if (argis("U", "uid")) {
132             if (arg - argv < argc - 1) {
133               arg++;
134               update_flag++;
135               uid = *arg;
136             } else
137               usage(argv);
138           }
139           else if (argis("s", "shell")) {
140             if (arg - argv < argc - 1) {
141               arg++;
142               update_flag++;
143               shell = *arg;
144             } else
145               usage(argv);
146           }
147           else if (argis("w", "winshell")) {
148             if (arg - argv < argc - 1) {
149               arg++;
150               update_flag++;
151               winshell = *arg;
152             } else
153               usage(argv);
154           }
155           else if (argis("L", "last")) {
156             if (arg - argv < argc - 1) {
157               arg++;
158               update_flag++;
159               last = *arg;
160             } else
161               usage(argv);
162           }
163           else if (argis("F", "first")) {
164             if (arg - argv < argc - 1) {
165               arg++;
166               update_flag++;
167               first = *arg;
168             } else
169               usage(argv);
170           }
171           else if (argis("M", "middle")) {
172             if (arg - argv < argc - 1) {
173               arg++;
174               update_flag++;
175               middle = *arg;
176             } else
177               usage(argv);
178           }
179           else if (argis("S", "status")) {
180             if (arg - argv < argc - 1) { 
181               int i;
182               int len;
183
184               arg++;
185               update_flag++;
186               u_status = *arg;
187               len = strlen(u_status);
188               for (i = 0; i < len; i++) {
189                 if (!isdigit(u_status[i])) {
190                   printf("Error:  status code %s is not numeric.\n", u_status);
191                   exit(1);
192                 }
193               }
194             } else
195               usage(argv);
196           }
197           else if (argis("I", "mitid")) {
198             if (arg - argv < argc - 1) {
199               arg++;
200               update_flag++;
201               clearid = *arg;
202             } else
203               usage(argv);
204           }
205           else if (argis("cl", "class")) {
206             if (arg - argv < argc - 1) {
207               arg++;
208               update_flag++;
209               class = *arg;
210             } else
211               usage(argv);
212           }
213           else if (argis("c", "comment")) {
214             if (arg - argv < argc - 1) {
215               arg++;
216               update_flag++;
217               comment = *arg;
218             } else
219               usage(argv);
220           }
221           else if (argis("6", "secure")) {
222             if (arg - argv < argc - 1) {
223               arg++;
224               update_flag++;
225               secure = *arg;
226             } else
227               usage(argv);
228           }
229           else if (argis("wh", "winhomedir")) {
230             if (arg - argv < argc - 1) {
231               arg++;
232               update_flag++;
233               winhomedir = *arg;
234             } else
235               usage(argv);
236           }
237           else if (argis("wp", "winprofiledir")) {
238             if (arg - argv < argc - 1) {
239               arg++;
240               update_flag++;
241               winprofiledir = *arg;
242             } else
243               usage(argv);
244           }
245           else if (argis("sp", "sponsor")) {
246             if (arg - argv < argc - 1) {
247               arg++;
248               update_flag++;
249               sponsor = parse_member(*arg);
250             } else
251               usage(argv);
252           }
253           else if (argis("e", "expiration")) {
254             if (arg - argv < argc - 1) {
255               arg++;
256               update_flag++;
257               expiration = *arg;
258             } else
259               usage(argv);
260           }
261           else if (argis("ar", "addreservation")) {
262             if (arg - argv < argc - 1) {
263               arg++;
264               reservation_add_queue = add_to_string_list(reservation_add_queue,
265                                                          *arg);
266             } else
267               usage(argv);
268             update_res_flag++;
269           }
270           else if (argis("dr", "deletereservation")) {
271             if (arg - argv < argc - 1) {
272               arg++;
273               reservation_remove_queue = add_to_string_list(reservation_remove_queue, *arg);
274             } else
275               usage(argv);
276             update_res_flag++;
277           }
278           else if (argis("lr", "listreservation"))
279             list_res_flag++;
280           else if (argis("u", "unformatted"))
281             unformatted_flag++;
282           else if (argis("n", "noauth"))
283             noauth++;
284           else if (argis("v", "verbose"))
285             verbose++;
286           else if (argis("db", "database"))
287             {
288               if (arg - argv < argc - 1)
289                 {
290                   ++arg;
291                   server = *arg;
292                 }
293               else
294                 usage(argv);
295             }
296           else
297             usage(argv);
298         }
299       else if (username == NULL)
300         username = *arg;
301       else
302         usage(argv);
303     }
304   if (username == NULL && !create_flag)
305     usage(argv);
306
307   /* default to info_flag if nothing else was specified */
308   if(!(info_flag       || update_flag || create_flag   || \
309        deact_flag      || reg_flag    || list_res_flag || \
310        update_res_flag)) {
311     info_flag++;
312   }
313
314   /* fire up Moira */
315   status = mrcl_connect(server, "stanley", 12, !noauth);
316   if (status == MRCL_AUTH_ERROR)
317     {
318       com_err(whoami, 0, "Try the -noauth flag if you don't "
319               "need authentication.");
320     }
321   if (status)
322     exit(2);
323
324   /* create if needed */
325   if (create_flag)
326     {
327       char *argv[20];
328       int cnt;
329
330       for (cnt = 0; cnt < 20; cnt++) {
331         argv[cnt] = "";
332       }
333
334       if (username)
335         argv[U_NAME] = username;
336       else
337         argv[U_NAME] = UNIQUE_LOGIN;
338       if (uid)
339         argv[U_UID] = uid;
340       else
341         argv[U_UID] = UNIQUE_UID;
342       if (shell)
343         argv[U_SHELL] = shell;
344       else
345         argv[U_SHELL] = "/bin/athena/bash";
346       if (winshell)
347         argv[U_WINCONSOLESHELL] = winshell;
348       else
349         argv[U_WINCONSOLESHELL] = "cmd";
350       if (last)
351         argv[U_LAST] = last;
352       if (first)
353         argv[U_FIRST] = first;
354       if (middle)
355         argv[U_MIDDLE] = middle;
356       if (u_status)
357         argv[U_STATE] = u_status;
358       else
359         argv[U_STATE] = "0";
360       if (clearid)
361         argv[U_MITID] = clearid;
362       if (class)
363         argv[U_CLASS] = class;
364       if (comment)
365         argv[U_COMMENT] = comment;
366       /* Signature field always is the empty string */
367       argv[U_SIGNATURE] = "";
368       if (secure)
369         argv[U_SECURE] = secure;
370       else
371         argv[U_SECURE] = "0";
372       if (winhomedir)
373         argv[U_WINHOMEDIR] = winhomedir;
374       else
375         argv[U_WINHOMEDIR] = "[DFS]";
376       if (winprofiledir)
377         argv[U_WINPROFILEDIR] = winprofiledir;
378       else
379         argv[U_WINPROFILEDIR] = "[DFS]";
380       if (expiration)
381         argv[U_EXPIRATION] = expiration;
382       if (sponsor)
383         {
384           argv[U_SPONSOR_NAME] = sponsor->name;
385           switch (sponsor->type)
386             {
387             case M_ANY:
388             case M_USER:
389               argv[U_SPONSOR_TYPE] = "USER";
390               status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
391               if (sponsor->type != M_ANY || status != MR_USER)
392                 break;
393
394             case M_LIST:
395               argv[U_SPONSOR_TYPE] = "LIST";
396               status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
397               break;
398
399             case M_KERBEROS:
400               argv[U_SPONSOR_TYPE] = "KERBEROS";
401               status = mrcl_validate_kerberos_member(argv[U_SPONSOR_NAME],
402                                                      &argv[U_SPONSOR_NAME]);
403               if (mrcl_get_message())
404                 mrcl_com_err(whoami);
405               if (status == MRCL_REJECT)
406                 exit(1);
407               status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
408               break;
409
410             case M_NONE:
411               argv[U_SPONSOR_TYPE] = "NONE";
412               status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
413               break;
414             }
415         }
416       else
417         {
418           argv[U_SPONSOR_TYPE] = "NONE";
419           argv[U_SPONSOR_NAME] = "NONE";
420           
421           status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
422         }
423               
424       if (status)
425         {
426           com_err(whoami, status, "while adding user account.");
427           exit(1);
428         }
429     }
430   else if (update_flag)
431     {
432       char *old_argv[20];
433       char *argv[20];
434       char *args[5];
435
436       args[0] = username;
437       
438       status = wrap_mr_query("get_user_account_by_login", 1, args, 
439                              save_query_info, old_argv);
440       if (status)
441         {
442           com_err(whoami, status, "while getting user information.");
443           exit(1);
444         }
445
446       argv[1] = old_argv[0];
447       argv[2] = old_argv[1];
448       argv[3] = old_argv[2];
449       argv[4] = old_argv[3];
450       argv[5] = old_argv[4];
451       argv[6] = old_argv[5];
452       argv[7] = old_argv[6];
453       argv[8] = old_argv[7];
454       argv[9] = old_argv[8];
455       argv[10] = old_argv[9];
456       argv[11] = old_argv[10];
457       argv[12] = old_argv[11];
458       argv[13] = old_argv[12];
459       argv[14] = old_argv[13];
460       argv[15] = old_argv[14];
461       argv[16] = old_argv[15];
462       argv[17] = old_argv[16];
463       argv[18] = old_argv[17];
464       
465       argv[0] = username;
466       if (newlogin)
467         argv[1] = newlogin;
468       if (uid)
469         argv[2] = uid;
470       if (shell)
471         argv[3] = shell;
472       if (winshell)
473         argv[4] = winshell;
474       if (last)
475         argv[5] = last;
476       if (first)
477         argv[6] = first;
478       if (middle)
479         argv[7] = middle;
480       if (u_status)
481         argv[8] = u_status;
482       if (clearid)
483         argv[9] = clearid;
484       if (class)
485         argv[10] = class;
486       if (comment)
487         argv[11] = comment;
488       if (secure)
489         argv[13] = secure;
490       if (winhomedir)
491         argv[14] = winhomedir;
492       if (winprofiledir)
493         argv[15] = winprofiledir;
494       if (expiration)
495         argv[18] = expiration;
496       if (sponsor)
497         {
498           argv[17] = sponsor->name;
499           switch (sponsor->type)
500             {
501             case M_ANY:
502             case M_USER:
503               argv[16] = "USER";
504               status = wrap_mr_query("update_user_account", 19, argv, NULL, 
505                                      NULL);
506               if (sponsor->type != M_ANY || status != MR_USER)
507                 break;
508
509             case M_LIST:
510               argv[16] = "LIST";
511               status = wrap_mr_query("update_user_account", 19, argv, NULL,
512                                      NULL);
513               break;
514
515             case M_KERBEROS:
516               argv[16] = "KERBEROS";
517               status = mrcl_validate_kerberos_member(argv[17], &argv[17]);
518               if (mrcl_get_message())
519                 mrcl_com_err(whoami);
520               if (status == MRCL_REJECT)
521                 exit(1);
522               status = wrap_mr_query("update_user_account", 19, argv, NULL,
523                                      NULL);
524               break;
525
526             case M_NONE:
527               argv[16] = "NONE";
528               status = wrap_mr_query("update_user_account", 19, argv, NULL,
529                                      NULL);
530               break;
531             }
532         }
533       else
534         status = wrap_mr_query("update_user_account", 19, argv, NULL, NULL);
535
536       if (status)
537         com_err(whoami, status, "while updating user.");
538       else if (newlogin)
539         username = newlogin;
540     }
541
542   /* Deactivate a user, and the matching list and filesystem if they exist */
543   if (deact_flag)
544     {
545       char *args[2];
546       char *argv[20];
547       int i;
548
549       args[0] = username;
550       args[1] = "3";
551
552       status = wrap_mr_query("update_user_status", 2, args, NULL, NULL);
553       if (status)
554         {
555           com_err(whoami, status, "while deactivating user.");
556           exit(1);
557         }
558
559       status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv);
560       if (status == MR_SUCCESS)
561         {
562           for (i = 15; i > 0; i--)
563             argv[i + 1] = argv[i];
564           argv[1] = username;
565           argv[L_ACTIVE + 1] = "0";
566           
567           status = wrap_mr_query("update_list", 16, argv, NULL, NULL);
568           if (status)
569             {
570               com_err(whoami, status, "while updating list, "
571                       "not deactivating list or filesystem.");
572               exit(1);
573             }
574         }
575       else if (status && status != MR_NO_MATCH)
576         {
577           com_err(whoami, status, "while retrieving list information.");
578           exit(1);
579         }
580
581       status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info,
582                              argv);
583       if (status == MR_SUCCESS)
584         {
585           for (i = 11; i > 0; i--)
586             argv[i + 1] = argv[i];
587           argv[1] = username;
588           argv[FS_TYPE + 1] = "ERR";
589           argv[FS_COMMENTS + 1] = "Locker disabled; call 3-1325 for help";
590           
591           status = wrap_mr_query("update_filesys", 12, argv, NULL, NULL);
592           if (status)
593             {
594               com_err(whoami, status, "while updating filesystem, "
595                       "not deactivating filesystem.");
596               exit(1);
597             }
598         }
599       else if (status && status != MR_NO_MATCH)
600         {
601           com_err(whoami, status, "while retrieving filesystem information.");
602           exit(1);
603         }
604     }
605
606   /* Display user info */
607   if (info_flag)
608     {
609       char *args[2];
610       char *argv[20];
611
612       args[0] = username;
613       status = wrap_mr_query("get_user_account_by_login", 1, args,
614                              save_query_info, argv);
615       if (status)
616         {
617           com_err(whoami, status, "while getting user information.");
618           exit(1);
619         }
620       if (unformatted_flag)
621         show_user_info_unformatted(argv);
622       else
623         show_user_info(argv);
624     }
625
626   /* register a user */
627   if (reg_flag)
628     {
629       char *args[3];
630       char *argv[20];
631
632       args[0] = username;
633       status = wrap_mr_query("get_user_account_by_login", 1, args,
634                              save_query_info, argv);
635       if (status)
636         {
637           com_err(whoami, status, "while looking up uid.");
638           exit(1);
639         }
640
641       args[0] = argv[U_UID];
642       args[1] = username;
643       args[2] = "IMAP";
644
645       status = wrap_mr_query("register_user", 3, args, NULL, NULL);
646       if (status)
647         {
648           com_err(whoami, status, "while registering user.");
649           exit(1);
650         }
651     }
652
653   /* list user reservations */
654   if (list_res_flag)
655     {
656       char *args[1];
657
658       args[0] = username;
659       status = wrap_mr_query("get_user_reservations", 1, args, 
660                              show_reservations, NULL);
661       if (status)
662         if (status != MR_NO_MATCH) {
663           com_err(whoami, status, "while getting user reservations.");
664           exit(1);
665         }
666     }
667
668   /* add user reservations */
669   if (reservation_add_queue)
670     {
671       struct string_list *q = reservation_add_queue;
672
673       while (q) 
674         {
675           char *reservation = q->string;
676           char *args[2];
677
678           args[0] = username;
679           args[1] = reservation;
680           status = wrap_mr_query("add_user_reservation", 2, args, NULL, NULL);
681           if (status)
682             {
683               com_err(whoami, status, "while adding user reservation.");
684               exit(1);
685             }
686
687           q = q->next;
688         }
689     }
690
691   /* delete user reservations */
692   if (reservation_remove_queue)
693     {
694       struct string_list *q = reservation_remove_queue;
695
696       while (q)
697         {
698           char *reservation = q->string;
699           char *args[2];
700
701           args[0] = username;
702           args[1] = reservation;
703           status = wrap_mr_query("delete_user_reservation", 2, args, NULL, 
704                                  NULL);
705           if (status)
706             {
707               com_err(whoami, status, "while deleting user reservation.");
708               exit(1);
709             }
710           
711           q = q->next;
712         }
713     }
714   /* We're done! */
715   mr_disconnect();
716   exit(0);
717 }
718
719 int save_query_info(int argc, char **argv, void *hint)
720 {
721   int i;
722   char **nargv = hint;
723
724   for(i = 0; i < argc; i++)
725     nargv[i] = strdup(argv[i]);
726   
727   return MR_CONT;
728 }
729
730 int show_reservations(int argc, char **argv, void *hint)
731 {
732   printf("Reservation: %s\n", argv[0]);
733
734   return MR_CONT;
735 }
736
737 struct string_list *add_to_string_list(struct string_list *old_list, char *s) {
738   struct string_list *new_list;
739
740   new_list = (struct string_list *)malloc(sizeof(struct string_list *));
741   new_list->next = old_list;
742   new_list->string = s;
743
744   return new_list;
745 }
746
747 int wrap_mr_query(char *handle, int argc, char **argv,
748                   int (*callback)(int, char **, void *), void *callarg) {
749   if (verbose)
750     print_query(handle, argc, argv);
751
752   return mr_query(handle, argc, argv, callback, callarg);
753 }
754
755 void print_query(char *query_name, int argc, char **argv) {
756   int cnt;
757
758   printf("qy %s", query_name);
759   for(cnt = 0; cnt < argc; cnt++)
760     printf(" <%s>", argv[cnt]);
761   printf("\n");
762 }
763
764 void show_user_info(char **argv)
765 {
766   char tbuf[BUFSIZ];
767   int status;
768
769   sprintf(tbuf, "%s, %s %s", argv[U_LAST], argv[U_FIRST], argv[U_MIDDLE]);
770   printf("Login name: %-20s Full name: %s\n", argv[U_NAME], tbuf);
771   printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]);
772   printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS],
773          argv[U_WINCONSOLESHELL]);
774   sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
775           strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
776   printf("Sponsor: %-23s Expiration date: %s\n", tbuf, argv[U_EXPIRATION]);
777   printf("Account is: %-20s MIT ID number: %s\n",
778          UserState(atoi(argv[U_STATE])), argv[U_MITID]);
779   printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]);
780   printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
781   status = atoi(argv[U_STATE]);
782   if (status == 0 || status == 2)
783     {
784       printf("User %s secure Account Coupon to register\n",
785               atoi(argv[U_SECURE]) ? "needs" : "does not need");
786     }
787   printf("Comments: %s\n", argv[U_COMMENT]);
788   printf("Created  by %s on %s.\n", argv[U_CREATOR], argv[U_CREATED]);
789   printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME],
790          argv[U_MODWITH]);
791 }
792
793 void show_user_info_unformatted(char **argv)
794 {
795   char tbuf[BUFSIZ];
796   int status;
797
798   printf("Login name:                %s\n", argv[U_NAME]);
799   printf("Full name:                 %s, %s %s\n", argv[U_LAST], argv[U_FIRST],
800          argv[U_MIDDLE]);
801   printf("User id:                   %s\n", argv[U_UID]);
802   printf("Class:                     %s\n", argv[U_CLASS]);
803   sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
804           strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
805   printf("Sponsor:                   %s\n", tbuf);
806   printf("Expiration date:           %s\n", argv[U_EXPIRATION]);
807   printf("Login shell:               %s\n", argv[U_SHELL]);
808   printf("Windows Console Shell:     %s\n", argv[U_WINCONSOLESHELL]);
809   printf("Account is:                %s\n", UserState(atoi(argv[U_STATE])));
810   printf("MIT ID number:             %s\n", argv[U_MITID]);
811   printf("Windows Home Directory:    %s\n", argv[U_WINHOMEDIR]);
812   printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
813   status = atoi(argv[U_STATE]);
814   if (status == 0 || status == 2)
815     printf("Secure:                  %s secure Account Coupon to register\n",
816            atoi(argv[U_SECURE]) ? "Needs" : "Does not need");
817   printf("Comments:                  %s\n", argv[U_COMMENT]);
818   printf("Created by:                %s\n", argv[U_CREATOR]);
819   printf("Created on:                %s\n", argv[U_CREATED]);
820   printf("Last mod by:               %s\n", argv[U_MODBY]);
821   printf("Last mod on:               %s\n", argv[U_MODTIME]);
822   printf("Last mod with:             %s\n", argv[U_MODWITH]);
823 }
824
825 void usage(char **argv)
826 {
827 #define USAGE_OPTIONS_FORMAT "  %-39s%s\n"
828   fprintf(stderr, "Usage: %s username [options]\n", argv[0]);
829   fprintf(stderr, "Options are\n");
830   fprintf(stderr, "  %-39s\n", "-i   | -info");
831   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C   | -create",
832           "-D   | -deact");
833   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-r   | -register",
834           "-R   | -rename newname");
835   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-U   | -uid uid",
836           "-s   | -shell shell");
837   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S   | -status status",
838           "-w   | -winshell winshell");
839   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F   | -first firstname",
840           "-L   | -last lastname");
841   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M   | -middle middlename",
842           "-I   | -mitid mitid");
843   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl  | -class class",
844           "-c   | -comment comment");
845   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6   | -secure 0|1",
846           "-lr  | -listreservation");
847   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar  | -addreservation reservation",
848           "-dr  | -deletereservation reservation");
849   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-wh  | -winhomedir winhomedir",
850           "-wp  | -winprofiledir winprofiledir");
851   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-sp  | -sponsor sponsor",
852           "-e   | -expiration expiration date");
853   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u   | -unformatted",
854           "-n   | -noauth");
855   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v   | -verbose",
856           "-db  | -database host[:port]");
857
858   exit(1);
859 }
860
861 /* Parse a line of input, fetching a member.  NULL is returned if a member
862  * is not found.  ';' is a comment character.
863  */
864 struct owner_type *parse_member(char *s)
865 {
866   struct owner_type *m;
867   char *p, *lastchar;
868
869   while (*s && isspace(*s))
870     s++;
871   lastchar = p = s;
872   while (*p && *p != '\n' && *p != ';')
873     {
874       if (isprint(*p) && !isspace(*p))
875         lastchar = p++;
876       else
877         p++;
878     }
879   lastchar++;
880   *lastchar = '\0';
881   if (p == s || strlen(s) == 0)
882     return NULL;
883
884   if (!(m = malloc(sizeof(struct owner_type))))
885     return NULL;
886
887   if ((p = strchr(s, ':')))
888     {
889       *p = '\0';
890       m->name = ++p;
891       if (!strcasecmp("user", s))
892         m->type = M_USER;
893       else if (!strcasecmp("list", s))
894         m->type = M_LIST;
895       else if (!strcasecmp("kerberos", s))
896         m->type = M_KERBEROS;
897       else if (!strcasecmp("none", s))
898         m->type = M_NONE;
899       else
900         {
901           m->type = M_ANY;
902           *(--p) = ':';
903           m->name = s;
904         }
905       m->name = strdup(m->name);
906     }
907   else
908     {
909       m->name = strdup(s);
910       m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;
911     }
912   return m;
913 }
This page took 0.113918 seconds and 5 git commands to generate.