From ab736c0b1959c6c605c210d5fd9665bfe002042e Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Fri, 24 Aug 2007 20:38:54 +0000 Subject: * lib/version.c: New file * lib/gsc.h (gsc_version): New function * cvs/Makefile.am, ckaliases/Makefile.am, wydawca/Makefile.am, lib/Makefile.am, jabberd/Makefile.am: Fix include dirs * ckaliases/ckaliases.c, ckaliases/lex.l, ckaliases/ckaliases.h, ckaliases/gram.y: Use long options. Implement --version * wydawca/wydawca.c, jabberd/main.c: Use gsc_version to display program version. * doc/gsc.texi: Update * bootstrap: Add vasprintf git-svn-id: file:///svnroot/gsc/trunk@289 d2de0444-eb31-0410-8365-af798a554d48 --- gram.y | 336 +++++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 172 insertions(+), 164 deletions(-) (limited to 'gram.y') diff --git a/gram.y b/gram.y index d20f9d8..92346c7 100644 --- a/gram.y +++ b/gram.y @@ -1,6 +1,6 @@ %{ /* ckaliases - verify syntax of sendmail-style alias files - Copyright (C) 2005 Sergey Poznyakoff + Copyright (C) 2005, 2007 Sergey Poznyakoff 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 @@ -15,23 +15,18 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include -#include -#include -#include -#include #include "ckaliases.h" SLIST *cw_list; /* List of domain names pertaining to Sendmail 'w' class */ -static int restricted; /* prohibit use of `special' aliases (pipes, file redirections - and includes */ -int verbose; /* Verbose mode */ -static int error_count; /* Number of errors detected so far */ +static int restricted; /* prohibit use of `special' aliases (pipes, + file redirections and includes */ +int verbose; /* Verbose mode */ +int error_count; /* Number of errors detected so far */ %} %union { - char *string; - SLIST *slist; + char *string; + SLIST *slist; }; %token IDENT EMAIL STRING LHS @@ -51,15 +46,15 @@ list : alias | list EOL alias | list error EOL { - yyclearin; - yyerrok; + yyclearin; + yyerrok; } ; alias : /* empty */ | lhs rhs { - regalias($1, $2); + regalias ($1, $2); } ; @@ -69,41 +64,43 @@ lhs : LHS ':' rhs : emails | rhs CONT emails { - slist_append(&$1, $3); - $$ = $1; + slist_append (&$1, $3); + $$ = $1; } ; emails: email | emails ',' email { - slist_append(&$1, $3); - $$ = $1; + slist_append (&$1, $3); + $$ = $1; } ; email : string { - if (restricted && ($1[0] == '|' || $1[0] == '/')) { - yyerror("Construct not allowed"); - YYERROR; - } - $$ = NULL; - slist_add(&$$, $1); + if (restricted && ($1[0] == '|' || $1[0] == '/')) + { + yyerror ("Construct not allowed"); + YYERROR; + } + $$ = NULL; + slist_add (&$$, $1); } | EMAIL { - $$ = NULL; - slist_add(&$$, $1); + $$ = NULL; + slist_add (&$$, $1); } | INCLUDE string { - if (restricted) { - yyerror("Include statement is not allowed"); - YYERROR; - } - $$ = NULL; - read_include(&$$, $2); + if (restricted) + { + yyerror ("Include statement is not allowed"); + YYERROR; + } + $$ = NULL; + read_include (&$$, $2); } ; @@ -113,156 +110,167 @@ string: IDENT %% -void -error(char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - fprintf(stderr, "\n"); - error_count++; -} - -yyerror(char *s) +int +yyerror (char *s) { - error("%s:%d: %s", file_name, line_num, s); + error_at_line (0, 0, file_name, line_num, "%s", s); + error_count++; } - void -usage() +usage () { - printf("usage: ckaliases [OPTIONS] [FILES...]\n"); - printf("OPTIONS and FILES may be interspered.\n"); - printf("Valid options are:\n"); - printf(" -d SPEC Set debug level. SPEC consists of the following\n"); - printf(" letters:\n"); - printf(" y enable parser debugging\n"); - printf(" l enable lexical analizer debugging\n"); - printf(" Upper-case variants are also accepted. Prepending\n"); - printf(" a letter with '-' reverts its sense\n"); - printf(" -h Display this help list\n"); - printf(" -r Restrict alias file syntax to aliases only (i.e.\n"); - printf(" prohibit use of pipes and file redirections\n"); - printf(" -u Revert the effect of the previous -r option\n"); - printf(" -v Verbose mode\n"); - printf(" -w FILE Read contents of Sendmail `w' class from the given\n"); - printf(" file.\n"); + printf ("usage: ckaliases [OPTIONS] [FILES...]\n"); + printf ("OPTIONS and FILES may be interspered.\n"); + printf ("Valid options are:\n"); + printf (" -d,--debug=SPEC Set debug level. SPEC consists of the following\n"); + printf (" letters:\n"); + printf (" y enable parser debugging\n"); + printf (" l enable lexical analizer debugging\n"); + printf (" Upper-case variants are also accepted. Prepending\n"); + printf (" a letter with '-' reverts its sense\n"); + printf (" -f, --files-from=FILE\n"); + printf (" Read names of alias files from FILE\n"); + printf (" -h, --help Display this help list\n"); + printf (" -r, --restrict Restrict alias file syntax to aliases only (i.e.\n"); + printf (" prohibit use of pipes and file redirections\n"); + printf (" -u, --unrestrict Revert the effect of the previous -r option\n"); + printf (" -v, --verbose Verbose mode\n"); + printf (" -V, --version print program version and exit\n"); + printf (" -w FILE Read contents of Sendmail `w' class from the given\n"); + printf (" file.\n"); } +struct option options[] = { + { "debug", required_argument, NULL, 'd' }, + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, 'V' }, + { "restrict", no_argument, NULL, 'r' }, + { "unrestrict", no_argument, NULL, 'u' }, + { "verbose", no_argument, NULL, 'v' }, + { "files-from", required_argument, NULL, 'f' }, + { NULL } +}; int -main(int argc, char **argv) +main (int argc, char **argv) { - char *p; - int c; - int file_count = 0; - int true = 1; - char *cwfile = "/etc/mail/sendmail.cw"; - SLIST *file_list; /* List of files to be read */ - struct string_list *s; + char *p; + int c; + int file_count = 0; + int true = 1; + char *cwfile = "/etc/mail/sendmail.cw"; + SLIST *file_list; /* List of files to be read */ + struct string_list *s; - begin_aliases(); - init_lex(); - while ((c = getopt(argc, argv, "-d:f:hp:ruvw:")) != EOF) { - switch (c) { - case 1: - if (!cw_list) - read_include(&cw_list, cwfile); - openaliases(optarg); - yyparse(); - file_count++; - break; + begin_aliases (); + init_lex (); + program_name = argv[0]; + while ((c = getopt_long (argc, argv, "-d:f:hp:ruvw:", options, NULL)) != EOF) + { + switch (c) + { + case 1: + if (!cw_list) + read_include (&cw_list, cwfile); + openaliases (optarg); + yyparse (); + file_count++; + break; - case 'd': - for (p = optarg; *p; p++) { - switch (*p) { - case '-': - true = 0; - break; - case 'y': - case 'Y': - yydebug = true; - true = 1; - break; - case 'l': - case 'L': - lex_debug(true); - true = 1; - break; - default: - fprintf(stderr, "%s: unknown debug option %c\n", - argv[0], *p); - exit(1); - } - } - break; - - case 'f': - if (!cw_list) - read_include(&cw_list, cwfile); - file_list = NULL; - read_include(&file_list, optarg); - for (s = file_list->head; s; s = s->next) { - openaliases_prefix(optarg, s->str); - yyparse(); - file_count++; - } - slist_destroy(&file_list); - break; - - case 'h': - usage(); - exit(0); - - case 'r': - restricted = 1; - break; - - case 'u': - restricted = 0; - break; + case 'd': + for (p = optarg; *p; p++) + { + switch (*p) + { + case '-': + true = 0; + break; + + case 'y': + case 'Y': + yydebug = true; + true = 1; + break; + + case 'l': + case 'L': + lex_debug (true); + true = 1; + break; - case 'v': - verbose++; - break; - - case 'w': - if (file_count) { - error("-w must be used before first non-option argument"); - exit(1); - } - cwfile = optarg; - break; - default: - exit(1); + error (1, 0, "%s: unknown debug option %c", argv[0]); } - } + } + break; + + case 'f': + if (!cw_list) + read_include (&cw_list, cwfile); + file_list = NULL; + read_include (&file_list, optarg); + for (s = file_list->head; s; s = s->next) + { + openaliases_prefix (optarg, s->str); + yyparse (); + file_count++; + } + slist_destroy (&file_list); + break; + + case 'h': + usage (); + exit (0); - argc -= optind; - argv += optind; + case 'r': + restricted = 1; + break; + + case 'u': + restricted = 0; + break; + + case 'v': + verbose++; + break; - if (!cw_list) - read_include(&cw_list, cwfile); - while (argc--) { - openaliases(*argv++); - yyparse(); - file_count++; + case 'V': + gsc_version ("ckaliases"); + exit (0); + + case 'w': + if (file_count) + error (1, 0, "-w must be used before first non-option argument"); + cwfile = optarg; + break; + + default: + exit (1); } + } + + argc -= optind; + argv += optind; + + if (!cw_list) + read_include (&cw_list, cwfile); + while (argc--) + { + openaliases (*argv++); + yyparse (); + file_count++; + } - if (!file_count) { - error("no files specified"); - exit(1); - } + if (!file_count) + error (1, 0, "no files specified"); - if (verbose) - printf("%d files\n", file_count); - end_aliases(); - check_aliases(); - if (verbose) - printf("%lu errors\n", error_count); - exit(error_count!=0); + if (verbose) + printf ("%d files\n", file_count); + end_aliases (); + check_aliases (); + if (verbose) + printf ("%lu errors\n", error_count); + exit (error_count!=0); } -- cgit v1.2.1