mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-17 17:24:32 +08:00
166 lines
2.9 KiB
Plaintext
166 lines
2.9 KiB
Plaintext
%{
|
|
/*
|
|
*
|
|
* RFCOMM configuration utility
|
|
*
|
|
* Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <sys/param.h>
|
|
#include <sys/socket.h>
|
|
|
|
#include <bluetooth/bluetooth.h>
|
|
#include <bluetooth/rfcomm.h>
|
|
|
|
#include "kword.h"
|
|
|
|
int yyparse(void);
|
|
int yylex(void);
|
|
int yyerror(char *s);
|
|
|
|
struct rfcomm_opts *opts;
|
|
|
|
%}
|
|
|
|
%union {
|
|
int number;
|
|
char *string;
|
|
bdaddr_t *bdaddr;
|
|
}
|
|
|
|
%token K_BIND K_DEVICE K_CHANNEL K_COMMENT
|
|
%token K_YES K_NO
|
|
|
|
%token <number> NUMBER RFCOMM
|
|
%token <string> STRING WORD
|
|
%token <bdaddr> BDADDR
|
|
|
|
%type <number> bool
|
|
|
|
%%
|
|
|
|
config : statement | config statement
|
|
;
|
|
|
|
statement : section '{' rfcomm_options '}'
|
|
| rfcomm '{' rfcomm_options '}'
|
|
| WORD
|
|
{
|
|
}
|
|
| error
|
|
{
|
|
yyclearin;
|
|
yyerrok;
|
|
}
|
|
;
|
|
|
|
section : WORD
|
|
{
|
|
opts = NULL;
|
|
}
|
|
;
|
|
|
|
rfcomm : RFCOMM
|
|
{
|
|
if (($1 >= 0) && ($1 < RFCOMM_MAX_DEV))
|
|
opts = &rfcomm_opts[$1];
|
|
else
|
|
opts = NULL;
|
|
}
|
|
;
|
|
|
|
rfcomm_options : rfcomm_option ';'
|
|
| error ';'
|
|
| rfcomm_options rfcomm_option ';'
|
|
;
|
|
|
|
rfcomm_option : K_BIND bool
|
|
{
|
|
if (opts)
|
|
opts->bind = $2;
|
|
}
|
|
| K_DEVICE BDADDR
|
|
{
|
|
if (opts)
|
|
bacpy(&opts->bdaddr, $2);
|
|
}
|
|
| K_CHANNEL NUMBER
|
|
{
|
|
if (opts)
|
|
opts->channel = $2;
|
|
}
|
|
| K_COMMENT STRING
|
|
{
|
|
if (opts)
|
|
snprintf(opts->comment, MAXCOMMENTLEN, "%s", $2);
|
|
}
|
|
| WORD
|
|
{
|
|
// Unknown option
|
|
}
|
|
;
|
|
|
|
bool : K_YES { $$ = 1; }
|
|
| K_NO { $$ = 0; }
|
|
;
|
|
|
|
%%
|
|
|
|
int yyerror(char *s)
|
|
{
|
|
fprintf(stderr, "%s line %d\n", s, lineno);
|
|
return 0;
|
|
}
|
|
|
|
int rfcomm_read_config(char *filename)
|
|
{
|
|
extern FILE *yyin;
|
|
char file[MAXPATHLEN + 1];
|
|
int i;
|
|
|
|
for (i = 0; i < RFCOMM_MAX_DEV; i++) {
|
|
rfcomm_opts[i].bind = 0;
|
|
bacpy(&rfcomm_opts[i].bdaddr, BDADDR_ANY);
|
|
rfcomm_opts[i].channel = 1;
|
|
}
|
|
|
|
if (filename) {
|
|
snprintf(file, MAXPATHLEN, "%s", filename);
|
|
} else {
|
|
snprintf(file, MAXPATHLEN, "%s/.bluetooth/rfcomm.conf", getenv("HOME"));
|
|
|
|
if ((getuid() == 0) || (access(file, R_OK) < 0))
|
|
snprintf(file, MAXPATHLEN, "/etc/bluetooth/rfcomm.conf");
|
|
}
|
|
|
|
if (!(yyin = fopen(file, "r")))
|
|
return -1;
|
|
|
|
lineno = 1;
|
|
yyparse();
|
|
|
|
fclose(yyin);
|
|
|
|
return 0;
|
|
}
|