diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2012-04-01 16:53:06 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2012-04-01 16:53:06 +0000 |
commit | 66d9bc311a8207ff2fa9f2a6820598064f648f30 (patch) | |
tree | a842afd64f07ec26c86726b697a920b166b32de3 | |
parent | f58adbf368a769619f4be55f114e7193228168b2 (diff) |
btctl can go too, jmc notices
-rw-r--r-- | usr.sbin/btctl/Makefile | 14 | ||||
-rw-r--r-- | usr.sbin/btctl/bt.conf.5 | 115 | ||||
-rw-r--r-- | usr.sbin/btctl/btctl.8 | 58 | ||||
-rw-r--r-- | usr.sbin/btctl/btctl.c | 105 | ||||
-rw-r--r-- | usr.sbin/btctl/btctl.h | 45 | ||||
-rw-r--r-- | usr.sbin/btctl/parse.y | 610 |
6 files changed, 0 insertions, 947 deletions
diff --git a/usr.sbin/btctl/Makefile b/usr.sbin/btctl/Makefile deleted file mode 100644 index 79143d800fe..00000000000 --- a/usr.sbin/btctl/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# $OpenBSD: Makefile,v 1.4 2008/12/01 20:22:56 todd Exp $ - -.PATH: ${.CURDIR}/../btd - -PROG= btctl -SRCS= bt_subr.c btctl.c conf.c log.c parse.y -MAN= btctl.8 bt.conf.5 - -LDADD+= -lusbhid -CPPFLAGS+= -I${.CURDIR} -I${.CURDIR}/../btd -COPTS+= -Wall -Werror -DEBUG= -g - -.include <bsd.prog.mk> diff --git a/usr.sbin/btctl/bt.conf.5 b/usr.sbin/btctl/bt.conf.5 deleted file mode 100644 index 10db148c6c7..00000000000 --- a/usr.sbin/btctl/bt.conf.5 +++ /dev/null @@ -1,115 +0,0 @@ -.\" $OpenBSD: bt.conf.5,v 1.5 2011/08/19 19:59:51 jmc Exp $ -.\" -.\" Copyright (c) 2008 Todd T. Fries <todd@OpenBSD.org> -.\" -.\" Permission to use, copy, modify, and distribute this software for any -.\" purpose with or without fee is hereby granted, provided that the above -.\" copyright notice and this permission notice appear in all copies. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.Dd $Mdocdate: August 19 2011 $ -.Dt BT.CONF 5 -.Os -.Sh NAME -.Nm bt.conf -.Nd bluetooth configuration file -.Sh DESCRIPTION -The -.Nm -file specifies interfaces and device attachments for bluetooth. -.Pp -The bluetooth daemon, -.Xr btd 8 , -can be enabled to run at boot time via the -.Va bt -variable in -.Xr rc 8 . -The -.Nm -configuration itself is loaded at boot time -in -.Xr rc.conf.local 8 . -A utility called -.Xr btctl 8 -is also available to load -.Nm -configurations. -.Sh BT.CONF FILE FORMAT -Lines beginning with -.Sq # -and empty lines are regarded as comments, -and ignored. -.\" Lines may be split using the -.\" .Sq \e -.\" character. -.Pp -.Ar interface -describes the -.Xr bluetooth 3 -interface to attach to. -Possible arguments include -.Ar interfacemac -and -.Ar name . -.Ar interfacemac -may be -.Sq * -to match any further interfaces. -.Ar name -may be -.Dq disable -to disable an interface from being used. -.Pp -.Ar attach -describes the -.Xr bluetooth 3 -devices to attach. -Possible arguments include -.Ar devicemac , -.Ar type , -and -.Ar pin . -.Ar devicemac -may be -.Sq * -to match any device. -.Ar type -describes the type of device to attach. -Possible types are -.Bl -column "noneXX" "Keyboard/Mouse" -offset indent -.It Em "Type" Ta Em "Description" -.It Li none Ta "catchall" -.It Li hf Ta "Hands Free" -.It Li hid Ta "Keyboard/Mouse" -.It Li hset Ta "Handset" -.El -.Pp -.Ar pin -describes the pin number used to pair with the device. -The pin number must be specified in quotes. -.Pp -For example: -.Bd -literal -offset indent -# Enable all interfaces. -interface * "OpenBSD BT" -# Attach a keyboard and/or mouse, -# or a mobile phone emulating such things. -attach 00:02:76:08:1c:37 type hid pin "0000" -.Ed -.Sh SEE ALSO -.Xr sbt 4 , -.Xr ubt 4 , -.Xr btctl 8 , -.Xr btd 8 -.Sh HISTORY -The -.Nm -file format first appeared in -.Ox 4.5 . diff --git a/usr.sbin/btctl/btctl.8 b/usr.sbin/btctl/btctl.8 deleted file mode 100644 index 0c1ddc774d6..00000000000 --- a/usr.sbin/btctl/btctl.8 +++ /dev/null @@ -1,58 +0,0 @@ -.\" $OpenBSD: btctl.8,v 1.3 2008/12/06 22:51:01 sobrado Exp $ -.\" -.\" Copyright (c) 2008 Todd T. Fries <todd@OpenBSD.org> -.\" -.\" Permission to use, copy, modify, and distribute this software for any -.\" purpose with or without fee is hereby granted, provided that the above -.\" copyright notice and this permission notice appear in all copies. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.Dd $Mdocdate: December 6 2008 $ -.Dt BTCTL 8 -.Os -.Sh NAME -.Nm btctl -.Nd bluetooth configuration utility -.Sh SYNOPSIS -.Nm btctl -.Op Fl f Ar file -.Sh DESCRIPTION -The -.Nm -utility loads rules into -.Xr btd 8 . -.Nm -only does parsing, not interpretation. -The ruleset grammar is described in -.Xr bt.conf 5 . -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl f Ar file -Load the rules contained in -.Ar file . -.El -.Sh EXAMPLES -The following command, executed from the command line, would configure -the -.Xr btd 8 -daemon with the contents of -.Pa /etc/bt.conf : -.Bd -literal -offset indent -# btctl -f /etc/bt.conf -.Ed -.Sh SEE ALSO -.Xr bt.conf 5 , -.Xr btd 8 -.Sh HISTORY -The -.Nm -program first appeared in -.Ox 4.5 . diff --git a/usr.sbin/btctl/btctl.c b/usr.sbin/btctl/btctl.c deleted file mode 100644 index 03b781ae94b..00000000000 --- a/usr.sbin/btctl/btctl.c +++ /dev/null @@ -1,105 +0,0 @@ -/* $OpenBSD: btctl.c,v 1.2 2008/11/26 22:17:18 uwe Exp $ */ - -/* - * Copyright (c) 2008 Uwe Stuehler - * Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org> - * Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org> - * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org> - * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <sys/un.h> - -#include <err.h> -#include <errno.h> -#include <libgen.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "btd.h" -#include "btctl.h" - -__dead void usage(void); - -static const char *progname; - -__dead void -usage(void) -{ - fprintf(stderr, "usage: %s -f file\n", progname); - exit(2); -} - -int -main(int argc, char *argv[]) -{ - struct sockaddr_un sun; - const char *conffile; - int ctl_sock; - int ch; - int try; - - progname = basename(argv[0]); - conffile = NULL; - - while ((ch = getopt(argc, argv, "f:")) != -1) { - switch (ch) { - case 'f': - conffile = optarg; - break; - default: - usage(); - /* NOTREACHED */ - } - } - - argc -= optind; - argv += optind; - - if (conffile != NULL && argc > 0) - usage(); - - if (conffile == NULL) - usage(); - - log_init(1); - - if ((ctl_sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) - err(1, "socket"); - - bzero(&sun, sizeof(sun)); - sun.sun_family = AF_UNIX; - strlcpy(sun.sun_path, BTD_SOCKET, sizeof(sun.sun_path)); - - try = 0; - reconnect: - /* connect to btd control socket, retry a few times */ - if (connect(ctl_sock, (struct sockaddr *)&sun, sizeof(sun)) == -1) { - /* Keep retrying if running in monitor mode */ - if ((errno == ENOENT || errno == ECONNREFUSED) && - ++try < 50) { - usleep(100); - goto reconnect; - } - err(1, "%s", BTD_SOCKET); - } - - if (parse_config(conffile, ctl_sock)) - exit(1); - - return 0; -} diff --git a/usr.sbin/btctl/btctl.h b/usr.sbin/btctl/btctl.h deleted file mode 100644 index 75f958e99dd..00000000000 --- a/usr.sbin/btctl/btctl.h +++ /dev/null @@ -1,45 +0,0 @@ -/* $OpenBSD: btctl.h,v 1.3 2008/11/26 06:51:04 uwe Exp $ */ - -/* - * Copyright (c) 2008 Uwe Stuehler <uwe@openbsd.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <netbt/bluetooth.h> -#include <netbt/hci.h> - -enum btctl_stmt_type { - BTCTL_CONFIG, - BTCTL_INTERFACE_STMT, - BTCTL_ATTACH_STMT, - BTCTL_COMMIT, - BTCTL_ROLLBACK -}; - -typedef struct { - bdaddr_t addr; - char name[HCI_UNIT_NAME_SIZE]; - int8_t flags; -} btctl_interface_stmt; -#define BTCTL_INTERFACE_DISABLED 0x01 - -typedef struct { - bdaddr_t addr; - uint16_t type; - uint8_t pin[HCI_PIN_SIZE]; - uint8_t pin_size; -} btctl_attach_stmt; - -/* parse.y */ -int parse_config(const char *, int); diff --git a/usr.sbin/btctl/parse.y b/usr.sbin/btctl/parse.y deleted file mode 100644 index b84121ba343..00000000000 --- a/usr.sbin/btctl/parse.y +++ /dev/null @@ -1,610 +0,0 @@ -/* $OpenBSD: parse.y,v 1.7 2010/08/03 18:42:40 henning Exp $ */ - -/* - * Copyright (c) 2008 Uwe Stuehler <uwe@openbsd.org> - * Copyright (c) 2003 Can Erkin Acar - * Copyright (c) 2003 Anil Madhavapeddy <anil@recoil.org> - * Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org> - * Copyright (c) 2001 Markus Friedl. All rights reserved. - * Copyright (c) 2001 Daniel Hartmeier. All rights reserved. - * Copyright (c) 2001 Theo de Raadt. All rights reserved. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -%{ -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/queue.h> - -#include <dev/bluetooth/btdev.h> - -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> -#include <stdarg.h> -#include <errno.h> -#include <ctype.h> -#include <syslog.h> - -#include "btctl.h" -#include "btd.h" - -TAILQ_HEAD(files, file) files = TAILQ_HEAD_INITIALIZER(files); - -static struct file { - TAILQ_ENTRY(file) entry; - FILE *stream; - char *name; - int lineno; - int errors; -} *file, *topfile; - -struct file *pushfile(const char *); -int popfile(void); -int yyparse(void); -int yylex(void); -int yyerror(const char *, ...); -int kw_cmp(const void *, const void *); -int lookup(char *); -int lgetc(int); -int lungetc(int); -int findeol(void); - -typedef struct { - union { - int64_t number; - char *string; - bdaddr_t bdaddr; - } v; - int lineno; -} YYSTYPE; - -int ctl_sock; - -int exec_stmt(enum btctl_stmt_type, void *, size_t); -void must_read(void *, size_t); -void must_write(const void *, size_t); - -#define strbufcpy(_what, _from, _to) do { \ - if (_from == NULL) \ - memset(_to, 0, sizeof(_to)); \ - else if (strlen(_from) <= sizeof(_to)) \ - strncpy(_to, _from, sizeof(_to)); \ - else { \ - yyerror(_what " too long"); \ - YYERROR; \ - } \ -} while (0) - -%} - -%token INTERFACE NAME DISABLED -%token ATTACH TYPE HID HSET NONE HF PIN -%token ERROR -%token <v.string> STRING -%token <v.number> NUMBER -%type <v.bdaddr> address -%type <v.string> name_opt -%type <v.number> disabled_opt -%type <v.number> type_opt -%type <v.string> pin_opt -%% - -ruleset : /* empty */ - | ruleset '\n' - | ruleset main '\n' - | ruleset error '\n' { file->errors++; } - ; - -main : INTERFACE address name_opt disabled_opt { - btctl_interface_stmt stmt; - - bzero(&stmt, sizeof(stmt)); - bdaddr_copy(&stmt.addr, &$2); - - strbufcpy("interface name", $3, stmt.name); - free($3); - - stmt.flags = $4 ? BTCTL_INTERFACE_DISABLED : 0; - - switch (exec_stmt(BTCTL_INTERFACE_STMT, &stmt, sizeof(stmt))) { - case 0: - break; - case EEXIST: - yyerror("interface %s is already defined", - bdaddr_any(&stmt.addr) ? "*" : - bt_ntoa(&stmt.addr, NULL)); - YYERROR; - default: - yyerror("could not add interface"); - YYERROR; - } - } - | ATTACH address type_opt pin_opt { - btctl_attach_stmt stmt; - - bzero(&stmt, sizeof(stmt)); - bdaddr_copy(&stmt.addr, &$2); - - stmt.type = $3; - - if ($4 != NULL) { - strbufcpy("PIN code", $4, stmt.pin); - stmt.pin_size = strlen(stmt.pin); - free($4); - } else - stmt.pin_size = 0; - - switch (exec_stmt(BTCTL_ATTACH_STMT, &stmt, sizeof(stmt))) { - case 0: - break; - case EEXIST: - yyerror("device %s is already defined", - bdaddr_any(&stmt.addr) ? "*" : - bt_ntoa(&stmt.addr, NULL)); - YYERROR; - default: - yyerror("could not add device"); - YYERROR; - } - } - ; - -name_opt : /* empty */ - { $$ = NULL; } - | NAME STRING - { $$ = $2; } - ; - -disabled_opt : /* empty */ - { $$ = 0; } - | DISABLED - { $$ = 1; } - ; - -type_opt : /* empty */ - { $$ = BTDEV_NONE; } - | TYPE NONE - { $$ = BTDEV_NONE; } - | TYPE HID - { $$ = BTDEV_HID; } - | TYPE HSET - { $$ = BTDEV_HSET; } - | TYPE HF - { $$ = BTDEV_HF; } - ; - -pin_opt : /* empty */ - { $$ = NULL; } - | PIN STRING { - if (($$ = calloc(HCI_PIN_SIZE, sizeof(uint8_t))) == NULL) - fatal("pin_opt calloc"); - - strlcpy($$, $2, HCI_PIN_SIZE); - free($2); - } - ; - -address : STRING { - if (strcmp($1, "*")) { - bt_aton($1, &$$); - - if (bdaddr_any(&$$)) { - /* 0:0:0:0:0:0 could be misinterpreted */ - yyerror("invalid address '%s'", $1); - free($1); - YYERROR; - } - free($1); - } else - bdaddr_copy(&$$, BDADDR_ANY); - } - ; - -%% - -struct keywords { - const char *k_name; - int k_val; -}; - -int -yyerror(const char *fmt, ...) -{ - va_list ap; - char *nfmt; - - file->errors++; - va_start(ap, fmt); - if (asprintf(&nfmt, "%s:%d: %s", file->name, yylval.lineno, fmt) == -1) - fatalx("yyerror asprintf"); - vlog(LOG_CRIT, nfmt, ap); - va_end(ap); - free(nfmt); - return (0); -} - -int -kw_cmp(const void *k, const void *e) -{ - return (strcmp(k, ((const struct keywords *)e)->k_name)); -} - -int -lookup(char *s) -{ - /* this has to be sorted always */ - static const struct keywords keywords[] = { - { "attach", ATTACH}, - { "disabled", DISABLED}, - { "hf", HF}, - { "hid", HID}, - { "hset", HSET}, - { "interface", INTERFACE}, - { "name", NAME}, - { "none", NONE}, - { "pin", PIN}, - { "type", TYPE} - }; - const struct keywords *p; - - p = bsearch(s, keywords, sizeof(keywords)/sizeof(keywords[0]), - sizeof(keywords[0]), kw_cmp); - - if (p) - return (p->k_val); - else - return (STRING); -} - -#define MAXPUSHBACK 128 - -char *parsebuf; -int parseindex; -char pushback_buffer[MAXPUSHBACK]; -int pushback_index = 0; - -int -lgetc(int quotec) -{ - int c, next; - - if (parsebuf) { - /* Read character from the parsebuffer instead of input. */ - if (parseindex >= 0) { - c = parsebuf[parseindex++]; - if (c != '\0') - return (c); - parsebuf = NULL; - } else - parseindex++; - } - - if (pushback_index) - return (pushback_buffer[--pushback_index]); - - if (quotec) { - if ((c = getc(file->stream)) == EOF) { - yyerror("reached end of file while parsing " - "quoted string"); - if (file == topfile || popfile() == EOF) - return (EOF); - return (quotec); - } - return (c); - } - - while ((c = getc(file->stream)) == '\\') { - next = getc(file->stream); - if (next != '\n') { - c = next; - break; - } - yylval.lineno = file->lineno; - file->lineno++; - } - - while (c == EOF) { - if (file == topfile || popfile() == EOF) - return (EOF); - c = getc(file->stream); - } - return (c); -} - -int -lungetc(int c) -{ - if (c == EOF) - return (EOF); - if (parsebuf) { - parseindex--; - if (parseindex >= 0) - return (c); - } - if (pushback_index < MAXPUSHBACK-1) - return (pushback_buffer[pushback_index++] = c); - else - return (EOF); -} - -int -findeol(void) -{ - int c; - - parsebuf = NULL; - - /* skip to either EOF or the first real EOL */ - while (1) { - if (pushback_index) - c = pushback_buffer[--pushback_index]; - else - c = lgetc(0); - if (c == '\n') { - file->lineno++; - break; - } - if (c == EOF) - break; - } - return (ERROR); -} - -int -yylex(void) -{ - char buf[8096]; - char *p; - int quotec, next, c; - int token; - - p = buf; - while ((c = lgetc(0)) == ' ' || c == '\t') - ; /* nothing */ - - yylval.lineno = file->lineno; - if (c == '#') - while ((c = lgetc(0)) != '\n' && c != EOF) - ; /* nothing */ - - switch (c) { - case '\'': - case '"': - quotec = c; - while (1) { - if ((c = lgetc(quotec)) == EOF) - return (0); - if (c == '\n') { - file->lineno++; - continue; - } else if (c == '\\') { - if ((next = lgetc(quotec)) == EOF) - return (0); - if (next == quotec || c == ' ' || c == '\t') - c = next; - else if (next == '\n') { - file->lineno++; - continue; - } else - lungetc(next); - } else if (c == quotec) { - *p = '\0'; - break; - } - if (p + 1 >= buf + sizeof(buf) - 1) { - yyerror("string too long"); - return (findeol()); - } - *p++ = (char)c; - } - yylval.v.string = strdup(buf); - if (yylval.v.string == NULL) - fatal("yylex: strdup"); - return (STRING); - } - -#define allowed_to_end_number(x) \ - (isspace(x) || x == ')' || x ==',' || x == '/' || x == '}' || x == '=') - - if (c == '-' || isdigit(c)) { - do { - *p++ = c; - if ((unsigned)(p-buf) >= sizeof(buf)) { - yyerror("string too long"); - return (findeol()); - } - } while ((c = lgetc(0)) != EOF && isdigit(c)); - lungetc(c); - if (p == buf + 1 && buf[0] == '-') - goto nodigits; - if (c == EOF || allowed_to_end_number(c)) { - const char *errstr = NULL; - - *p = '\0'; - yylval.v.number = strtonum(buf, LLONG_MIN, - LLONG_MAX, &errstr); - if (errstr) { - yyerror("\"%s\" invalid number: %s", - buf, errstr); - return (findeol()); - } - return (NUMBER); - } else { -nodigits: - while (p > buf + 1) - lungetc(*--p); - c = *--p; - if (c == '-') - return (c); - } - } - -#define allowed_in_string(x) \ - (isalnum(x) || (ispunct(x) && x != '(' && x != ')' && \ - x != '{' && x != '}' && x != '<' && x != '>' && \ - x != '!' && x != '=' && x != '/' && x != '#' && \ - x != ',')) - - if (isalnum(c) || c == ':' || c == '_' || c == '*') { - do { - *p++ = c; - if ((unsigned)(p-buf) >= sizeof(buf)) { - yyerror("string too long"); - return (findeol()); - } - } while ((c = lgetc(0)) != EOF && (allowed_in_string(c))); - lungetc(c); - *p = '\0'; - if ((token = lookup(buf)) == STRING) - if ((yylval.v.string = strdup(buf)) == NULL) - fatal("yylex: strdup"); - return (token); - } - if (c == '\n') { - yylval.lineno = file->lineno; - file->lineno++; - } - if (c == EOF) - return (0); - return (c); -} - -struct file * -pushfile(const char *name) -{ - struct file *nfile; - - if ((nfile = calloc(1, sizeof(struct file))) == NULL) { - log_warn("malloc"); - return (NULL); - } - if ((nfile->name = strdup(name)) == NULL) { - log_warn("malloc"); - free(nfile); - return (NULL); - } - if ((nfile->stream = fopen(nfile->name, "r")) == NULL) { - log_warn("%s", nfile->name); - free(nfile->name); - free(nfile); - return (NULL); - } - nfile->lineno = 1; - TAILQ_INSERT_TAIL(&files, nfile, entry); - return (nfile); -} - -int -popfile(void) -{ - struct file *prev; - - if ((prev = TAILQ_PREV(file, files, entry)) != NULL) - prev->errors += file->errors; - - TAILQ_REMOVE(&files, file, entry); - fclose(file->stream); - free(file->name); - free(file); - file = prev; - return (file ? 0 : EOF); -} - -int -parse_config(const char *filename, int fd) -{ - enum btctl_stmt_type stmt; - int errors = 0; - - ctl_sock = fd; - - if ((errno = exec_stmt(BTCTL_CONFIG, NULL, 0)) != 0) { - fatal("BTCTL_CONFIG"); - return -1; - } - - if ((file = pushfile(filename)) == NULL) - return (-1); - - topfile = file; - yyparse(); - errors = file->errors; - popfile(); - - stmt = errors ? BTCTL_ROLLBACK : BTCTL_COMMIT; - if ((errno = exec_stmt(stmt, NULL, 0)) != 0) - fatal(errors ? "BTCTL_ROLLBACK" : "BTCTL_CONFIG"); - - return (errors ? -1 : 0); -} - -int -exec_stmt(enum btctl_stmt_type stmt_type, void *data, size_t size) -{ - int err; - - must_write(&stmt_type, sizeof(stmt_type)); - must_write(data, size); - must_read(&err, sizeof(err)); - - return err; -} - -/* Read data with the assertion that it all must come through, or - * else abort the process. Based on atomicio() from openssh. */ -void -must_read(void *buf, size_t n) -{ - char *s = buf; - ssize_t res, pos = 0; - - while (n > pos) { - res = read(ctl_sock, s + pos, n - pos); - switch (res) { - case -1: - if (errno == EINTR || errno == EAGAIN) - continue; - /* FALLTHROUGH */ - case 0: - fatalx("short read"); - default: - pos += res; - } - } -} - -/* Write data with the assertion that it all has to be written, or - * else abort the process. Based on atomicio() from openssh. */ -void -must_write(const void *buf, size_t n) -{ - const char *s = buf; - ssize_t res, pos = 0; - - while (n > pos) { - res = write(ctl_sock, s + pos, n - pos); - switch (res) { - case -1: - if (errno == EINTR || errno == EAGAIN) - continue; - /* FALLTHROUGH */ - case 0: - fatalx("short write"); - default: - pos += res; - } - } -} |