aboutsummaryrefslogtreecommitdiff
path: root/src/meta1gram.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/meta1gram.y')
-rw-r--r--src/meta1gram.y406
1 files changed, 0 insertions, 406 deletions
diff --git a/src/meta1gram.y b/src/meta1gram.y
deleted file mode 100644
index 3e19a12..0000000
--- a/src/meta1gram.y
+++ /dev/null
@@ -1,406 +0,0 @@
-%{
-/* MeTA1 configuration parser for GNU Pies.
- Copyright (C) 2008, 2009, 2010, 2011, 2013 Sergey Poznyakoff
-
- GNU Pies 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, or (at your option)
- any later version.
-
- GNU Pies 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 GNU Pies. If not, see <http://www.gnu.org/licenses/>. */
-
-/* This file implements a grammar for parsing MeTA1 main configuration file,
- and a set of functions for converting its statements into Pies
- configuration statements. */
-
-#include "pies.h"
-#include "grecs-locus.h"
-#include "meta1lex.h"
-#include "meta1gram.h"
-
-#define META1_QUEUE_DIR() \
- (meta1_queue_dir ? meta1_queue_dir : "/var/spool/meta1")
-
-enum meta1_stmt_type
-{
- meta1_simple,
- meta1_block
-};
-
-struct meta1_stmt
-{
- struct meta1_stmt *next;
- grecs_locus_t locus;
- enum meta1_stmt_type type;
- const char *ident;
- union
- {
- grecs_value_t *value;
- struct meta1_stmt *list;
- } v;
-};
-
-struct meta1_stmt *
-meta1_stmt_create (enum meta1_stmt_type type, const char *ident)
-{
- struct meta1_stmt *p = grecs_malloc (sizeof (*p));
- p->next = NULL;
- p->type = type;
- p->ident = ident;
- p->locus = meta1lloc;
- return p;
-}
-
-static struct meta1_stmt *
-_reverse (struct meta1_stmt *list, struct meta1_stmt **root)
-{
- struct meta1_stmt *next;
-
- if (list->next == NULL)
- {
- *root = list;
- return list;
- }
- next = _reverse (list->next, root);
- next->next = list;
- list->next = NULL;
- return list;
-}
-
-static struct meta1_stmt *
-reverse (struct meta1_stmt *in)
-{
- struct meta1_stmt *root;
- if (!in)
- return in;
- _reverse (in, &root);
- return root;
-}
-
-static void meta1_translate (struct meta1_stmt *);
-%}
-
-%error-verbose
-%locations
-
-%union {
- char *string;
- struct grecs_list *list;
- grecs_value_t *value;
- struct meta1_stmt *stmt;
-}
-
-%token <string> META1_IDENT META1_STRING META1_NUMBER
-%type <list> slist values list
-%type <value> value
-%type <string> string ident tag
-%type <stmt> stmtlist stmt simple block
-%%
-
-input : stmtlist
- {
- struct meta1_stmt *stmt;
- for (stmt = $1; stmt; stmt = stmt->next)
- meta1_translate (stmt);
- }
- ;
-
-stmtlist: stmt
- {
- $$ = $1;
- }
- | stmtlist stmt
- {
- $2->next = $1;
- $$ = $2;
- }
- ;
-
-stmt : simple
- | block
- ;
-
-simple : ident '=' value opt_sc
- {
- $$ = meta1_stmt_create (meta1_simple, $1);
- $$->v.value = $3;
- }
- ;
-
-block : ident tag '{' stmtlist '}' opt_sc
- {
- $$ = meta1_stmt_create (meta1_block, $2 ? $2 : $1);
- $$->v.list = reverse ($4);
- }
- ;
-
-tag : /* empty */
- {
- $$ = NULL;
- }
- | META1_IDENT
- ;
-
-ident : META1_IDENT
- ;
-
-value : string
- {
- $$ = grecs_malloc (sizeof (*$$));
- $$->type = GRECS_TYPE_STRING;
- $$->v.string = $1;
- }
- | list
- {
- $$ = grecs_malloc (sizeof (*$$));
- $$->type = GRECS_TYPE_LIST;
- $$->v.list = $1;
- }
- | META1_NUMBER
- {
- $$ = grecs_malloc (sizeof (*$$));
- $$->type = GRECS_TYPE_STRING;
- $$->v.string = $1;
- }
- ;
-
-string : META1_IDENT
- | slist
- {
- struct grecs_list_entry *ep;
- meta1_line_begin ();
- for (ep = $1->head; ep; ep = ep->next)
- {
- const char *p = ep->data;
- meta1_line_add (p, strlen (p));
- }
- $$ = meta1_line_finish ();
- }
- ;
-
-slist : META1_STRING
- {
- $$ = grecs_list_create ();
- grecs_list_append ($$, $1);
- }
- | slist META1_STRING
- {
- grecs_list_append ($1, $2);
- $$ = $1;
- }
- ;
-
-list : '{' values '}'
- {
- $$ = $2;
- }
- | '{' values ',' '}'
- {
- $$ = $2;
- }
- ;
-
-values : value
- {
- $$ = grecs_list_create ();
- grecs_list_append ($$, $1);
- }
- | values ',' value
- {
- grecs_list_append ($1, $3);
- $$ = $1;
- }
- ;
-
-opt_sc : /* empty */
- | ';'
- ;
-
-%%
-int
-yyerror (char const *s)
-{
- grecs_error (&yylloc, 0, "%s", s);
- return 0;
-}
-
-void
-meta1_parser_set_debug ()
-{
- char *p = getenv ("META1_DEBUG_YACC");
- yydebug = p && (*p - '0') > 0;
-}
-
-static struct meta1_stmt *
-find_stmt (struct meta1_stmt *stmt, const char *ident)
-{
- for (; stmt; stmt = stmt->next)
- if (strcmp (stmt->ident, ident) == 0)
- break;
- return stmt;
-}
-
-
-struct node_trans
-{
- char *name;
- char *new_name;
- int (*xlat) (struct meta1_stmt *stmt, struct component *comp);
-};
-
-static struct node_trans *
-find_node_trans (struct node_trans *tab, const char *name)
-{
- for (; tab->name; tab++)
- if (strcmp (tab->name, name) == 0)
- return tab;
- return NULL;
-}
-
-static int
-xlat_listen_socket (struct meta1_stmt *stmt, struct component *comp)
-{
- struct meta1_stmt *p;
- grecs_value_t *val;
-
- p = find_stmt (stmt->v.list, "type");
- if (!p || !p->v.value || p->v.value->type != GRECS_TYPE_STRING)
- return 1;
- meta1_line_begin ();
- meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
- meta1_line_add ("://", 3);
- if (strcmp (p->v.value->v.string, "inet") == 0)
- {
- const char *addr;
- p = find_stmt (stmt->v.list, "address");
- if (p)
- {
- if (p->v.value->type != GRECS_TYPE_STRING)
- return 1;
- addr = p->v.value->v.string;
- }
- else
- addr = "0.0.0.0";
- meta1_line_add (addr, strlen (addr));
- meta1_line_add (":", 1);
- p = find_stmt (stmt->v.list, "port");
- if (p->v.value->type != GRECS_TYPE_STRING)
- return 1;
- meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
- }
- else if (strcmp (p->v.value->v.string, "unix") == 0)
- {
- /* listen_socket {
- type=unix;
- path = /tmp/socket;
- umask = 077;
- user = user;
- group = group;
- }
- */
- p = find_stmt (stmt->v.list, "path");
- if (!p || p->v.value->type != GRECS_TYPE_STRING)
- return 1;
- meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
-
- p = find_stmt (stmt->v.list, "user");
- if (p && p->v.value->type == GRECS_TYPE_STRING)
- {
- meta1_line_add (";user=", 6);
- meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
- }
-
- p = find_stmt (stmt->v.list, "group");
- if (p && p->v.value->type == GRECS_TYPE_STRING)
- {
- meta1_line_add (";group=", 7);
- meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
- }
-
- p = find_stmt (stmt->v.list, "umask");
- if (p && p->v.value->type == GRECS_TYPE_STRING)
- {
- meta1_line_add (";umask=", 7);
- meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
- }
- }
- val = grecs_malloc (sizeof (*val));
- val->type = GRECS_TYPE_STRING;
- val->v.string = meta1_line_finish ();
- stmt->type = meta1_simple;
- stmt->v.value = val;
- return 0;
-}
-
-static int
-xlat_start_action (struct meta1_stmt *stmt, struct component *comp)
-{
- if (strcmp (stmt->v.value->v.string, "wait") == 0)
- {
- meta1_line_begin ();
- meta1_line_add ("exec", 4);
- stmt->v.value->v.string = meta1_line_finish ();
- }
- return 0;
-}
-
-static struct node_trans root_node_trans[] = {
- { "listen_socket", "socket", xlat_listen_socket },
- { "start_action", "mode", xlat_start_action },
- { "pass_fd_socket", "pass-fd-socket" },
- { "user", "user" },
- { "path", "program" },
- { "arguments", "command" },
- { "restart_dependencies", "dependents", },
- { NULL }
-};
-
-static void
-meta1_translate_stmt (struct meta1_stmt *stmt, struct component *comp)
-{
- struct grecs_keyword *kwp;
-
- struct node_trans *nt = find_node_trans (root_node_trans, stmt->ident);
- if (!nt)
- return;
-
- kwp = find_component_keyword (nt->new_name);
- if (!kwp)
- abort ();
-
- if (nt->xlat && nt->xlat (stmt, comp))
- return;
-
- grecs_process_ident (kwp, stmt->v.value, comp, &stmt->locus);
-}
-
-static void
-meta1_translate (struct meta1_stmt *stmt)
-{
- struct component *comp;
- struct meta1_stmt *p;
- size_t len;
-
- if (stmt->type != meta1_block)
- return;
-
- comp = component_create (stmt->ident);
- for (p = stmt->v.list; p; p = p->next)
- {
- meta1_translate_stmt (p, comp);
- }
- comp->privs.allgroups = 1;
- comp->dir = META1_QUEUE_DIR ();
- comp->redir[RETR_ERR].type = redir_file;
- comp->redir[RETR_ERR].v.file = NULL;
- len = 0;
- grecs_asprintf (&comp->redir[RETR_ERR].v.file, &len,
- "%s/%s.log", META1_QUEUE_DIR (), comp->tag);
- component_finish (comp, &stmt->locus);
-}

Return to:

Send suggestions and report system problems to the System administrator.