]> andersk Git - moira.git/blame - clients/mmoira/form_setup.c
Get X/Motif library locations from config.Imakefile
[moira.git] / clients / mmoira / form_setup.c
CommitLineData
c4095074 1/* $Header$
2 */
3
4#include <stdio.h>
8e1c738c 5#include <stdlib.h>
a1df2cb5 6#include <ctype.h>
698271c7 7#include <string.h>
3353249d 8#include <sys/types.h>
9#include <sys/stat.h>
c4095074 10#include <moira.h>
11#include <moira_site.h>
12#include <Xm/Xm.h>
13#include "mmoira.h"
14
15
16extern char *user, *program_name;
17extern EntryForm *MoiraForms[];
18EntryForm *GetAndClearForm();
19
20char *user_states[] = { "0 - Registerable",
21 "1 - Active",
22 "2 - Half Registered",
23 "3 - Deleted",
24 "4 - Not registerable",
25 "5 - Enrolled/Registerable",
26 "6 - Enrolled/Not Registerable",
27 "7 - Half Enrolled",
28 NULL};
29char *nfs_states[] = { "0 - Not Allocated",
30 "1 - Student",
31 "2 - Faculty",
32 "4 - Staff",
33 "8 - Miscellaneous",
34 NULL};
35
36
e9b00814 37static FixNameCase(form, field)
38EntryForm *form;
39int field;
40{
41 char fixname[128], buf[256];
42
43 strcpy(fixname, stringval(form, field));
44 FixCase(fixname);
45 sprintf(buf, "You entered a name which does not follow the capitalization conventions.\nCorrect it to \"%s\"?", fixname);
46 if (strcmp(fixname, stringval(form, field)) &&
47 AskQuestion(buf, "fixcase"))
48 StoreField(form, field, fixname);
49}
50
51
52get_members(argc, argv, sq)
53int argc;
54char **argv;
55struct save_queue *sq;
56{
57 char buf[256];
58
59 sprintf(buf, "%s (%s)", argv[0], argv[1]);
60 sq_save_data(sq, strsave(buf));
61 return(MR_CONT);
62}
63
64
a1df2cb5 65/* Deal with AFS cell names */
66
67char *canonicalize_cell(c)
68char *c;
69{
70 struct stat stbuf;
71 char path[512];
72 int count;
73
74 c = strtrim(c);
75 sprintf(path, "/afs/%s", c);
76 if (lstat(path, &stbuf) || !stbuf.st_mode&S_IFLNK)
77 return(c);
78 count = readlink(path, path, sizeof(path));
79 if (count < 1) return(c);
80 path[count] = 0;
81 free(c);
82 return(strsave(path));
83}
84
85
86int GetAliasValue(argc, argv, retval)
87int argc;
88char **argv;
89char **retval;
90{
91 *retval = strsave(argv[2]);
92 return(MR_CONT);
93}
94
95
68596e2b 96static int GetArgv(argc, argv, info)
97int argc;
98char **argv;
99char ***info;
100{
101 int i;
68596e2b 102
103 *info = (char **)malloc((argc + 1) * sizeof(char *));
104 for (i = 0; i < argc; i++)
105 (*info)[i] = strsave(argv[i]);
106 (*info)[i] = NULL;
107 return(MR_ABORT);
108}
109
a1df2cb5 110
111MoiraValueChanged(f, prompt)
5032f044 112EntryForm *f;
a1df2cb5 113UserPrompt *prompt;
5032f044 114{
e9b00814 115 char buf[1024];
68596e2b 116 char *argv[5], *p, **info;
a1df2cb5 117 int i, size, field;
e9b00814 118 struct save_queue *sq, *s;
5032f044 119#define maybechange(f, n, v) {if (f->inputlines[n]->insensitive != v) { f->inputlines[n]->insensitive=v; f->inputlines[n]->changed = True; }}
120
a1df2cb5 121 for (field = 0; f->inputlines[field]; field++)
122 if (prompt == f->inputlines[field]) break;
123
5032f044 124 switch (f->menu->operation) {
125 case MM_ADD_LIST:
126 case MM_MOD_LIST:
68596e2b 127 if (field == L_GROUP)
128 maybechange(f, L_GID, !boolval(f, L_GROUP));
129 if (field == L_ACE_TYPE) {
130 if (!strcmp(stringval(f, L_ACE_TYPE), "NONE"))
131 maybechange(f, L_ACE_NAME, True)
132 else
133 maybechange(f, L_ACE_NAME, False)
134 }
5032f044 135 break;
136 case MM_ADD_FILSYS:
137 case MM_MOD_FILSYS:
a1df2cb5 138 if (field == FS_TYPE &&
139 (!strcmp(stringval(f, FS_TYPE), "FSGROUP") ||
140 !strcmp(stringval(f, FS_TYPE), "MUL") ||
141 !strcmp(stringval(f, FS_TYPE), "ERR"))) {
e0ca4a91 142 maybechange(f, FS_MACHINE+1, True);
143 maybechange(f, FS_PACK+1, True);
144 maybechange(f, FS_M_POINT+1, True);
145 maybechange(f, FS_ACCESS+1, True);
146 maybechange(f, FS_CREATE+1, True);
a1df2cb5 147 } else if (field == FS_TYPE &&
148 (!strcmp(stringval(f, FS_TYPE), "NFS") ||
149 !strcmp(stringval(f, FS_TYPE), "AFS") ||
150 !strcmp(stringval(f, FS_TYPE), "RVD"))) {
e0ca4a91 151 maybechange(f, FS_MACHINE+1, False);
152 maybechange(f, FS_PACK+1, False);
153 maybechange(f, FS_M_POINT+1, False);
154 maybechange(f, FS_ACCESS+1, False);
155 maybechange(f, FS_CREATE+1, False);
5032f044 156 }
e0ca4a91 157 if (field == FS_NAME && !strcmp(stringval(f, FS_M_POINT+1), "/mit/")) {
a1df2cb5 158 sprintf(buf, "/mit/%s", stringval(f, FS_NAME));
e0ca4a91 159 StoreField(f, FS_M_POINT+1, buf);
a1df2cb5 160 }
e0ca4a91 161 if (field == FS_MACHINE+1 && !strcmp(stringval(f, FS_TYPE), "AFS")) {
162 p = strsave(stringval(f, FS_MACHINE+1));
a1df2cb5 163 p = canonicalize_cell(p);
164 lowercase(p);
e0ca4a91 165 StoreField(f, FS_MACHINE+1, p);
a1df2cb5 166 free(p);
167 }
e0ca4a91 168 if (field == FS_MACHINE+1 && (!strcmp(stringval(f, FS_TYPE), "NFS") ||
a1df2cb5 169 !strcmp(stringval(f, FS_TYPE), "RVD"))) {
e0ca4a91 170 StoreHost(f, FS_MACHINE+1, &p);
a1df2cb5 171 }
172 if (!strcmp(stringval(f, FS_TYPE), "AFS") &&
173 *stringval(f, FS_NAME) &&
e0ca4a91 174 *stringval(f, FS_MACHINE+1) &&
175 *stringval(f, /*FS_L_TYPE*/FS_TYPE+1)) {
a1df2cb5 176 char *path;
177 int depth;
178
e0ca4a91 179 sprintf(buf, "%s:%s", stringval(f, FS_MACHINE+1),
180 stringval(f, FS_TYPE+1));
a1df2cb5 181 argv[0] = buf;
182 argv[1] = "AFSPATH";
183 argv[2] = "*";
184 path = "???";
185 i = MoiraQuery("get_alias", 3, argv, GetAliasValue, &path);
186 if (i == MR_SUCCESS) {
698271c7 187 p = strchr(path, ':');
a1df2cb5 188 if (p) {
189 *p = 0;
190 depth = atoi(++p);
191 } else depth = 0;
e0ca4a91 192 sprintf(buf, "/afs/%s/%s", stringval(f, FS_MACHINE+1), path);
a1df2cb5 193 if (depth >= 0) {
194 for (p=stringval(f, FS_NAME);
195 *p && (p - stringval(f, FS_NAME)) < depth;
196 p++) {
197 if (islower(*p)) {
198 strcat(buf, "/x");
199 buf[strlen(buf)-1] = *p;
200 } else {
201 sprintf(buf, "/afs/%s/%s/other",
e0ca4a91 202 stringval(f, FS_MACHINE+1), path);
a1df2cb5 203 break;
204 }
205 }
206 } else if (depth = -1) {
207 if (isdigit(stringval(f, FS_NAME)[0])) {
208 strcat(buf, "/");
209 depth = strlen(buf);
210 for (p = stringval(f, FS_NAME);
211 *p && isdigit(*p);
212 p++) {
213 buf[depth++] = *p;
214 buf[depth] = 0;
215 }
216 } else
217 strcat(buf, "/other");
218 } else {
219 /* no default */
220 }
221 strcat(buf, "/");
222 strcat(buf, stringval(f, FS_NAME));
223 free(path);
224 } else {
e0ca4a91 225 p = strsave(stringval(f, FS_TYPE+1));
226 sprintf(buf, "/afs/%s/%s/%s", stringval(f, FS_MACHINE+1),
a1df2cb5 227 lowercase(p), stringval(f, FS_NAME));
228 free(p);
229 }
e0ca4a91 230 StoreField(f, FS_PACK+1, buf);
a1df2cb5 231 }
5032f044 232 break;
233 case MM_SET_POBOX:
234 if (!strcmp(stringval(f, PO_TYPE), "POP")) {
235 maybechange(f, 2, True);
236 maybechange(f, 3, False);
237 } else if (!strcmp(stringval(f, PO_TYPE), "SMTP")) {
238 maybechange(f, 2, False);
239 maybechange(f, 3, True);
240 } else if (!strcmp(stringval(f, PO_TYPE), "NONE")) {
241 maybechange(f, 2, True);
242 maybechange(f, 3, True);
243 }
244 break;
245 case MM_ADD_QUOTA:
246 case MM_MOD_QUOTA:
68596e2b 247 if (field == Q_FILESYS) {
248 argv[0] = stringval(f, 0);
249 i = MoiraQuery("get_filesys_by_label", 1, argv, GetArgv, &info);
250 if (i == MR_SUCCESS) {
251 if (!strcmp(info[FS_TYPE], "AFS")) {
252 StoreField(f, 1, "ANY");
253 } else if (!strcmp(info[FS_TYPE], "NFS")) {
254 argv[0] = strsave(info[FS_MACHINE]);
255 argv[1] = strsave(info[FS_PACK]);
698271c7 256 p = strrchr(argv[1], '/');
68596e2b 257 if (p) *p = 0;
258 for (i = 0; info[i]; i++) free(info[i]);
259 free(info);
260 i = MoiraQuery("get_nfsphys", 2, argv, GetArgv, &info);
261 if (i == MR_SUCCESS) {
262 i = atoi(info[NFS_STATUS]);
263 if (i & MR_FS_GROUPQUOTA)
264 StoreField(f, 1, "GROUP");
265 else
266 StoreField(f, 1, "USER");
267 for (i = 0; info[i]; i++) free(info[i]);
268 free(info);
269 }
270 }
271 }
272 }
ca5beb9a 273 if (!strcmp(stringval(f, Q_TYPE), "ANY"))
274 maybechange(f, Q_NAME, True)
275 else
276 maybechange(f, Q_NAME, False)
5032f044 277 break;
278 case MM_ADD_ZEPHYR:
279 case MM_MOD_ZEPHYR:
280 if (!strcmp(stringval(f, ZA_XMT_TYPE), "NONE"))
281 maybechange(f, ZA_XMT_ID, True)
282 else
283 maybechange(f, ZA_XMT_ID, False)
284 if (!strcmp(stringval(f, ZA_SUB_TYPE), "NONE"))
285 maybechange(f, ZA_SUB_ID, True)
286 else
287 maybechange(f, ZA_SUB_ID, False)
288 if (!strcmp(stringval(f, ZA_IWS_TYPE), "NONE"))
289 maybechange(f, ZA_IWS_ID, True)
290 else
291 maybechange(f, ZA_IWS_ID, False)
292 if (!strcmp(stringval(f, ZA_IUI_TYPE), "NONE"))
293 maybechange(f, ZA_IUI_ID, True)
294 else
295 maybechange(f, ZA_IUI_ID, False)
296 break;
297 case MM_ADD_USER:
e9b00814 298 FixNameCase(f, U_LAST);
299 FixNameCase(f, U_FIRST);
300 FixNameCase(f, U_MIDDLE);
301 break;
302 case MM_SHOW_USER:
303 FixNameCase(f, 1);
304 FixNameCase(f, 2);
305 break;
306 case MM_ADD_FSGROUP:
307 argv[0] = stringval(f, 0);
308 sq = sq_create();
309 i = MoiraQuery("get_fsgroup_members", 1, argv, get_members, (char *)sq);
310 if (i) {
311 com_err(program_name, i, " retrieving filesystem group members");
312 break;
313 }
314 size = 1;
315 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
316 size++;
317 if (f->inputlines[2]->keywords)
318 free(f->inputlines[2]->keywords);
319 f->inputlines[2]->keywords = (char **)malloc(sizeof(char *)*(size+2));
320 if (f->inputlines[2]->keywords == NULL) {
321 display_error("Out of memory while fetching members");
322 return;
323 }
324 f->inputlines[2]->keywords[0] = "[First]";
325 for (i = 0; i < size; i++)
326 sq_get_data(sq, &f->inputlines[2]->keywords[i+1]);
327 f->inputlines[2]->keywords[i+1] = NULL;
328 f->inputlines[2]->changed = 1;
329 sq_destroy(sq);
330 RemakeRadioField(f, 2);
331 break;
332 case MM_DEL_FSGROUP:
333 argv[0] = stringval(f, 0);
334 sq = sq_create();
335 i = MoiraQuery("get_fsgroup_members", 1, argv, get_members, (char *)sq);
336 if (i) {
337 com_err(program_name, i, " retrieving filesystem group members");
338 break;
339 }
340 size = 1;
341 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
342 size++;
343 if (f->inputlines[1]->keywords)
344 free(f->inputlines[1]->keywords);
345 f->inputlines[1]->keywords = (char **)malloc(sizeof(char *)*(size+1));
346 if (f->inputlines[1]->keywords == NULL) {
347 display_error("Out of memory while fetching members");
348 return;
349 }
350 for (i = 0; i < size; i++)
351 sq_get_data(sq, &f->inputlines[1]->keywords[i]);
352 f->inputlines[1]->keywords[i] = NULL;
353 f->inputlines[1]->changed = 1;
354 sq_destroy(sq);
355 RemakeRadioField(f, 1);
356 break;
357 case MM_MOV_FSGROUP:
358 argv[0] = stringval(f, 0);
359 sq = sq_create();
360 i = MoiraQuery("get_fsgroup_members", 1, argv, get_members, (char *)sq);
361 if (i) {
362 com_err(program_name, i, " retrieving filesystem group members");
363 break;
364 }
365 size = 1;
366 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
367 size++;
368 if (f->inputlines[1]->keywords)
369 free(f->inputlines[1]->keywords);
370 f->inputlines[1]->keywords = (char **)malloc(sizeof(char *)*(size+1));
371 if (f->inputlines[1]->keywords == NULL) {
372 display_error("Out of memory while fetching members");
373 return;
374 }
375 if (f->inputlines[2]->keywords)
376 free(f->inputlines[2]->keywords);
377 f->inputlines[2]->keywords = (char **)malloc(sizeof(char *)*(size+2));
378 if (f->inputlines[2]->keywords == NULL) {
379 display_error("Out of memory while fetching members");
380 return;
381 }
382 f->inputlines[2]->keywords[0] = "[First]";
383 for (i = 0; i < size; i++) {
384 sq_get_data(sq, &f->inputlines[1]->keywords[i]);
385 f->inputlines[2]->keywords[i+1] = f->inputlines[1]->keywords[i];
386 }
387 f->inputlines[1]->keywords[i] = NULL;
388 f->inputlines[2]->keywords[i+1] = NULL;
389 f->inputlines[1]->changed = 1;
390 f->inputlines[2]->changed = 1;
391 sq_destroy(sq);
392 RemakeRadioField(f, 1);
393 RemakeRadioField(f, 2);
5032f044 394 break;
395 default:
396 return;
397 }
398 UpdateForm(f);
399}
400
401
c4095074 402/* Called when a menu item is selected. */
403
404MoiraMenuRequest(menu)
405MenuItem *menu;
406{
407 EntryForm *f;
408
409 f = GetAndClearForm(menu->form);
410 if (f == NULL) {
411 if (!strcmp(menu->form, "0"))
412 MoiraMenuComplete(menu);
413 else
414 display_error("Sorry, unable to process that request (no form registered).");
415 return;
416 }
417
418 switch (menu->operation) {
419 case MM_SHOW_USER:
420 GetKeywords(f, 4, "class");
e9b00814 421 f->inputlines[1]->valuechanged = MoiraValueChanged;
422 f->inputlines[2]->valuechanged = MoiraValueChanged;
c4095074 423 break;
424 case MM_ADD_USER:
425 StoreField(f, U_NAME, UNIQUE_LOGIN);
426 StoreField(f, U_UID, UNIQUE_UID);
427 StoreField(f, U_SHELL, "/bin/csh");
428 StoreField(f, U_STATE, user_states[US_NO_LOGIN_YET]);
429 f->inputlines[U_STATE]->keywords = user_states;
e9b00814 430 f->inputlines[U_LAST]->valuechanged = MoiraValueChanged;
5032f044 431 f->inputlines[U_FIRST]->valuechanged = MoiraValueChanged;
432 f->inputlines[U_MIDDLE]->valuechanged = MoiraValueChanged;
c4095074 433 GetKeywords(f, U_CLASS, "class");
434 break;
435 case MM_SET_POBOX:
436 GetKeywords(f, 1, "pobox");
437 GetKeywords(f, 3, "poserver");
5032f044 438 f->inputlines[PO_TYPE]->valuechanged = MoiraValueChanged;
c4095074 439 break;
440 case MM_ADD_FILSYS:
e9b00814 441 StoreField(f, FS_TYPE, "AFS");
e0ca4a91 442 StoreField(f, FS_M_POINT+1, "/mit/");
443 StoreField(f, FS_MACHINE+1, "athena.mit.edu");
444 StoreField(f, FS_ACCESS+1, "w");
445 StoreField(f, FS_OWNER+1, user);
446 StoreField(f, FS_OWNERS+1, user);
447 boolval(f, FS_CREATE+1) = TRUE;
c4095074 448 GetKeywords(f, FS_TYPE, "filesys");
e0ca4a91 449 GetKeywords(f, FS_ACCESS+1, "fs_access_AFS");
450 GetKeywords(f, FS_TYPE+1, "lockertype");
5032f044 451 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
e0ca4a91 452 f->inputlines[FS_TYPE+1]->valuechanged = MoiraValueChanged;
a1df2cb5 453 f->inputlines[FS_NAME]->valuechanged = MoiraValueChanged;
e0ca4a91 454 f->inputlines[FS_MACHINE+1]->valuechanged = MoiraValueChanged;
c4095074 455 break;
e9b00814 456 case MM_ADD_FSGROUP:
a1df2cb5 457 if (f->inputlines[2]->keywords)
458 free(f->inputlines[2]->keywords);
e9b00814 459 f->inputlines[2]->keywords = (char **)malloc(sizeof(char*)*2);
460 f->inputlines[2]->keywords[0] = "[First]";
461 f->inputlines[2]->keywords[1] = NULL;
462 f->inputlines[0]->valuechanged = MoiraValueChanged;
463 break;
464 case MM_DEL_FSGROUP:
a1df2cb5 465 if (f->inputlines[1]->keywords)
466 free(f->inputlines[1]->keywords);
e9b00814 467 f->inputlines[1]->keywords = (char **)malloc(sizeof(char*)*2);
468 f->inputlines[1]->keywords[0] = "[Placeholder]";
469 f->inputlines[1]->keywords[1] = NULL;
470 f->inputlines[0]->valuechanged = MoiraValueChanged;
471 break;
472 case MM_MOV_FSGROUP:
a1df2cb5 473 if (f->inputlines[1]->keywords)
474 free(f->inputlines[1]->keywords);
e9b00814 475 f->inputlines[1]->keywords = (char **)malloc(sizeof(char*)*2);
476 f->inputlines[1]->keywords[0] = "[Placeholder]";
477 f->inputlines[1]->keywords[1] = NULL;
a1df2cb5 478 if (f->inputlines[2]->keywords)
479 free(f->inputlines[2]->keywords);
e9b00814 480 f->inputlines[2]->keywords = (char **)malloc(sizeof(char*)*2);
481 f->inputlines[2]->keywords[0] = "[First]";
482 f->inputlines[2]->keywords[1] = NULL;
483 f->inputlines[0]->valuechanged = MoiraValueChanged;
484 break;
c4095074 485 case MM_ADD_NFS:
486 StoreField(f, 1, "/u1/lockers");
487 StoreField(f, 2, "/dev/");
488 StoreField(f, 5, "0");
489 StoreField(f, 6, "0");
490 StoreField(f, 3, nfs_states[1]);
491 f->inputlines[3]->keywords = nfs_states;
492 break;
493 case MM_ADD_QUOTA:
494 case MM_DEL_QUOTA:
892c98b2 495 case MM_MOD_QUOTA:
496 GetKeywords(f, 1, "quota_type");
68596e2b 497 f->inputlines[Q_FILESYS]->valuechanged = MoiraValueChanged;
5032f044 498 f->inputlines[Q_TYPE]->valuechanged = MoiraValueChanged;
c4095074 499 break;
500 case MM_SHOW_ACE_USE:
501 StoreField(f, 0, "USER");
502 GetKeywords(f, 0, "ace_type");
503 break;
504 case MM_ADD_LIST:
505 boolval(f, L_ACTIVE) = TRUE;
506 boolval(f, L_MAILLIST) = TRUE;
507 StoreField(f, L_GID, UNIQUE_GID);
508 StoreField(f, L_ACE_TYPE, "USER");
509 GetKeywords(f, L_ACE_TYPE, "ace_type");
5032f044 510 f->inputlines[L_GID]->insensitive = True;
511 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
512 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
c4095074 513 break;
514 case MM_SHOW_MEMBERS:
515 GetKeywords(f, 1, "member");
516 break;
517 case MM_ADD_MEMBER:
518 case MM_DEL_MEMBER:
519 GetKeywords(f, 1, "member");
520 break;
521 case MM_DEL_ALL_MEMBER:
522 boolval(f, 2) = TRUE;
523 GetKeywords(f, 0, "member");
524 break;
525 case MM_ADD_MACH:
526 GetKeywords(f, 1, "mac_type");
527 break;
528 case MM_ADD_PCAP:
529 StoreField(f, PCAP_SPOOL_DIR, "/usr/spool/printer/");
530 boolval(f, PCAP_AUTH) = TRUE;
531 StoreField(f, PCAP_PRICE, "10");
532 break;
533 case MM_ADD_SERVICE:
534 StoreField(f, SVC_INTERVAL, "1430");
535 StoreField(f, SVC_TARGET, "/tmp/");
536 StoreField(f, SVC_SCRIPT, "/moira/bin/");
537 StoreField(f, 4, "UNIQUE");
538 StoreField(f, 6, "NONE");
539 GetKeywords(f, 4, "service");
540 GetKeywords(f, 6, "ace_type");
541 break;
542 case MM_SHOW_ALIAS:
543 StoreField(f, 2, "*");
544 GetKeywords(f, 1, "alias");
545 break;
546 case MM_ADD_ZEPHYR:
547 GetKeywords(f, 1, "ace_type");
548 GetKeywords(f, 3, "ace_type");
549 GetKeywords(f, 5, "ace_type");
550 GetKeywords(f, 7, "ace_type");
5032f044 551 f->inputlines[ZA_XMT_TYPE]->valuechanged = MoiraValueChanged;
552 f->inputlines[ZA_SUB_TYPE]->valuechanged = MoiraValueChanged;
553 f->inputlines[ZA_IWS_TYPE]->valuechanged = MoiraValueChanged;
554 f->inputlines[ZA_IUI_TYPE]->valuechanged = MoiraValueChanged;
c4095074 555 break;
556 }
557
558 f->menu = menu;
ca5beb9a 559 if (tty)
560 TtyForm(f);
561 else
562 DisplayForm(f);
c4095074 563}
564
565
566/* Find a form by name. Returns a pointer to the form or NULL on error. */
567
568EntryForm *GetForm(name)
569char *name;
570{
571 EntryForm **fp;
572
573 for (fp = MoiraForms; *fp; fp++)
574 if (!strcmp((*fp)->formname, name))
575 break;
576 return(*fp);
577}
578
579
580/* Find a form by name and clear all of its fields. Returns a pointer
581 * to the form or NULL on error.
582 */
583
584EntryForm *GetAndClearForm(name)
585char *name;
586{
587 EntryForm **fp;
588 UserPrompt *p, **pp;
589 static BottomButton **buttons = NULL;
5032f044 590 int MoiraFormComplete(), MoiraFormApply();
591 int button_callback(), help_form_callback();
c4095074 592
593 for (fp = MoiraForms; *fp; fp++)
594 if (!strcmp((*fp)->formname, name))
595 break;
596 if (*fp == (EntryForm *)NULL)
597 return(NULL);
598
599 for (pp = (*fp)->inputlines; p = *pp; pp++) {
600 switch (p->type) {
601 case FT_STRING:
602 case FT_KEYWORD:
603 if (p->returnvalue.stringvalue)
604 free(p->returnvalue.stringvalue);
605 p->returnvalue.stringvalue = (char *)malloc(MAXFIELDSIZE);
606 if (p->returnvalue.stringvalue == NULL) {
607 fprintf(stderr, "Moira: out of memory\n");
608 return(NULL);
609 }
610 *(p->returnvalue.stringvalue) = '\0';
611 break;
612 case FT_BOOLEAN:
613 p->returnvalue.booleanvalue = False;
614 break;
615 case FT_NUMBER:
616 p->returnvalue.integervalue = 0;
617 break;
618 }
619 }
ca5beb9a 620 if (!tty && buttons == NULL) {
5032f044 621 buttons = (BottomButton **)malloc(5 * sizeof(BottomButton *));
c4095074 622 buttons[0] = (BottomButton *)malloc(sizeof(BottomButton));
623 buttons[0]->label = "OK";
624 buttons[0]->returnfunction = MoiraFormComplete;
625 buttons[1] = (BottomButton *)malloc(sizeof(BottomButton));
5032f044 626 buttons[1]->label = "Apply";
627 buttons[1]->returnfunction = MoiraFormApply;
c4095074 628 buttons[2] = (BottomButton *)malloc(sizeof(BottomButton));
5032f044 629 buttons[2]->label = "Cancel";
630 buttons[2]->returnfunction = button_callback;
631 buttons[3] = (BottomButton *)malloc(sizeof(BottomButton));
632 buttons[3]->label = "Help";
633 buttons[3]->returnfunction = help_form_callback;
634 buttons[4] = NULL;
c4095074 635 }
636 (*fp)->buttons = buttons;
e045435f 637 (*fp)->extrastuff = NULL;
c4095074 638 return(*fp);
639}
640
641
642/* Store a string into a given field in a form. */
643
644StoreField(form, field, value)
645EntryForm *form;
646int field;
647char *value;
648{
649 strncpy(form->inputlines[field]->returnvalue.stringvalue,
650 value, MAXFIELDSIZE);
651}
652
653
892c98b2 654char *StringValue(form, field)
655EntryForm *form;
656int field;
657{
658 switch (form->inputlines[field]->type) {
659 case FT_STRING:
660 case FT_KEYWORD:
661 return(stringval(form, field));
662 case FT_BOOLEAN:
663 return(boolval(form, field) ? "1" : "0");
664 }
665}
666
667
7df88a65 668StoreHost(form, field, dest)
669EntryForm *form;
670int field;
671char **dest;
672{
673 char *s;
674
e9b00814 675 s = strsave(stringval(form, field));
7df88a65 676 s = canonicalize_hostname(s);
e9b00814 677 StoreField(form, field, s);
678 form->inputlines[field]->changed = True;
679 UpdateForm(form);
7df88a65 680 free(s);
e9b00814 681 *dest = stringval(form, field);
7df88a65 682}
683
684
c4095074 685/* Helper routine for GetKeywords() */
686
687static get_alias(argc, argv, sq)
688int argc;
689char **argv;
690struct save_queue *sq;
691{
692 sq_save_data(sq, strsave(argv[2]));
693#ifdef DEBUG
694 printf("found keyword %s\n", argv[2]);
695#endif
696 return(MR_CONT);
697}
698
699static get_sloc(argc, argv, sq)
700int argc;
701char **argv;
702struct save_queue *sq;
703{
704 sq_save_data(sq, strsave(argv[1]));
705#ifdef DEBUG
706 printf("found sloc %s\n", argv[1]);
707#endif
708 return(MR_CONT);
709}
710
711
712/* Retrieve possible keyword values from Moira and store them in the specified
713 * field of the form. Returns 0 if successful, -1 if not.
714 */
715
5032f044 716static struct save_queue *cache = NULL;
717struct cache_elem { char *name; char **values; };
718
c4095074 719int GetKeywords(form, field, name)
720EntryForm *form;
721int field;
722char *name;
723{
c4095074 724 struct save_queue *sq, *s;
5032f044 725 struct cache_elem *ce;
c4095074 726 int i, size, stat;
727 char *argv[4];
728
729 /* init cache */
730 if (cache == NULL)
731 cache = sq_create();
732 cache->q_lastget = NULL;
733
e9b00814 734 if (!strcmp(name, "fsgroup")) {
735 form->inputlines[field]->keywords = NULL;
736 }
737
c4095074 738 /* look through cache */
739 while (sq_get_data(cache, &ce))
740 if (!strcmp(ce->name, name)) {
741 form->inputlines[field]->keywords = ce->values;
742 return(0);
743 }
744
745 /* not in cache, do query */
746 sq = sq_create();
747 if (!strcmp(name, "poserver")) {
748 argv[0] = "POP";
749 stat = MoiraQuery("get_server_locations", 1, argv, get_sloc,
750 (char *)sq);
751 if (stat) {
752 com_err(program_name, stat, "retrieving service locations");
753 return(-1);
754 }
755 } else {
756 argv[0] = name;
757 argv[1] = "TYPE";
758 argv[2] = "*";
759 stat = MoiraQuery("get_alias", 3, argv, get_alias, (char *)sq);
760 if (stat) {
761 com_err(program_name, stat, "retrieving keyword values");
762 return(-1);
763 }
764 }
765
766 size = 1;
767 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
768 size++;
769#ifdef DEBUG
770 printf("Found %d keywords of type %s\n", size, name);
771#endif
772
773 /* transform query data into proper malloc'ed structure */
774 ce = (struct cache_elem *) malloc(sizeof(struct cache_elem));
775 if (ce == NULL) {
776 display_error("Out of memory while fetching keywords");
777 return(-1);
778 }
779 ce->name = name;
780 ce->values = (char **) malloc(sizeof(char *) * (size + 1));
781 if (ce->values == NULL) {
782 display_error("Out of memory while fetching keywords");
783 return(-1);
784 }
785 for (i = 0; i < size; i++)
786 sq_get_data(sq, &(ce->values[i]));
787 ce->values[i] = NULL;
788 sq_destroy(sq);
789
790 /* put it in the cache */
791 sq_save_data(cache, ce);
792
793 /* and return answer */
794 form->inputlines[field]->keywords = ce->values;
795 return(0);
796}
5032f044 797
798CacheNewValue(form, field, name, value)
799EntryForm *form;
800int field;
801char *name;
802char *value;
803{
804 struct save_queue *sq;
805 struct cache_elem *ce;
e9b00814 806 int size;
5032f044 807
e9b00814 808 /* init cache */
809 if (cache == NULL)
810 cache = sq_create();
5032f044 811 cache->q_lastget = NULL;
812
813 /* find entry in cache */
814 while (sq_get_data(cache, &ce))
815 if (!strcmp(ce->name, name))
816 break;
817
818 /* get its size */
819 for (size = 0; ce->values[size]; size++);
820
821 /* add new keyword */
822 ce->values = (char **)realloc(ce->values, sizeof(char *) * (size + 2));
823 ce->values[size] = strsave(value);
824 ce->values[size + 1] = NULL;
825
826#ifdef DEBUG
827 printf("CacheNewValue(%x, %d, %s, %s)\n", form, field, name, value);
828 printf(" form is %x (%s)\n", form, form->formname);
829 printf(" field is %d (%s)\n", field, form->inputlines[field]->prompt);
830 printf(" keywords: ");
831 for (size = 0; ce->values[size]; size++) printf("%s ", ce->values[size]);
832 printf("\n");
833#endif /* DEBUG */
834
835 /* new update form */
836 form->inputlines[field]->keywords = ce->values;
ca5beb9a 837 if (!tty) RemakeRadioField(form, field);
5032f044 838}
This page took 0.216866 seconds and 5 git commands to generate.