1#ifndef lint
2static const char yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93";
3#endif
4
5#include <stdlib.h>
6
7#define YYBYACC 1
8#define YYMAJOR 1
9#define YYMINOR 9
10#define YYPATCH 20050813
11
12#define YYEMPTY (-1)
13#define yyclearin    (yychar = YYEMPTY)
14#define yyerrok      (yyerrflag = 0)
15#define YYRECOVERING (yyerrflag != 0)
16
17extern int yyparse(void);
18
19static int yygrowstack(void);
20#define YYPREFIX "yy"
21#line 2 "parser.y"
22/*
23 *
24 *  BlueZ - Bluetooth protocol stack for Linux
25 *
26 *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org>
27 *
28 *
29 *  This program is free software; you can redistribute it and/or modify
30 *  it under the terms of the GNU General Public License as published by
31 *  the Free Software Foundation; either version 2 of the License, or
32 *  (at your option) any later version.
33 *
34 *  This program is distributed in the hope that it will be useful,
35 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
36 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37 *  GNU General Public License for more details.
38 *
39 *  You should have received a copy of the GNU General Public License
40 *  along with this program; if not, write to the Free Software
41 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
42 *
43 */
44
45#ifdef HAVE_CONFIG_H
46#include <config.h>
47#endif
48
49#include <stdio.h>
50#include <errno.h>
51#include <unistd.h>
52#include <stdlib.h>
53#include <string.h>
54#include <sys/param.h>
55#include <sys/socket.h>
56
57#include <bluetooth/bluetooth.h>
58#include <bluetooth/rfcomm.h>
59
60#include "kword.h"
61
62int yylex(void);
63int yyerror(char *s);
64
65struct rfcomm_opts *opts;
66
67#line 49 "parser.y"
68typedef union {
69	int number;
70	char *string;
71	bdaddr_t *bdaddr;
72} YYSTYPE;
73#line 74 "y.tab.c"
74#define K_BIND 257
75#define K_DEVICE 258
76#define K_CHANNEL 259
77#define K_COMMENT 260
78#define K_YES 261
79#define K_NO 262
80#define NUMBER 263
81#define RFCOMM 264
82#define STRING 265
83#define WORD 266
84#define BDADDR 267
85#define YYERRCODE 256
86short yylhs[] = {                                        -1,
87    0,    0,    0,    2,    2,    2,    2,    3,    5,    4,
88    4,    4,    6,    6,    6,    6,    6,    1,    1,
89};
90short yylen[] = {                                         2,
91    0,    1,    2,    4,    4,    1,    1,    1,    1,    2,
92    2,    3,    2,    2,    2,    2,    1,    1,    1,
93};
94short yydefred[] = {                                      0,
95    7,    9,    0,    0,    2,    0,    0,    3,    0,    0,
96    0,    0,    0,    0,    0,   17,    0,    0,    0,   11,
97   18,   19,   13,   14,   15,   16,    4,    0,   10,    5,
98   12,
99};
100short yydgoto[] = {                                       4,
101   23,    5,    6,   17,    7,   18,
102};
103short yysindex[] = {                                   -254,
104    0,    0,    0, -254,    0, -120, -109,    0, -251, -251,
105  -41, -245, -248, -243, -244,    0, -125,  -37, -121,    0,
106    0,    0,    0,    0,    0,    0,    0,  -36,    0,    0,
107    0,
108};
109short yyrindex[] = {                                     24,
110    0,    0,    1,    0,    0,    0,    0,    0,    0,    0,
111    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
112    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
113    0,
114};
115short yygindex[] = {                                      0,
116    0,   21,    0,   16,    0,   -6,
117};
118#define YYTABLESIZE 267
119short yytable[] = {                                      27,
120    6,    1,    9,   30,   11,   12,   13,   14,   15,    2,
121   28,    3,   28,   10,   16,   21,   22,   20,   24,   25,
122   26,   29,   31,    1,    8,   19,    0,    0,    0,    0,
123    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
124    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
125    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
126    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
127    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
128    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
129    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
130    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
131    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
132    0,    0,    0,    8,    0,    0,    0,    0,    0,    0,
133    0,   12,   13,   14,   15,   12,   13,   14,   15,    0,
134   16,    0,    0,    0,   16,    0,    0,    0,    0,    0,
135    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
136    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
137    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
138    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
139    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
140    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
141    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
142    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
143    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
144    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
145    0,    0,    0,    0,    0,    0,    6,    0,    0,    0,
146    0,    0,    0,    0,    6,    0,    6,
147};
148short yycheck[] = {                                     125,
149    0,  256,  123,  125,  256,  257,  258,  259,  260,  264,
150   17,  266,   19,  123,  266,  261,  262,   59,  267,  263,
151  265,   59,   59,    0,    4,   10,   -1,   -1,   -1,   -1,
152   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
153   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
154   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
155   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
156   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
157   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
158   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
159   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
160   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
161   -1,   -1,   -1,  123,   -1,   -1,   -1,   -1,   -1,   -1,
162   -1,  257,  258,  259,  260,  257,  258,  259,  260,   -1,
163  266,   -1,   -1,   -1,  266,   -1,   -1,   -1,   -1,   -1,
164   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
165   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
166   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
167   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
168   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
169   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
170   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
171   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
172   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
173   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
174   -1,   -1,   -1,   -1,   -1,   -1,  256,   -1,   -1,   -1,
175   -1,   -1,   -1,   -1,  264,   -1,  266,
176};
177#define YYFINAL 4
178#ifndef YYDEBUG
179#define YYDEBUG 0
180#endif
181#define YYMAXTOKEN 267
182#if YYDEBUG
183char *yyname[] = {
184"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1850,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0,0,0,0,0,0,0,0,0,0,0,0,
1860,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1870,0,0,0,0,0,0,0,0,0,0,"'{'",0,"'}'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1880,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1890,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"K_BIND","K_DEVICE",
191"K_CHANNEL","K_COMMENT","K_YES","K_NO","NUMBER","RFCOMM","STRING","WORD",
192"BDADDR",
193};
194char *yyrule[] = {
195"$accept : config",
196"config :",
197"config : statement",
198"config : config statement",
199"statement : section '{' rfcomm_options '}'",
200"statement : rfcomm '{' rfcomm_options '}'",
201"statement : WORD",
202"statement : error",
203"section : WORD",
204"rfcomm : RFCOMM",
205"rfcomm_options : rfcomm_option ';'",
206"rfcomm_options : error ';'",
207"rfcomm_options : rfcomm_options rfcomm_option ';'",
208"rfcomm_option : K_BIND bool",
209"rfcomm_option : K_DEVICE BDADDR",
210"rfcomm_option : K_CHANNEL NUMBER",
211"rfcomm_option : K_COMMENT STRING",
212"rfcomm_option : WORD",
213"bool : K_YES",
214"bool : K_NO",
215};
216#endif
217#if YYDEBUG
218#include <stdio.h>
219#endif
220
221/* define the initial stack-sizes */
222#ifdef YYSTACKSIZE
223#undef YYMAXDEPTH
224#define YYMAXDEPTH  YYSTACKSIZE
225#else
226#ifdef YYMAXDEPTH
227#define YYSTACKSIZE YYMAXDEPTH
228#else
229#define YYSTACKSIZE 500
230#define YYMAXDEPTH  500
231#endif
232#endif
233
234#define YYINITSTACKSIZE 500
235
236int      yydebug;
237int      yynerrs;
238int      yyerrflag;
239int      yychar;
240short   *yyssp;
241YYSTYPE *yyvsp;
242YYSTYPE  yyval;
243YYSTYPE  yylval;
244
245/* variables for the parser stack */
246static short   *yyss;
247static short   *yysslim;
248static YYSTYPE *yyvs;
249static int      yystacksize;
250#line 134 "parser.y"
251
252int yyerror(char *s)
253{
254	fprintf(stderr, "%s line %d\n", s, lineno);
255	return 0;
256}
257
258int rfcomm_read_config(char *filename)
259{
260	extern FILE *yyin;
261	char file[MAXPATHLEN + 1];
262	int i;
263
264	for (i = 0; i < RFCOMM_MAX_DEV; i++) {
265		rfcomm_opts[i].bind = 0;
266		bacpy(&rfcomm_opts[i].bdaddr, BDADDR_ANY);
267		rfcomm_opts[i].channel = 1;
268	}
269
270	if (filename) {
271		snprintf(file, MAXPATHLEN,  "%s", filename);
272	} else {
273		snprintf(file, MAXPATHLEN, "%s/.bluetooth/rfcomm.conf", getenv("HOME"));
274
275		if ((getuid() == 0) || (access(file, R_OK) < 0))
276			snprintf(file, MAXPATHLEN, "%s/rfcomm.conf", CONFIGDIR);
277	}
278
279	if (!(yyin = fopen(file, "r")))
280		return -1;
281
282	lineno = 1;
283	yyparse();
284
285	fclose(yyin);
286
287	return 0;
288}
289#line 290 "y.tab.c"
290/* allocate initial stack or double stack size, up to YYMAXDEPTH */
291static int yygrowstack(void)
292{
293    int newsize, i;
294    short *newss;
295    YYSTYPE *newvs;
296
297    if ((newsize = yystacksize) == 0)
298        newsize = YYINITSTACKSIZE;
299    else if (newsize >= YYMAXDEPTH)
300        return -1;
301    else if ((newsize *= 2) > YYMAXDEPTH)
302        newsize = YYMAXDEPTH;
303
304    i = yyssp - yyss;
305    newss = (yyss != 0)
306          ? (short *)realloc(yyss, newsize * sizeof(*newss))
307          : (short *)malloc(newsize * sizeof(*newss));
308    if (newss == 0)
309        return -1;
310
311    yyss  = newss;
312    yyssp = newss + i;
313    newvs = (yyvs != 0)
314          ? (YYSTYPE *)realloc(yyvs, newsize * sizeof(*newvs))
315          : (YYSTYPE *)malloc(newsize * sizeof(*newvs));
316    if (newvs == 0)
317        return -1;
318
319    yyvs = newvs;
320    yyvsp = newvs + i;
321    yystacksize = newsize;
322    yysslim = yyss + newsize - 1;
323    return 0;
324}
325
326#define YYABORT goto yyabort
327#define YYREJECT goto yyabort
328#define YYACCEPT goto yyaccept
329#define YYERROR goto yyerrlab
330int
331yyparse(void)
332{
333    register int yym, yyn, yystate;
334#if YYDEBUG
335    register const char *yys;
336
337    if ((yys = getenv("YYDEBUG")) != 0)
338    {
339        yyn = *yys;
340        if (yyn >= '0' && yyn <= '9')
341            yydebug = yyn - '0';
342    }
343#endif
344
345    yynerrs = 0;
346    yyerrflag = 0;
347    yychar = YYEMPTY;
348
349    if (yyss == NULL && yygrowstack()) goto yyoverflow;
350    yyssp = yyss;
351    yyvsp = yyvs;
352    *yyssp = yystate = 0;
353
354yyloop:
355    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
356    if (yychar < 0)
357    {
358        if ((yychar = yylex()) < 0) yychar = 0;
359#if YYDEBUG
360        if (yydebug)
361        {
362            yys = 0;
363            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
364            if (!yys) yys = "illegal-symbol";
365            printf("%sdebug: state %d, reading %d (%s)\n",
366                    YYPREFIX, yystate, yychar, yys);
367        }
368#endif
369    }
370    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
371            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
372    {
373#if YYDEBUG
374        if (yydebug)
375            printf("%sdebug: state %d, shifting to state %d\n",
376                    YYPREFIX, yystate, yytable[yyn]);
377#endif
378        if (yyssp >= yysslim && yygrowstack())
379        {
380            goto yyoverflow;
381        }
382        *++yyssp = yystate = yytable[yyn];
383        *++yyvsp = yylval;
384        yychar = YYEMPTY;
385        if (yyerrflag > 0)  --yyerrflag;
386        goto yyloop;
387    }
388    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
389            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
390    {
391        yyn = yytable[yyn];
392        goto yyreduce;
393    }
394    if (yyerrflag) goto yyinrecovery;
395
396    yyerror("syntax error");
397
398#ifdef lint
399    goto yyerrlab;
400#endif
401
402yyerrlab:
403    ++yynerrs;
404
405yyinrecovery:
406    if (yyerrflag < 3)
407    {
408        yyerrflag = 3;
409        for (;;)
410        {
411            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
412                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
413            {
414#if YYDEBUG
415                if (yydebug)
416                    printf("%sdebug: state %d, error recovery shifting\
417 to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
418#endif
419                if (yyssp >= yysslim && yygrowstack())
420                {
421                    goto yyoverflow;
422                }
423                *++yyssp = yystate = yytable[yyn];
424                *++yyvsp = yylval;
425                goto yyloop;
426            }
427            else
428            {
429#if YYDEBUG
430                if (yydebug)
431                    printf("%sdebug: error recovery discarding state %d\n",
432                            YYPREFIX, *yyssp);
433#endif
434                if (yyssp <= yyss) goto yyabort;
435                --yyssp;
436                --yyvsp;
437            }
438        }
439    }
440    else
441    {
442        if (yychar == 0) goto yyabort;
443#if YYDEBUG
444        if (yydebug)
445        {
446            yys = 0;
447            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
448            if (!yys) yys = "illegal-symbol";
449            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
450                    YYPREFIX, yystate, yychar, yys);
451        }
452#endif
453        yychar = YYEMPTY;
454        goto yyloop;
455    }
456
457yyreduce:
458#if YYDEBUG
459    if (yydebug)
460        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
461                YYPREFIX, yystate, yyn, yyrule[yyn]);
462#endif
463    yym = yylen[yyn];
464    yyval = yyvsp[1-yym];
465    switch (yyn)
466    {
467case 6:
468#line 74 "parser.y"
469{
470			}
471break;
472case 7:
473#line 77 "parser.y"
474{
475				yyclearin;
476				yyerrok;
477			}
478break;
479case 8:
480#line 84 "parser.y"
481{
482				opts = NULL;
483			}
484break;
485case 9:
486#line 90 "parser.y"
487{
488				if ((yyvsp[0].number >= 0) && (yyvsp[0].number < RFCOMM_MAX_DEV))
489					opts = &rfcomm_opts[yyvsp[0].number];
490				else
491					opts = NULL;
492			}
493break;
494case 13:
495#line 104 "parser.y"
496{
497				if (opts)
498					opts->bind = yyvsp[0].number;
499			}
500break;
501case 14:
502#line 109 "parser.y"
503{
504				if (opts)
505					bacpy(&opts->bdaddr, yyvsp[0].bdaddr);
506			}
507break;
508case 15:
509#line 114 "parser.y"
510{
511				if (opts)
512					opts->channel = yyvsp[0].number;
513			}
514break;
515case 16:
516#line 119 "parser.y"
517{
518				if (opts)
519					snprintf(opts->comment, MAXCOMMENTLEN, "%s", yyvsp[0].string);
520			}
521break;
522case 17:
523#line 124 "parser.y"
524{
525				/* Unknown option*/
526			}
527break;
528case 18:
529#line 129 "parser.y"
530{ yyval.number = 1; }
531break;
532case 19:
533#line 130 "parser.y"
534{ yyval.number = 0; }
535break;
536#line 537 "y.tab.c"
537    }
538    yyssp -= yym;
539    yystate = *yyssp;
540    yyvsp -= yym;
541    yym = yylhs[yyn];
542    if (yystate == 0 && yym == 0)
543    {
544#if YYDEBUG
545        if (yydebug)
546            printf("%sdebug: after reduction, shifting from state 0 to\
547 state %d\n", YYPREFIX, YYFINAL);
548#endif
549        yystate = YYFINAL;
550        *++yyssp = YYFINAL;
551        *++yyvsp = yyval;
552        if (yychar < 0)
553        {
554            if ((yychar = yylex()) < 0) yychar = 0;
555#if YYDEBUG
556            if (yydebug)
557            {
558                yys = 0;
559                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
560                if (!yys) yys = "illegal-symbol";
561                printf("%sdebug: state %d, reading %d (%s)\n",
562                        YYPREFIX, YYFINAL, yychar, yys);
563            }
564#endif
565        }
566        if (yychar == 0) goto yyaccept;
567        goto yyloop;
568    }
569    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
570            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
571        yystate = yytable[yyn];
572    else
573        yystate = yydgoto[yym];
574#if YYDEBUG
575    if (yydebug)
576        printf("%sdebug: after reduction, shifting from state %d \
577to state %d\n", YYPREFIX, *yyssp, yystate);
578#endif
579    if (yyssp >= yysslim && yygrowstack())
580    {
581        goto yyoverflow;
582    }
583    *++yyssp = yystate;
584    *++yyvsp = yyval;
585    goto yyloop;
586
587yyoverflow:
588    yyerror("yacc stack overflow");
589
590yyabort:
591    return (1);
592
593yyaccept:
594    return (0);
595}
596