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