]> andersk Git - moira.git/blame - clients/mmoira/form_setup.c
fix duplicated accelerators
[moira.git] / clients / mmoira / form_setup.c
CommitLineData
c4095074 1/* $Header$
2 */
3
4#include <stdio.h>
a1df2cb5 5#include <ctype.h>
3353249d 6#include <strings.h>
7#include <sys/types.h>
8#include <sys/stat.h>
c4095074 9#include <moira.h>
10#include <moira_site.h>
11#include <Xm/Xm.h>
12#include "mmoira.h"
13
14
15extern char *user, *program_name;
16extern EntryForm *MoiraForms[];
17EntryForm *GetAndClearForm();
18
19char *user_states[] = { "0 - Registerable",
20 "1 - Active",
21 "2 - Half Registered",
22 "3 - Deleted",
23 "4 - Not registerable",
24 "5 - Enrolled/Registerable",
25 "6 - Enrolled/Not Registerable",
26 "7 - Half Enrolled",
27 NULL};
28char *nfs_states[] = { "0 - Not Allocated",
29 "1 - Student",
30 "2 - Faculty",
31 "4 - Staff",
32 "8 - Miscellaneous",
33 NULL};
34
35
e9b00814 36static FixNameCase(form, field)
37EntryForm *form;
38int field;
39{
40 char fixname[128], buf[256];
41
42 strcpy(fixname, stringval(form, field));
43 FixCase(fixname);
44 sprintf(buf, "You entered a name which does not follow the capitalization conventions.\nCorrect it to \"%s\"?", fixname);
45 if (strcmp(fixname, stringval(form, field)) &&
46 AskQuestion(buf, "fixcase"))
47 StoreField(form, field, fixname);
48}
49
50
51get_members(argc, argv, sq)
52int argc;
53char **argv;
54struct save_queue *sq;
55{
56 char buf[256];
57
58 sprintf(buf, "%s (%s)", argv[0], argv[1]);
59 sq_save_data(sq, strsave(buf));
60 return(MR_CONT);
61}
62
63
a1df2cb5 64/* Deal with AFS cell names */
65
66char *canonicalize_cell(c)
67char *c;
68{
69 struct stat stbuf;
70 char path[512];
71 int count;
72
73 c = strtrim(c);
74 sprintf(path, "/afs/%s", c);
75 if (lstat(path, &stbuf) || !stbuf.st_mode&S_IFLNK)
76 return(c);
77 count = readlink(path, path, sizeof(path));
78 if (count < 1) return(c);
79 path[count] = 0;
80 free(c);
81 return(strsave(path));
82}
83
84
85int GetAliasValue(argc, argv, retval)
86int argc;
87char **argv;
88char **retval;
89{
90 *retval = strsave(argv[2]);
91 return(MR_CONT);
92}
93
94
68596e2b 95static int GetArgv(argc, argv, info)
96int argc;
97char **argv;
98char ***info;
99{
100 int i;
101 char *malloc();
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"))) {
5032f044 142 maybechange(f, FS_MACHINE, True);
143 maybechange(f, FS_PACK, True);
144 maybechange(f, FS_M_POINT, True);
145 maybechange(f, FS_ACCESS, True);
146 maybechange(f, FS_CREATE, 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"))) {
5032f044 151 maybechange(f, FS_MACHINE, False);
152 maybechange(f, FS_PACK, False);
153 maybechange(f, FS_M_POINT, False);
154 maybechange(f, FS_ACCESS, False);
155 maybechange(f, FS_CREATE, False);
5032f044 156 }
a1df2cb5 157 if (field == FS_NAME && !strcmp(stringval(f, FS_M_POINT), "/mit/")) {
158 sprintf(buf, "/mit/%s", stringval(f, FS_NAME));
159 StoreField(f, FS_M_POINT, buf);
160 }
161 if (field == FS_MACHINE && !strcmp(stringval(f, FS_TYPE), "AFS")) {
162 p = strsave(stringval(f, FS_MACHINE));
163 p = canonicalize_cell(p);
164 lowercase(p);
165 StoreField(f, FS_MACHINE, p);
166 free(p);
167 }
168 if (field == FS_MACHINE && (!strcmp(stringval(f, FS_TYPE), "NFS") ||
169 !strcmp(stringval(f, FS_TYPE), "RVD"))) {
170 StoreHost(f, FS_MACHINE, &p);
171 }
172 if (!strcmp(stringval(f, FS_TYPE), "AFS") &&
173 *stringval(f, FS_NAME) &&
174 *stringval(f, FS_MACHINE) &&
175 *stringval(f, FS_L_TYPE)) {
176 char *path;
177 int depth;
178
179 sprintf(buf, "%s:%s", stringval(f, FS_MACHINE),
180 stringval(f, FS_L_TYPE));
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) {
187 p = index(path, ':');
188 if (p) {
189 *p = 0;
190 depth = atoi(++p);
191 } else depth = 0;
192 sprintf(buf, "/afs/%s/%s", stringval(f, FS_MACHINE), path);
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",
202 stringval(f, FS_MACHINE), path);
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 {
225 p = strsave(stringval(f, FS_L_TYPE));
226 sprintf(buf, "/afs/%s/%s/%s", stringval(f, FS_MACHINE),
227 lowercase(p), stringval(f, FS_NAME));
228 free(p);
229 }
230 StoreField(f, FS_PACK, buf);
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]);
256 p = rindex(argv[1], '/');
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");
c4095074 442 StoreField(f, FS_M_POINT, "/mit/");
a1df2cb5 443 StoreField(f, FS_MACHINE, "athena.mit.edu");
c4095074 444 StoreField(f, FS_ACCESS, "w");
445 StoreField(f, FS_OWNER, user);
446 StoreField(f, FS_OWNERS, user);
447 boolval(f, FS_CREATE) = TRUE;
448 GetKeywords(f, FS_TYPE, "filesys");
e9b00814 449 GetKeywords(f, FS_ACCESS, "fs_access_AFS");
c4095074 450 GetKeywords(f, FS_L_TYPE, "lockertype");
5032f044 451 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
a1df2cb5 452 f->inputlines[FS_L_TYPE]->valuechanged = MoiraValueChanged;
453 f->inputlines[FS_NAME]->valuechanged = MoiraValueChanged;
454 f->inputlines[FS_MACHINE]->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;
637 return(*fp);
638}
639
640
641/* Store a string into a given field in a form. */
642
643StoreField(form, field, value)
644EntryForm *form;
645int field;
646char *value;
647{
648 strncpy(form->inputlines[field]->returnvalue.stringvalue,
649 value, MAXFIELDSIZE);
650}
651
652
892c98b2 653char *StringValue(form, field)
654EntryForm *form;
655int field;
656{
657 switch (form->inputlines[field]->type) {
658 case FT_STRING:
659 case FT_KEYWORD:
660 return(stringval(form, field));
661 case FT_BOOLEAN:
662 return(boolval(form, field) ? "1" : "0");
663 }
664}
665
666
7df88a65 667StoreHost(form, field, dest)
668EntryForm *form;
669int field;
670char **dest;
671{
672 char *s;
673
e9b00814 674 s = strsave(stringval(form, field));
7df88a65 675 s = canonicalize_hostname(s);
e9b00814 676 StoreField(form, field, s);
677 form->inputlines[field]->changed = True;
678 UpdateForm(form);
7df88a65 679 free(s);
e9b00814 680 *dest = stringval(form, field);
7df88a65 681}
682
683
c4095074 684/* Helper routine for GetKeywords() */
685
686static get_alias(argc, argv, sq)
687int argc;
688char **argv;
689struct save_queue *sq;
690{
691 sq_save_data(sq, strsave(argv[2]));
692#ifdef DEBUG
693 printf("found keyword %s\n", argv[2]);
694#endif
695 return(MR_CONT);
696}
697
698static get_sloc(argc, argv, sq)
699int argc;
700char **argv;
701struct save_queue *sq;
702{
703 sq_save_data(sq, strsave(argv[1]));
704#ifdef DEBUG
705 printf("found sloc %s\n", argv[1]);
706#endif
707 return(MR_CONT);
708}
709
710
711/* Retrieve possible keyword values from Moira and store them in the specified
712 * field of the form. Returns 0 if successful, -1 if not.
713 */
714
5032f044 715static struct save_queue *cache = NULL;
716struct cache_elem { char *name; char **values; };
717
c4095074 718int GetKeywords(form, field, name)
719EntryForm *form;
720int field;
721char *name;
722{
c4095074 723 struct save_queue *sq, *s;
5032f044 724 struct cache_elem *ce;
c4095074 725 int i, size, stat;
726 char *argv[4];
727
728 /* init cache */
729 if (cache == NULL)
730 cache = sq_create();
731 cache->q_lastget = NULL;
732
e9b00814 733 if (!strcmp(name, "fsgroup")) {
734 form->inputlines[field]->keywords = NULL;
735 }
736
c4095074 737 /* look through cache */
738 while (sq_get_data(cache, &ce))
739 if (!strcmp(ce->name, name)) {
740 form->inputlines[field]->keywords = ce->values;
741 return(0);
742 }
743
744 /* not in cache, do query */
745 sq = sq_create();
746 if (!strcmp(name, "poserver")) {
747 argv[0] = "POP";
748 stat = MoiraQuery("get_server_locations", 1, argv, get_sloc,
749 (char *)sq);
750 if (stat) {
751 com_err(program_name, stat, "retrieving service locations");
752 return(-1);
753 }
754 } else {
755 argv[0] = name;
756 argv[1] = "TYPE";
757 argv[2] = "*";
758 stat = MoiraQuery("get_alias", 3, argv, get_alias, (char *)sq);
759 if (stat) {
760 com_err(program_name, stat, "retrieving keyword values");
761 return(-1);
762 }
763 }
764
765 size = 1;
766 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
767 size++;
768#ifdef DEBUG
769 printf("Found %d keywords of type %s\n", size, name);
770#endif
771
772 /* transform query data into proper malloc'ed structure */
773 ce = (struct cache_elem *) malloc(sizeof(struct cache_elem));
774 if (ce == NULL) {
775 display_error("Out of memory while fetching keywords");
776 return(-1);
777 }
778 ce->name = name;
779 ce->values = (char **) malloc(sizeof(char *) * (size + 1));
780 if (ce->values == NULL) {
781 display_error("Out of memory while fetching keywords");
782 return(-1);
783 }
784 for (i = 0; i < size; i++)
785 sq_get_data(sq, &(ce->values[i]));
786 ce->values[i] = NULL;
787 sq_destroy(sq);
788
789 /* put it in the cache */
790 sq_save_data(cache, ce);
791
792 /* and return answer */
793 form->inputlines[field]->keywords = ce->values;
794 return(0);
795}
5032f044 796
797CacheNewValue(form, field, name, value)
798EntryForm *form;
799int field;
800char *name;
801char *value;
802{
803 struct save_queue *sq;
804 struct cache_elem *ce;
e9b00814 805 int size;
5032f044 806
e9b00814 807 /* init cache */
808 if (cache == NULL)
809 cache = sq_create();
5032f044 810 cache->q_lastget = NULL;
811
812 /* find entry in cache */
813 while (sq_get_data(cache, &ce))
814 if (!strcmp(ce->name, name))
815 break;
816
817 /* get its size */
818 for (size = 0; ce->values[size]; size++);
819
820 /* add new keyword */
821 ce->values = (char **)realloc(ce->values, sizeof(char *) * (size + 2));
822 ce->values[size] = strsave(value);
823 ce->values[size + 1] = NULL;
824
825#ifdef DEBUG
826 printf("CacheNewValue(%x, %d, %s, %s)\n", form, field, name, value);
827 printf(" form is %x (%s)\n", form, form->formname);
828 printf(" field is %d (%s)\n", field, form->inputlines[field]->prompt);
829 printf(" keywords: ");
830 for (size = 0; ce->values[size]; size++) printf("%s ", ce->values[size]);
831 printf("\n");
832#endif /* DEBUG */
833
834 /* new update form */
835 form->inputlines[field]->keywords = ce->values;
ca5beb9a 836 if (!tty) RemakeRadioField(form, field);
5032f044 837}
This page took 0.211337 seconds and 5 git commands to generate.