X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=userv.git;a=blobdiff_plain;f=lexer.l;h=046b8b4cb01e1a600e15204ee7c41597ba9ab846;hp=388089a764770904b091aa31e2517734632c678d;hb=e5294e9e174ea671d2e8f3454d3fbf25fd106c36;hpb=a68bf830adf982141dc41b44ee7a66dafd45ae9f diff --git a/lexer.l b/lexer.l index 388089a..046b8b4 100644 --- a/lexer.l +++ b/lexer.l @@ -1,19 +1,20 @@ -/* - * Copyright (C)1996-1997,1999 Ian Jackson - * - * This 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 userv; if not, write to the Free Software - * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/* userv is + * Copyright 1996-2017 Ian Jackson . + * Copyright 2000 Ben Harris + * Copyright 2016-2017 Peter Benie + * + * This 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 3 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 userv; if not, see . */ %{ @@ -43,6 +44,7 @@ #include "common.h" #include "daemon.h" #include "lib.h" +#include "both.h" #include "tokens.h" #define HYPHEN '-' @@ -51,7 +53,7 @@ typedef int directive_fnt(int dtoken); static directive_fnt df_reject, df_execute, df_executefrompath; static directive_fnt df_executefromdirectory, df_executebuiltin; static directive_fnt df_errorstostderr, df_errorstosyslog, df_errorstofile; -static directive_fnt dfg_fdwant, dfg_setflag; +static directive_fnt dfg_fdwant, dfg_setflag, dfg_lookupquotemode; static directive_fnt df_reset, df_cd, df_userrcfile, df_include; static directive_fnt df_includelookup, df_includedirectory; static directive_fnt df_message, df_error, df_quit, df_eof; @@ -132,12 +134,14 @@ struct error_handling { static struct error_handling eh = { tokv_word_errorstostderr, 0,0,0,0,0 }; static int dequote(char *inplace); +static void countnewlines(void); -#define YY_NO_UNPUT +#define YY_NO_INPUT %} %option noyywrap +%option nounput %% @@ -148,6 +152,8 @@ execute-builtin { lr_dir= df_executebuiltin; return tokv_word_executebuiltin; } errors-to-stderr { lr_dir= df_errorstostderr; return tokv_word_errorstostderr; } errors-to-syslog { lr_dir= df_errorstosyslog; return tokv_word_errorstosyslog; } errors-to-file { lr_dir= df_errorstofile; return tokv_word_errorstofile; } +include-lookup-quote-old { lr_dir= dfg_lookupquotemode; return tokv_word_includelookupquoteold; } +include-lookup-quote-new { lr_dir= dfg_lookupquotemode; return tokv_word_includelookupquotenew; } require-fd { lr_dir= dfg_fdwant; lr_fdwant_readwrite=1; return tokv_word_requirefd; } allow-fd { lr_dir= dfg_fdwant; lr_fdwant_readwrite=0; return tokv_word_allowfd; } null-fd { lr_dir= dfg_fdwant; lr_fdwant_readwrite=0; return tokv_word_nullfd; } @@ -228,6 +234,9 @@ local7 { lr_logfacility= LOG_LOCAL7; return tokv_syslog_local7; } read { return tokv_word_read; } write { return tokv_word_write; } \$ { return tokv_dollar; } +stdin { lr_max= lr_min= 0; return tokv_word_stdin; } +stdout { lr_max= lr_min= 1; return tokv_word_stdout; } +stderr { lr_max= lr_min= 2; return tokv_word_stderr; } \( { return tokv_openparen; } \) { return tokv_closeparen; } \! { return tokv_not; } @@ -247,39 +256,35 @@ error { lr_dir= df_error; lr_loglevel= LOG_ERR; return tokv_word_error; } char *ep; lr_min= (int)strtoul(yytext,&ep,10); assert(*ep == HYPHEN); - assert(*++ep); + ep++; assert(*ep); lr_max= (int)strtoul(ep,&ep,10); assert(!*ep); - if (lr_max < lr_min) { - parseerrprint("fd range has min > max"); - return tokv_error; - } + if (lr_max < lr_min) + return parseerrprint("fd range has min > max"); return tokv_fdrange; } [0-9]{1,8}- { char *ep; lr_min= (int)strtoul(yytext,&ep,10); assert(*ep == HYPHEN); - assert(!*++ep); + ep++; assert(!*ep); lr_max=-1; return tokv_fdstoend; } -[\ \t]+ return tokv_lwsp; +([\ \t]*\\[\ \t]*\n[\ \t]*)+ countnewlines(); return tokv_lwsp; +[\ \t]+ return tokv_lwsp; [\ \t]*\n cstate->lineno++; return tokv_newline; [\ \t]*\#[^\n]*\n cstate->lineno++; return tokv_newline; -[\ \t]*\#[^\n]* { - parseerrprint("missing newline at eof after comment"); - return tokv_error; - } +[\ \t]*\#[^\n]* return parseerrprint("missing newline at eof after comment"); \"([^\\\"\n]|\\[a-z]|\\[0-9]{3}|\\x[0-9A-Fa-f]{2}|\\[[:punct:]]|\\[ \t]*\n)*\" { + countnewlines(); return dequote(yytext); } -\".* { - parseerrprint("misquoted or unterminated string"); - return tokv_error; - } -[^\ \t\n]+ return tokv_barestring; -<> return tokv_eof; +[^\ \t\n\\\"]+ return tokv_barestring; +<> return tokv_eof; +\" return parseerrprint("misquoted or unterminated string"); +\\ return parseerrprint("unexpected backslash"); +. abort(); /* expect lex warning "rule cannot be matched" */ %%