Annotation of dgamelaunch-openbsd/config.y, Revision 1.1.1.1
1.1 rubenllo 1: %{
2:
3: #define YYSTACK_USE_ALLOCA 0
4:
5: #include <sys/types.h>
6:
7: #include <grp.h>
8: #include <pwd.h>
9: #include <stdlib.h>
10: #include <stdio.h>
11: #include <string.h>
12:
13: #include "dgamelaunch.h"
14: #include "ttyrec.h"
15:
16: extern int yylex(void);
17: extern void yyerror(const char*);
18: extern char *yytext;
19: extern unsigned int line, col;
20:
21: extern int num_games;
22: int ncnf = 0;
23: struct dg_cmdpart *curr_cmdqueue = NULL;
24: struct dg_menu *curr_menu = NULL;
25:
26: static struct dg_watchcols *curr_watch_columns[DGL_MAXWATCHCOLS];
27: static int curr_n_watch_columns = 0;
28:
29: int cmdqueue_num = -1;
30:
31: static const char* lookup_token (int t);
32:
33: static int sortmode_number(const char *sortmode_name) {
34: int tmpi;
35: if (!*sortmode_name)
36: return SORTMODE_NONE;
37: for (tmpi = SORTMODE_NONE; tmpi < NUM_SORTMODES; tmpi++)
38: if (!strcasecmp(SORTMODE_NAME[tmpi], sortmode_name ))
39: return tmpi;
40: return -1;
41: }
42:
43:
44: %}
45:
46: %union {
47: char* s;
48: int kt;
49: unsigned long i;
50: }
51:
52: %token TYPE_SUSER TYPE_SGROUP TYPE_SGID TYPE_SUID TYPE_MAX TYPE_MAXNICKLEN
53: %token TYPE_GAME_SHORT_NAME TYPE_WATCH_SORTMODE TYPE_BANNERVARS
54: %token TYPE_ALLOW_REGISTRATION TYPE_WATCH_COLUMNS TYPE_GAME_ID
55: %token TYPE_PATH_GAME TYPE_NAME_GAME TYPE_PATH_DGLDIR TYPE_PATH_SPOOL
56: %token TYPE_PATH_BANNER TYPE_PATH_CANNED TYPE_PATH_CHROOT
57: %token TYPE_PATH_PASSWD TYPE_PATH_LOCKFILE TYPE_PATH_TTYREC
58: %token TYPE_MALSTRING TYPE_PATH_INPROGRESS TYPE_GAME_ARGS TYPE_RC_FMT
59: %token TYPE_CMDQUEUE TYPE_DEFINE_MENU TYPE_BANNER_FILE TYPE_CURSOR
60: %token TYPE_POSTCMDQUEUE TYPE_TIMEFORMAT
61: %token TYPE_MAX_IDLE_TIME TYPE_MENU_MAX_IDLE_TIME TYPE_EXTRA_INFO_FILE
62: %token TYPE_ENCODING TYPE_LOCALE TYPE_UTF8ESC TYPE_FILEMODE TYPE_DEFTERM
63: %token TYPE_FLOWCTRL
64: %token <s> TYPE_VALUE
65: %token <i> TYPE_NUMBER TYPE_CMDQUEUENAME
66: %type <kt> KeyType
67: %token <i> TYPE_DGLCMD0 TYPE_DGLCMD1 TYPE_DGLCMD2
68: %token TYPE_DEFINE_GAME
69: %token <i> TYPE_BOOL
70:
71: %%
72:
73: Configuration: KeyPairs
74: | { if (!silent) fprintf(stderr, "%s: no settings, proceeding with defaults\n", config); }
75: ;
76:
77: KeyPairs: KeyPairs KeyPair
78: | KeyPair
79: ;
80:
81: KeyPair: TYPE_CMDQUEUE '[' TYPE_CMDQUEUENAME ']'
82: {
83: int qnum = $<i>3;
84:
85: if (globalconfig.cmdqueue[qnum]) {
86: fprintf(stderr, "%s:%d: command queue defined twice, bailing out\n",
87: config, line);
88: exit(1);
89: }
90: cmdqueue_num = qnum;
91: }
92: '=' cmdlist
93: {
94: /*
95: struct dg_cmdpart *tmp = curr_cmdqueue;
96: while (tmp) {
97: fprintf(stderr, "cmd=%i, p1=%s, p2=%s\n", tmp->cmd, tmp->param1, tmp->param2);
98: tmp = tmp->next;
99: }
100: */
101: globalconfig.cmdqueue[cmdqueue_num] = curr_cmdqueue;
102: curr_cmdqueue = NULL;
103: }
104: | definemenu
105: {
106: /* nothing */
107: }
108: | definegame
109: {
110: /* nothing */
111: }
112: | KeyType '=' TYPE_VALUE {
113: struct group* gr;
114: struct passwd* usr;
115:
116: switch ($1)
117: {
118: case TYPE_SGROUP:
119: if (globalconfig.shed_gid != (gid_t)-1)
120: break;
121:
122: globalconfig.shed_group = strdup($3);
123: if ((gr = getgrnam($3)) != NULL)
124: {
125: globalconfig.shed_gid = gr->gr_gid;
126: if (!silent)
127: fprintf(stderr, "%s:%d: suggest replacing 'shed_group = \"%s\"' line with 'shed_gid = %d'\n",
128: config, line, $3, gr->gr_gid);
129: }
130: else
131: {
132: if (!silent)
133: fprintf(stderr, "%s:%d: no such group '%s'\n", config, line, $3);
134: }
135:
136: break;
137: case TYPE_SUSER:
138: if (globalconfig.shed_uid != (uid_t)-1)
139: break;
140:
141: if (!strcmp($3, "root"))
142: {
143: fprintf(stderr, "%s:%d: I refuse to run as root! Aborting.\n", config, line);
144: graceful_exit(8);
145: }
146: globalconfig.shed_user = strdup($3);
147: if ((usr = getpwnam($3)) != NULL)
148: {
149: if (usr->pw_uid != 0)
150: {
151: globalconfig.shed_uid = usr->pw_uid;
152: if (!silent)
153: fprintf(stderr, "%s:%d: suggest replacing 'shed_user = \"%s\"' line with 'shed_uid = %d'\n",
154: config, line, $3, usr->pw_uid);
155: }
156: else
157: {
158: fprintf(stderr, "%s:%d: I refuse to run as %s (uid 0!) Aborting.\n", config, line, $3);
159: graceful_exit(9);
160: }
161: }
162: else
163: {
164: if (!silent)
165: fprintf(stderr, "%s:%d: no such user '%s'\n", config, line, $3);
166: }
167: break;
168:
169: case TYPE_PATH_CHROOT:
170: if (globalconfig.chroot) free(globalconfig.chroot);
171: globalconfig.chroot = strdup ($3);
172: break;
173:
174: case TYPE_WATCH_SORTMODE:
175: {
176: const int sortmode_num = sortmode_number($3);
177: if (sortmode_num <= SORTMODE_NONE)
178: fprintf(stderr, "%s:%d: unknown sortmode '%s'\n", config,
179: line, $3);
180: else
181: globalconfig.sortmode = sortmode_num;
182: }
183: break;
184:
185: case TYPE_PATH_DGLDIR:
186: if (globalconfig.dglroot) free(globalconfig.dglroot);
187: globalconfig.dglroot = strdup($3);
188: break;
189:
190: case TYPE_PATH_BANNER:
191: if (globalconfig.banner) free(globalconfig.banner);
192: globalconfig.banner = strdup($3);
193: break;
194:
195: case TYPE_PATH_LOCKFILE:
196: if (globalconfig.lockfile) free (globalconfig.lockfile);
197: globalconfig.lockfile = strdup($3);
198: break;
199:
200: case TYPE_PATH_PASSWD:
201: if (globalconfig.passwd) free(globalconfig.passwd);
202: globalconfig.passwd = strdup($3);
203: break;
204:
205: case TYPE_LOCALE:
206: if (globalconfig.locale) free(globalconfig.locale);
207: globalconfig.locale = strdup($3);
208: break;
209:
210: case TYPE_DEFTERM:
211: if (globalconfig.defterm) free(globalconfig.defterm);
212: globalconfig.defterm = strdup($3);
213: break;
214:
215: case TYPE_FILEMODE:
216: default_fmode = strtoul($3, NULL, 8);
217: break;
218:
219: default:
220: fprintf(stderr, "%s:%d: token %s does not take a string, bailing out\n",
221: config, line, lookup_token($1));
222: exit(1);
223:
224: }
225:
226: free($3);
227: }
228: | KeyType '=' TYPE_MALSTRING {}
229: | KeyType '=' TYPE_BOOL {
230: switch ($1) {
231: case TYPE_ALLOW_REGISTRATION:
232: globalconfig.allow_registration = $<i>3;
233: break;
234: case TYPE_UTF8ESC:
235: globalconfig.utf8esc = $<i>3;
236: break;
237: case TYPE_FLOWCTRL:
238: globalconfig.flowctrl = $<i>3;
239: break;
240: default:
241: fprintf(stderr, "%s:%d: token %s does not take a boolean, bailing out\n",
242: config, line, lookup_token($1));
243: exit(1);
244: }
245: }
246: | KeyType '=' TYPE_NUMBER {
247:
248: switch ($1)
249: {
250: case TYPE_SUID:
251: if (!silent && globalconfig.shed_uid != (uid_t)-1 && globalconfig.shed_uid != $3)
252: fprintf(stderr, "%s:%d: 'shed_uid = %lu' entry overrides old setting %d\n",
253: config, line, $3, globalconfig.shed_uid);
254:
255: /* Naive user protection - do not allow running as user root */
256: if ($3 == 0)
257: {
258: fprintf(stderr, "%s:%d: I refuse to run as uid 0 (root)! Aborting.\n", config, line);
259: graceful_exit(11);
260: }
261:
262: globalconfig.shed_uid = $3;
263: break;
264:
265: case TYPE_SGID:
266: if (!silent && globalconfig.shed_gid != (gid_t)-1 && globalconfig.shed_gid != $3)
267: fprintf(stderr, "%s:%d: 'shed_gid = %lu' entry overrides old setting %d\n",
268: config, line, $3, globalconfig.shed_gid);
269:
270: globalconfig.shed_gid = $3;
271: break;
272:
273: case TYPE_MAX:
274: globalconfig.max = $3;
275: break;
276:
277: case TYPE_MAXNICKLEN:
278: globalconfig.max_newnick_len = $3;
279: if (globalconfig.max_newnick_len > DGL_PLAYERNAMELEN) {
280: fprintf(stderr, "%s:%d: max_newnick_len > DGL_PLAYERNAMELEN\n", config, line);
281: globalconfig.max_newnick_len = DGL_PLAYERNAMELEN;
282: }
283: break;
284:
285: case TYPE_MENU_MAX_IDLE_TIME:
286: globalconfig.menu_max_idle_time = $3;
287: break;
288:
289: default:
290: fprintf(stderr, "%s:%d: token %s does not take a number, bailing out\n",
291: config, line, lookup_token($1));
292: exit(1);
293: }
294: }
295: | TYPE_BANNERVARS '=' '[' banner_vars ']'
296: {
297: }
298: | TYPE_WATCH_COLUMNS '=' '[' watch_columns ']' {
299: memcpy(globalconfig.watch_columns,
300: curr_watch_columns,
301: curr_n_watch_columns * sizeof(*curr_watch_columns));
302: globalconfig.n_watch_columns = curr_n_watch_columns;
303: memset(curr_watch_columns, 0, sizeof curr_watch_columns);
304: curr_n_watch_columns = 0;
305: };
306:
307:
308: banner_vars : banner_vars ',' banner_var
309: | banner_var;
310:
311: banner_var : TYPE_VALUE '=' TYPE_VALUE
312: {
313: banner_var_add($1, $3, 0);
314: }
315: | TYPE_VALUE '=' TYPE_TIMEFORMAT '(' TYPE_VALUE ')'
316: {
317: banner_var_add($1, $5, 1);
318: };
319:
320: watch_columns: watch_columns ',' watch_column
321: | watch_column;
322:
323: watch_column: '[' TYPE_VALUE ',' TYPE_VALUE ',' TYPE_NUMBER ',' TYPE_VALUE ']' {
324: if (curr_n_watch_columns >= DGL_MAXWATCHCOLS) {
325: fprintf(stderr, "%s:%d too many watch column defs (max %d)\n",
326: config, line, DGL_MAXWATCHCOLS);
327: exit(1);
328: }
329:
330: {
331: struct dg_watchcols watch_column, *new_watch_column = NULL;
332: watch_column.sortmode = sortmode_number($4);
333: if (watch_column.sortmode == -1) {
334: fprintf(stderr, "%s:%d invalid sort mode '%s'.\n",
335: config, line, $4);
336: exit(1);
337: }
338: watch_column.dat = watch_column.sortmode;
339: watch_column.x = $6;
340: watch_column.colname = strdup($2);
341: watch_column.fmt = strdup($8);
342:
343: new_watch_column = (struct dg_watchcols *) malloc(sizeof watch_column);
344: memcpy(new_watch_column, &watch_column, sizeof watch_column);
345:
346: curr_watch_columns[curr_n_watch_columns++] = new_watch_column;
347: }
348: };
349:
350: menu_definition : TYPE_BANNER_FILE '=' TYPE_VALUE
351: {
352: if (curr_menu->banner_fn) {
353: fprintf(stderr, "%s:%d: banner file already defined.\n", config, line);
354: exit(1);
355: }
356: curr_menu->banner_fn = strdup( $3 );
357: }
358: | TYPE_CURSOR '=' '(' TYPE_NUMBER ',' TYPE_NUMBER ')'
359: {
360: if (curr_menu->cursor_x != -1) {
361: fprintf(stderr, "%s:%d: cursor position already defined.\n", config, line);
362: exit(1);
363: }
364: curr_menu->cursor_x = $4;
365: curr_menu->cursor_y = $6;
366: }
367: | TYPE_CMDQUEUE '[' TYPE_VALUE ']'
368: {
369: struct dg_menuoption *tmp;
370: struct dg_menuoption *tmpmenuopt;
371: if (curr_cmdqueue) {
372: fprintf(stderr, "%s:%d: command queue already in use?\n", config, line);
373: exit(1);
374: }
375: tmp = malloc(sizeof(struct dg_menuoption));
376: tmp->keys = strdup( $3 );
377: tmp->cmdqueue = NULL;
378: tmp->next = curr_menu->options;
379: curr_menu->options = tmp;
380: }
381: '=' cmdlist
382: {
383: curr_menu->options->cmdqueue = curr_cmdqueue;
384: curr_cmdqueue = NULL;
385: }
386: ;
387:
388:
389: menu_definitions : menu_definition
390: | menu_definition menu_definitions
391: ;
392:
393:
394: definemenu : TYPE_DEFINE_MENU '[' TYPE_VALUE ']'
395: {
396: struct dg_menulist *tmp_menulist = globalconfig.menulist;
397:
398: while (tmp_menulist) {
399: if (!strcmp(tmp_menulist->menuname, $<s>3 )) {
400: fprintf(stderr, "%s:%d: menu \"%s\" already defined.\n", config, line, $<s>3 );
401: exit(1);
402: }
403: tmp_menulist = tmp_menulist->next;
404: }
405:
406: tmp_menulist = malloc(sizeof(struct dg_menulist));
407: tmp_menulist->menuname = strdup( $<s>3 );
408: tmp_menulist->next = globalconfig.menulist;
409:
410: globalconfig.menulist = tmp_menulist;
411:
412: tmp_menulist->menu = malloc(sizeof(struct dg_menu));
413: curr_menu = tmp_menulist->menu;
414:
415: curr_menu->options = NULL;
416: curr_menu->cursor_x = curr_menu->cursor_y = -1;
417: curr_menu->banner_fn = NULL;
418: }
419: '{' menu_definitions '}'
420: {
421: curr_menu = NULL;
422: }
423: ;
424:
425:
426:
427: game_definition : TYPE_CMDQUEUE
428: {
429: if (myconfig[ncnf]->cmdqueue) {
430: fprintf(stderr, "%s:%d: command queue defined twice, bailing out\n",
431: config, line);
432: exit(1);
433: }
434: }
435: '=' cmdlist
436: {
437: myconfig[ncnf]->cmdqueue = curr_cmdqueue;
438: curr_cmdqueue = NULL;
439: }
440: | TYPE_POSTCMDQUEUE
441: {
442: if (myconfig[ncnf]->postcmdqueue) {
443: fprintf(stderr, "%s:%d: postcommand queue defined twice, bailing out\n",
444: config, line);
445: exit(1);
446: }
447: }
448: '=' cmdlist
449: {
450: myconfig[ncnf]->postcmdqueue = curr_cmdqueue;
451: curr_cmdqueue = NULL;
452: }
453:
454: | TYPE_GAME_ARGS '=' game_args_list
455: {
456: /* nothing */
457: }
458: | TYPE_EXTRA_INFO_FILE '=' TYPE_VALUE
459: {
460: myconfig[ncnf]->extra_info_file = strdup($3);
461: }
462: | TYPE_MAX_IDLE_TIME '=' TYPE_NUMBER
463: {
464: myconfig[ncnf]->max_idle_time = $3;
465: }
466: | KeyType '=' TYPE_VALUE
467: {
468: switch ( $1 ) {
469: case TYPE_PATH_CANNED:
470: if (myconfig[ncnf]->rcfile) free(myconfig[ncnf]->rcfile);
471: myconfig[ncnf]->rcfile = strdup($3);
472: break;
473:
474: case TYPE_PATH_SPOOL:
475: if (myconfig[ncnf]->spool) free (myconfig[ncnf]->spool);
476: myconfig[ncnf]->spool = strdup($3);
477: break;
478:
479: case TYPE_PATH_TTYREC:
480: if (myconfig[ncnf]->ttyrecdir) free(myconfig[ncnf]->ttyrecdir);
481: myconfig[ncnf]->ttyrecdir = strdup($3);
482: break;
483:
484: case TYPE_PATH_GAME:
485: if (myconfig[ncnf]->game_path) free(myconfig[ncnf]->game_path);
486: myconfig[ncnf]->game_path = strdup ($3);
487: break;
488:
489: case TYPE_NAME_GAME:
490: if (myconfig[ncnf]->game_name) free (myconfig[ncnf]->game_name);
491: myconfig[ncnf]->game_name = strdup($3);
492: break;
493:
494: case TYPE_GAME_SHORT_NAME:
495: if (myconfig[ncnf]->shortname) free (myconfig[ncnf]->shortname);
496: myconfig[ncnf]->shortname = strdup($3);
497: break;
498:
499: case TYPE_GAME_ID:
500: if (myconfig[ncnf]->game_id) free (myconfig[ncnf]->game_id);
501: myconfig[ncnf]->game_id = strdup($3);
502: break;
503:
504: case TYPE_RC_FMT:
505: if (myconfig[ncnf]->rc_fmt) free(myconfig[ncnf]->rc_fmt);
506: myconfig[ncnf]->rc_fmt = strdup($3);
507: break;
508:
509: case TYPE_PATH_INPROGRESS:
510: if (myconfig[ncnf]->inprogressdir) free(myconfig[ncnf]->inprogressdir);
511: myconfig[ncnf]->inprogressdir = strdup($3);
512: break;
513:
514: case TYPE_ENCODING:
515: if (!strcasecmp($3, "ask"))
516: myconfig[ncnf]->encoding = -1;
517: else if ((myconfig[ncnf]->encoding = encoding_by_name($3)) == -1)
518: {
519: fprintf(stderr, "%s:%d: invalid value for encoding: \"%s\"\n",
520: config, line, $3);
521: exit(1);
522: }
523: break;
524:
525: default:
526: fprintf(stderr, "%s:%d: token does not belong into game definition, bailing out\n",
527: config, line);
528: exit(1);
529: }
530: }
531: ;
532:
533: game_arg : TYPE_VALUE
534: {
535: char **tmpargs;
536: if (myconfig[ncnf]->bin_args) {
537: myconfig[ncnf]->num_args++;
538: tmpargs = calloc((myconfig[ncnf]->num_args+1), sizeof(char *));
539: memcpy(tmpargs, myconfig[ncnf]->bin_args, (myconfig[ncnf]->num_args * sizeof(char *)));
540: free(myconfig[ncnf]->bin_args);
541: myconfig[ncnf]->bin_args = tmpargs;
542: } else {
543: myconfig[ncnf]->num_args = 1;
544: myconfig[ncnf]->bin_args = calloc(2, sizeof(char *));
545: }
546: myconfig[ncnf]->bin_args[(myconfig[ncnf]->num_args)-1] = strdup($1);
547: myconfig[ncnf]->bin_args[(myconfig[ncnf]->num_args)] = 0;
548: }
549: ;
550:
551: game_args_list : game_arg
552: | game_arg ',' game_args_list
553: ;
554:
555: game_definitions : game_definition
556: | game_definition game_definitions
557: ;
558:
559: definegame : TYPE_DEFINE_GAME '{'
560: {
561: struct dg_config **tmpconfig = NULL;
562:
563: tmpconfig = calloc(ncnf + 1, sizeof(myconfig[0]));
564: if (!tmpconfig) {
565: fprintf(stderr, "%s:%d: could not allocate memory for config, bailing out\n",
566: config, line);
567: exit(1);
568: }
569:
570: if (myconfig) {
571: int tmp;
572: for (tmp = 0; tmp < ncnf; tmp++) {
573: tmpconfig[tmp] = myconfig[tmp];
574: }
575: free(myconfig);
576: }
577:
578: tmpconfig[ncnf] = calloc(1, sizeof(struct dg_config));
579: myconfig = tmpconfig;
580: }
581: game_definitions '}'
582: {
583: if (myconfig[ncnf]->game_id == NULL && myconfig[ncnf]->shortname)
584: myconfig[ncnf]->game_id = strdup(myconfig[ncnf]->shortname);
585: ncnf++;
586: num_games = ncnf;
587: }
588: ;
589:
590: cmdlist : cmdlist ',' dglcmd
591: | dglcmd
592: ;
593:
594: dglcmd : TYPE_DGLCMD1 TYPE_VALUE
595: {
596: struct dg_cmdpart *tmp = malloc(sizeof(struct dg_cmdpart));
597: if (tmp) {
598: struct dg_cmdpart *foo = curr_cmdqueue;
599: if (foo) {
600: while (foo->next) foo = foo->next;
601: foo->next = tmp;
602: } else curr_cmdqueue = tmp;
603: tmp->next = NULL;
604: tmp->param1 = strdup( $2 );
605: tmp->param2 = NULL;
606: tmp->cmd = $<i>1;
607:
608: }
609: }
610: | TYPE_DGLCMD0
611: {
612: struct dg_cmdpart *tmp = malloc(sizeof(struct dg_cmdpart));
613: if (tmp) {
614: struct dg_cmdpart *foo = curr_cmdqueue;
615: if (foo) {
616: while (foo->next) foo = foo->next;
617: foo->next = tmp;
618: } else curr_cmdqueue = tmp;
619: tmp->next = NULL;
620: tmp->param1 = NULL;
621: tmp->param2 = NULL;
622: tmp->cmd = $<i>1;
623: }
624: }
625: | TYPE_DGLCMD2 TYPE_VALUE TYPE_VALUE
626: {
627: struct dg_cmdpart *tmp = malloc(sizeof(struct dg_cmdpart));
628: if (tmp) {
629: struct dg_cmdpart *foo = curr_cmdqueue;
630: if (foo) {
631: while (foo->next) foo = foo->next;
632: foo->next = tmp;
633: } else curr_cmdqueue = tmp;
634: tmp->next = NULL;
635: tmp->param1 = strdup( $2 );
636: tmp->param2 = strdup( $3 );
637: tmp->cmd = $<i>1;
638: }
639: }
640: ;
641:
642: KeyType : TYPE_SUSER { $$ = TYPE_SUSER; }
643: | TYPE_SGROUP { $$ = TYPE_SGROUP; }
644: | TYPE_SUID { $$ = TYPE_SUID; }
645: | TYPE_SGID { $$ = TYPE_SGID; }
646: | TYPE_MAX { $$ = TYPE_MAX; }
647: | TYPE_MAXNICKLEN { $$ = TYPE_MAXNICKLEN; }
648: | TYPE_MENU_MAX_IDLE_TIME { $$ = TYPE_MENU_MAX_IDLE_TIME; }
649: | TYPE_PATH_CHROOT { $$ = TYPE_PATH_CHROOT; }
650: | TYPE_ALLOW_REGISTRATION { $$ = TYPE_ALLOW_REGISTRATION; }
651: | TYPE_PATH_GAME { $$ = TYPE_PATH_GAME; }
652: | TYPE_NAME_GAME { $$ = TYPE_NAME_GAME; }
653: | TYPE_GAME_SHORT_NAME { $$ = TYPE_GAME_SHORT_NAME; }
654: | TYPE_GAME_ID { $$ = TYPE_GAME_ID; }
655: | TYPE_PATH_DGLDIR { $$ = TYPE_PATH_DGLDIR; }
656: | TYPE_PATH_SPOOL { $$ = TYPE_PATH_SPOOL; }
657: | TYPE_PATH_BANNER { $$ = TYPE_PATH_BANNER; }
658: | TYPE_PATH_CANNED { $$ = TYPE_PATH_CANNED; }
659: | TYPE_PATH_TTYREC { $$ = TYPE_PATH_TTYREC; }
660: | TYPE_PATH_PASSWD { $$ = TYPE_PATH_PASSWD; }
661: | TYPE_PATH_LOCKFILE { $$ = TYPE_PATH_LOCKFILE; }
662: | TYPE_PATH_INPROGRESS { $$ = TYPE_PATH_INPROGRESS; }
663: | TYPE_ENCODING { $$ = TYPE_ENCODING; }
664: | TYPE_LOCALE { $$ = TYPE_LOCALE; }
665: | TYPE_DEFTERM { $$ = TYPE_DEFTERM; }
666: | TYPE_UTF8ESC { $$ = TYPE_UTF8ESC; }
667: | TYPE_FLOWCTRL { $$ = TYPE_FLOWCTRL; }
668: | TYPE_RC_FMT { $$ = TYPE_RC_FMT; }
669: | TYPE_WATCH_SORTMODE { $$ = TYPE_WATCH_SORTMODE; }
670: | TYPE_FILEMODE { $$ = TYPE_FILEMODE; }
671: ;
672:
673: %%
674:
675: const char* lookup_token (int t)
676: {
677: switch (t)
678: {
679: case TYPE_SUSER: return "shed_user";
680: case TYPE_SGROUP: return "shed_group";
681: case TYPE_SUID: return "shed_uid";
682: case TYPE_SGID: return "shed_gid";
683: case TYPE_MAX: return "maxusers";
684: case TYPE_MAXNICKLEN: return "maxnicklen";
685: case TYPE_MENU_MAX_IDLE_TIME: return "menu_max_idle_time";
686: case TYPE_PATH_CHROOT: return "chroot_path";
687: case TYPE_PATH_GAME: return "game_path";
688: case TYPE_NAME_GAME: return "game_name";
689: case TYPE_ALLOW_REGISTRATION: return "allow_new_nicks";
690: case TYPE_GAME_SHORT_NAME: return "short_name";
691: case TYPE_GAME_ID: return "game_id";
692: case TYPE_PATH_DGLDIR: return "dglroot";
693: case TYPE_PATH_SPOOL: return "spooldir";
694: case TYPE_PATH_BANNER: return "banner";
695: case TYPE_PATH_CANNED: return "rc_template";
696: case TYPE_PATH_TTYREC: return "ttyrecdir";
697: case TYPE_PATH_INPROGRESS: return "inprogressdir";
698: case TYPE_GAME_ARGS: return "game_args";
699: case TYPE_MAX_IDLE_TIME: return "max_idle_time";
700: case TYPE_RC_FMT: return "rc_fmt";
701: case TYPE_WATCH_SORTMODE: return "sortmode";
702: case TYPE_WATCH_COLUMNS: return "watch_columns";
703: case TYPE_BANNERVARS: return "bannervars";
704: case TYPE_LOCALE: return "locale";
705: case TYPE_DEFTERM: return "default_term";
706: case TYPE_UTF8ESC: return "utf8esc";
707: case TYPE_FLOWCTRL: return "flowcontrol";
708: case TYPE_FILEMODE: return "filemode";
709: default: abort();
710: }
711: }
712:
713: void yyerror(char const* s)
714: {
715: if (!silent)
716: fprintf(stderr, "%s:%d:%d: couldn't parse \"%s\": %s\n", config, line, col, yytext, s);
717: }
CVSweb