]> andersk Git - moira.git/blob - clients/mmoira/form_setup.c
Initial revision
[moira.git] / clients / mmoira / form_setup.c
1 /* $Header$
2  */
3
4 #include <stdio.h>
5 #include <moira.h>
6 #include <moira_site.h>
7 #include <Xm/Xm.h>
8 #include "mmoira.h"
9
10
11 extern char *user, *program_name;
12 extern EntryForm *MoiraForms[];
13 EntryForm *GetAndClearForm();
14
15 char *user_states[] = { "0 - Registerable",
16                           "1 - Active",
17                           "2 - Half Registered",
18                           "3 - Deleted",
19                           "4 - Not registerable",
20                           "5 - Enrolled/Registerable",
21                           "6 - Enrolled/Not Registerable",
22                           "7 - Half Enrolled",
23                           NULL};
24 char *nfs_states[] = { "0 - Not Allocated",
25                          "1 - Student",
26                           "2 - Faculty",
27                           "4 - Staff",
28                           "8 - Miscellaneous",
29                           NULL};
30
31
32 /* Called when a menu item is selected. */
33
34 MoiraMenuRequest(menu)
35 MenuItem        *menu;
36 {
37     EntryForm *f;
38
39     f = GetAndClearForm(menu->form);
40     if (f == NULL) {
41         if (!strcmp(menu->form, "0"))
42           MoiraMenuComplete(menu);
43         else
44           display_error("Sorry, unable to process that request (no form registered).");
45         return;
46     }
47
48     switch (menu->operation) {
49     case MM_SHOW_USER:
50         GetKeywords(f, 4, "class");
51         break;
52     case MM_ADD_USER:
53         StoreField(f, U_NAME, UNIQUE_LOGIN);
54         StoreField(f, U_UID, UNIQUE_UID);
55         StoreField(f, U_SHELL, "/bin/csh");
56         StoreField(f, U_STATE, user_states[US_NO_LOGIN_YET]);
57         f->inputlines[U_STATE]->keywords = user_states;
58         GetKeywords(f, U_CLASS, "class");
59         break;
60     case MM_SET_POBOX:
61         GetKeywords(f, 1, "pobox");
62         GetKeywords(f, 3, "poserver");
63         break;
64     case MM_ADD_FILSYS:
65         StoreField(f, FS_TYPE, "NFS");
66         StoreField(f, FS_M_POINT, "/mit/");
67         StoreField(f, FS_ACCESS, "w");
68         StoreField(f, FS_OWNER, user);
69         StoreField(f, FS_OWNERS, user);
70         boolval(f, FS_CREATE) = TRUE;
71         GetKeywords(f, FS_TYPE, "filesys");
72         GetKeywords(f, FS_ACCESS, "fs_access_NFS");
73         GetKeywords(f, FS_L_TYPE, "lockertype");
74         break;
75     case MM_ADD_NFS:
76         StoreField(f, 1, "/u1/lockers");
77         StoreField(f, 2, "/dev/");
78         StoreField(f, 5, "0");
79         StoreField(f, 6, "0");
80         StoreField(f, 3, nfs_states[1]);
81         f->inputlines[3]->keywords = nfs_states;
82         break;
83     case MM_ADD_QUOTA:
84     case MM_DEL_QUOTA:
85         GetKeywords(f, 0, "quota_type");
86         break;
87     case MM_SHOW_ACE_USE:
88         StoreField(f, 0, "USER");
89         GetKeywords(f, 0, "ace_type");
90         break;
91     case MM_ADD_LIST:
92         boolval(f, L_ACTIVE) = TRUE;
93         boolval(f, L_MAILLIST) = TRUE;
94         StoreField(f, L_GID, UNIQUE_GID);
95         StoreField(f, L_ACE_TYPE, "USER");
96         GetKeywords(f, L_ACE_TYPE, "ace_type");
97         break;
98     case MM_SHOW_MEMBERS:
99         GetKeywords(f, 1, "member");
100         break;
101     case MM_ADD_MEMBER:
102     case MM_DEL_MEMBER:
103         GetKeywords(f, 1, "member");
104         break;
105     case MM_DEL_ALL_MEMBER:
106         boolval(f, 2) = TRUE;
107         GetKeywords(f, 0, "member");
108         break;
109     case MM_ADD_MACH:
110         GetKeywords(f, 1, "mac_type");
111         break;
112     case MM_ADD_PCAP:
113         StoreField(f, PCAP_SPOOL_DIR, "/usr/spool/printer/");
114         boolval(f, PCAP_AUTH) = TRUE;
115         StoreField(f, PCAP_PRICE, "10");
116         break;
117     case MM_ADD_SERVICE:
118         StoreField(f, SVC_INTERVAL, "1430");
119         StoreField(f, SVC_TARGET, "/tmp/");
120         StoreField(f, SVC_SCRIPT, "/moira/bin/");
121         StoreField(f, 4, "UNIQUE");
122         StoreField(f, 6, "NONE");
123         GetKeywords(f, 4, "service");
124         GetKeywords(f, 6, "ace_type");
125         break;
126     case MM_SHOW_ALIAS:
127         StoreField(f, 2, "*");
128         GetKeywords(f, 1, "alias");
129         break;
130     case MM_ADD_ZEPHYR:
131         GetKeywords(f, 1, "ace_type");
132         GetKeywords(f, 3, "ace_type");
133         GetKeywords(f, 5, "ace_type");
134         GetKeywords(f, 7, "ace_type");
135         break;
136     }
137
138     f->menu = menu;
139     DisplayForm(f);
140 }
141
142
143 /* Find a form by name.  Returns a pointer to the form or NULL on error. */
144
145 EntryForm *GetForm(name)
146 char *name;
147 {
148     EntryForm **fp;
149
150     for (fp = MoiraForms; *fp; fp++)
151       if (!strcmp((*fp)->formname, name))
152         break;
153     return(*fp);
154 }
155
156
157 /* Find a form by name and clear all of its fields.  Returns a pointer
158  * to the form or NULL on error.
159  */
160
161 EntryForm *GetAndClearForm(name)
162 char *name;
163 {
164     EntryForm **fp;
165     UserPrompt *p, **pp;
166     static BottomButton **buttons = NULL;
167     int MoiraFormComplete(), button_callback(), help_form_callback();
168
169     for (fp = MoiraForms; *fp; fp++)
170       if (!strcmp((*fp)->formname, name))
171         break;
172     if (*fp == (EntryForm *)NULL)
173       return(NULL);
174
175     for (pp = (*fp)->inputlines; p = *pp; pp++) {
176         switch (p->type) {
177         case FT_STRING:
178         case FT_KEYWORD:
179             if (p->returnvalue.stringvalue)
180               free(p->returnvalue.stringvalue);
181             p->returnvalue.stringvalue = (char *)malloc(MAXFIELDSIZE);
182             if (p->returnvalue.stringvalue == NULL) {
183                 fprintf(stderr, "Moira: out of memory\n");
184                 return(NULL);
185             }
186             *(p->returnvalue.stringvalue) = '\0';
187             break;
188         case FT_BOOLEAN:
189             p->returnvalue.booleanvalue = False;
190             break;
191         case FT_NUMBER:
192             p->returnvalue.integervalue = 0;
193             break;
194         }
195     }
196     if (buttons == NULL) {
197         buttons = (BottomButton **)malloc(4 * sizeof(BottomButton *));
198         buttons[0] = (BottomButton *)malloc(sizeof(BottomButton));
199         buttons[0]->label = "OK";
200         buttons[0]->returnfunction = MoiraFormComplete;
201         buttons[1] = (BottomButton *)malloc(sizeof(BottomButton));
202         buttons[1]->label = "Cancel";
203         buttons[1]->returnfunction = button_callback;
204         buttons[2] = (BottomButton *)malloc(sizeof(BottomButton));
205         buttons[2]->label = "Help";
206         buttons[2]->returnfunction = help_form_callback;
207         buttons[3] = NULL;
208     }
209     (*fp)->buttons = buttons;
210     return(*fp);
211 }
212
213
214 /* Store a string into a given field in a form. */
215
216 StoreField(form, field, value)
217 EntryForm *form;
218 int field;
219 char *value;
220 {
221     strncpy(form->inputlines[field]->returnvalue.stringvalue,
222             value, MAXFIELDSIZE);
223 }
224
225
226 /* Helper routine for GetKeywords() */
227
228 static get_alias(argc, argv, sq)
229 int argc;
230 char **argv;
231 struct save_queue *sq;
232 {
233     sq_save_data(sq, strsave(argv[2]));
234 #ifdef DEBUG
235     printf("found keyword %s\n", argv[2]);
236 #endif    
237     return(MR_CONT);
238 }
239
240 static get_sloc(argc, argv, sq)
241 int argc;
242 char **argv;
243 struct save_queue *sq;
244 {
245     sq_save_data(sq, strsave(argv[1]));
246 #ifdef DEBUG
247     printf("found sloc %s\n", argv[1]);
248 #endif    
249     return(MR_CONT);
250 }
251
252
253 /* Retrieve possible keyword values from Moira and store them in the specified
254  * field of the form.  Returns 0 if successful, -1 if not.
255  */
256
257 int GetKeywords(form, field, name)
258 EntryForm *form;
259 int field;
260 char *name;
261 {
262     static struct save_queue *cache = NULL;
263     struct save_queue *sq, *s;
264     struct cache_elem { char *name; char **values; } *ce;
265     int i, size, stat;
266     char *argv[4];
267
268     /* init cache */
269     if (cache == NULL)
270       cache = sq_create();
271     cache->q_lastget = NULL;
272
273     /* look through cache */
274     while (sq_get_data(cache, &ce))
275       if (!strcmp(ce->name, name)) {
276           form->inputlines[field]->keywords = ce->values;
277           return(0);
278       }
279
280     /* not in cache, do query */
281     sq = sq_create();
282     if (!strcmp(name, "poserver")) {
283         argv[0] = "POP";
284         stat = MoiraQuery("get_server_locations", 1, argv, get_sloc,
285                           (char *)sq);
286         if (stat) {
287             com_err(program_name, stat, "retrieving service locations");
288             return(-1);
289         }
290     } else {
291         argv[0] = name;
292         argv[1] = "TYPE";
293         argv[2] = "*";
294         stat = MoiraQuery("get_alias", 3, argv, get_alias, (char *)sq);
295         if (stat) {
296             com_err(program_name, stat, "retrieving keyword values");
297             return(-1);
298         }
299     }
300
301     size = 1;
302     for (s = sq->q_next; s->q_next != sq; s = s->q_next)
303       size++;
304 #ifdef DEBUG
305     printf("Found %d keywords of type %s\n", size, name);
306 #endif
307
308     /* transform query data into proper malloc'ed structure */
309     ce = (struct cache_elem *) malloc(sizeof(struct cache_elem));
310     if (ce == NULL) {
311         display_error("Out of memory while fetching keywords");
312         return(-1);
313     }
314     ce->name = name;
315     ce->values = (char **) malloc(sizeof(char *) * (size + 1));
316     if (ce->values == NULL) {
317         display_error("Out of memory while fetching keywords");
318         return(-1);
319     }
320     for (i = 0; i < size; i++)
321       sq_get_data(sq, &(ce->values[i]));
322     ce->values[i] = NULL;
323     sq_destroy(sq);
324
325     /* put it in the cache */
326     sq_save_data(cache, ce);
327
328     /* and return answer */
329     form->inputlines[field]->keywords = ce->values;
330     return(0);
331 }
332
333
334 /********** temporary *8********/
335
336 display_error(s)
337 char *s;
338 { fprintf(stderr, "%s\n", s); }
This page took 0.061203 seconds and 5 git commands to generate.