aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/.gitignore1
-rw-r--r--src/Makefile.am17
-rw-r--r--src/acl.c206
-rw-r--r--src/acl.h4
-rw-r--r--src/cmdline.opt193
-rw-r--r--src/diag.c40
-rw-r--r--src/inetd.c18
-rw-r--r--src/meta1gram.y47
-rw-r--r--src/meta1lex.h3
-rw-r--r--src/meta1lex.l55
-rw-r--r--src/pies.c329
-rw-r--r--src/pies.h12
-rw-r--r--src/progman.c86
-rw-r--r--src/userprivs.c49
14 files changed, 534 insertions, 526 deletions
diff --git a/src/.gitignore b/src/.gitignore
index 18a7111..4ad4290 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -1,3 +1,4 @@
+cmdline.h
inetd
meta1gram.c
meta1gram.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 19c6483..455b2c2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,5 +1,5 @@
# This file is part of GNU Pies.
-# Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+# Copyright (C) 2008, 2009, 2010, 2011 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
@@ -35,25 +35,34 @@ pies_SOURCES = \
noinst_HEADERS = \
acl.h\
+ cmdline.h\
meta1gram.h\
meta1lex.h\
pies.h
meta1lex.c: meta1gram.h
+BUILT_SOURCES=cmdline.h
+
incdir=$(pkgdatadir)/$(VERSION)/include
inc_DATA = pp-setup
-EXTRA_DIST = pp-setup inetd.in
+EXTRA_DIST = cmdline.opt pp-setup inetd.in
+
+SUFFIXES=.opt .c .h
+.opt.h:
+ $(AM_V_GEN)m4 -s $(top_srcdir)/@GRECS_SUBDIR@/build-aux/getopt.m4 $< > $@
+
+cmdline.h: cmdline.opt
INCLUDES = \
-I$(top_srcdir)/lib\
-I$(top_srcdir)/gnu\
-I$(top_builddir)/gnu\
- -I$(top_srcdir)/grecs/src
+ @GRECS_INCLUDES@
LDADD = \
../lib/libpies.a\
- ../grecs/src/libgrecs.a\
+ @GRECS_LDADD@\
../gnu/libgnu.a\
$(MF_PROCTITLE_LIBS)
diff --git a/src/acl.c b/src/acl.c
index a0ee85e..dc459f5 100644
--- a/src/acl.c
+++ b/src/acl.c
@@ -1,5 +1,5 @@
/* This file is part of GNU Pies
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 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
@@ -25,7 +25,6 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
-#include <hash.h>
struct pies_sockaddr
{
@@ -40,15 +39,15 @@ struct acl_entry
int allow;
int authenticated;
pies_acl_t acl;
- gl_list_t groups;
- gl_list_t sockaddrs;
+ struct grecs_list *groups;
+ struct grecs_list *sockaddrs;
};
struct pies_acl
{
char *name;
grecs_locus_t locus;
- gl_list_t list;
+ struct grecs_list *list;
};
@@ -61,14 +60,18 @@ pies_acl_create (const char *name, grecs_locus_t *locus)
pies_acl_t acl = xmalloc (sizeof (acl[0]));
acl->name = name ? xstrdup (name) : NULL;
acl->locus = *locus;
- acl->list = gl_list_create_empty(&gl_linked_list_implementation,
- NULL,
- NULL,
- NULL,
- false);
+ acl->list = grecs_list_create ();
return acl;
}
+void
+pies_acl_free (pies_acl_t acl)
+{
+ free (acl->name);
+ grecs_list_free (acl->list);
+ free (acl);
+}
+
static struct pies_sockaddr *
create_acl_sockaddr (int family, int len)
{
@@ -189,24 +192,24 @@ _parse_sockaddr (struct acl_entry *entry, const grecs_value_t *value)
else
sptr->netmask = 0xfffffffful;
}
- gl_list_add_last (entry->sockaddrs, sptr);
+ grecs_list_append (entry->sockaddrs, sptr);
return 0;
}
static int
-_parse_from (struct acl_entry *entry, size_t argc, const grecs_value_t *argv)
+_parse_from (struct acl_entry *entry, size_t argc, grecs_value_t **argv)
{
if (argc == 0)
return 0;
- else if (argv->type == GRECS_TYPE_LIST)
+ else if (argv[0]->type == GRECS_TYPE_LIST)
{
grecs_error (&entry->locus, 0, _("expected `from', but found list"));
return 1;
}
- else if (strcmp (argv->v.string, "from"))
+ else if (strcmp (argv[0]->v.string, "from"))
{
grecs_error (&entry->locus, 0, _("expected `from', but found `%s'"),
- argv->v.string);
+ argv[0]->v.string);
return 1;
}
argc--;
@@ -219,24 +222,19 @@ _parse_from (struct acl_entry *entry, size_t argc, const grecs_value_t *argv)
return 1;
}
- entry->sockaddrs = gl_list_create_empty(&gl_linked_list_implementation,
- NULL,
- NULL,
- NULL,
- false);
- if (argv->type == GRECS_TYPE_STRING)
+ entry->sockaddrs = grecs_list_create ();
+ if (argv[0]->type == GRECS_TYPE_STRING)
{
- if (_parse_sockaddr (entry, argv))
+ if (_parse_sockaddr (entry, argv[0]))
return 1;
}
else
{
- gl_list_iterator_t itr = gl_list_iterator (argv->v.list);
- const void *p;
int rc = 0;
- while (gl_list_iterator_next (&itr, &p, NULL))
- rc += _parse_sockaddr (entry, (const grecs_value_t*) p);
- gl_list_iterator_free (&itr);
+ struct grecs_list_entry *ep;
+
+ for (ep = argv[0]->v.list->head; ep; ep = ep->next)
+ rc += _parse_sockaddr (entry, (const grecs_value_t*) ep->data);
if (rc)
return rc;
}
@@ -250,11 +248,11 @@ _parse_from (struct acl_entry *entry, size_t argc, const grecs_value_t *argv)
}
static int
-_parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
+_parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t **argv)
{
if (argc == 0)
return 0;
- if (strcmp (argv->v.string, "acl") == 0)
+ if (strcmp (argv[0]->v.string, "acl") == 0)
{
argc--;
argv++;
@@ -265,19 +263,19 @@ _parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
return 1;
}
- if (argv->type != GRECS_TYPE_STRING)
+ if (argv[0]->type != GRECS_TYPE_STRING)
{
grecs_error (&entry->locus, 0,
_("expected string, but found list"));
return 1;
}
- entry->acl = pies_acl_lookup (argv->v.string);
+ entry->acl = pies_acl_lookup (argv[0]->v.string);
if (!entry->acl)
{
grecs_error (&entry->locus, 0, _("ACL not defined: `%s'"),
- argv->v.string);
+ argv[0]->v.string);
return 1;
}
argc--;
@@ -287,9 +285,9 @@ _parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
}
static int
-_parse_group (struct acl_entry *entry, size_t argc, grecs_value_t * argv)
+_parse_group (struct acl_entry *entry, size_t argc, grecs_value_t **argv)
{
- if (strcmp (argv->v.string, "group") == 0)
+ if (strcmp (argv[0]->v.string, "group") == 0)
{
argc--;
argv++;
@@ -299,17 +297,13 @@ _parse_group (struct acl_entry *entry, size_t argc, grecs_value_t * argv)
_("expected group list, but found end of statement"));
return 1;
}
- if (argv->type == GRECS_TYPE_STRING)
+ if (argv[0]->type == GRECS_TYPE_STRING)
{
- entry->groups = gl_list_create_empty(&gl_linked_list_implementation,
- NULL,
- NULL,
- NULL,
- false);
- gl_list_add_last (entry->groups, (void *) argv->v.string);
+ entry->groups = grecs_list_create ();
+ grecs_list_append (entry->groups, xstrdup (argv[0]->v.string));
}
else
- entry->groups = argv->v.list;
+ entry->groups = argv[0]->v.list;
argc--;
argv++;
}
@@ -317,11 +311,11 @@ _parse_group (struct acl_entry *entry, size_t argc, grecs_value_t * argv)
}
static int
-_parse_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
+_parse_acl (struct acl_entry *entry, size_t argc, grecs_value_t **argv)
{
- if (assert_grecs_value_type (&entry->locus, argv, GRECS_TYPE_STRING))
+ if (assert_grecs_value_type (&entry->locus, argv[0], GRECS_TYPE_STRING))
return 1;
- else if (_parse_token (entry, argv) == 0)
+ else if (_parse_token (entry, argv[0]) == 0)
return _parse_sub_acl (entry, argc - 1, argv + 1);
else
return _parse_group (entry, argc, argv);
@@ -356,7 +350,7 @@ parse_acl_line (grecs_locus_t *locus, int allow, pies_acl_t acl,
grecs_error (locus, 0, _("unexpected list"));
return 1;
}
- gl_list_add_last (acl->list, entry);
+ grecs_list_append (acl->list, entry);
return 0;
}
@@ -373,7 +367,6 @@ _acl_common_section_parser (enum grecs_callback_command cmd,
int flag)
{
pies_acl_t acl;
- grecs_locus_t defn_loc;
const char *tag = NULL;
int has_value = 0;
@@ -412,15 +405,8 @@ _acl_common_section_parser (enum grecs_callback_command cmd,
return 1;
}
acl = pies_acl_create (tag, locus);
- if (tag && pies_acl_install (acl, &defn_loc))
- {
- grecs_error (locus, 0,
- _("redefinition of ACL %s"),
- value->v.string);
- grecs_error (&defn_loc, 0,
- _("location of the previous definition"));
- return 1;
- }
+ if (tag && (acl = pies_acl_install (acl)) == NULL)
+ return 1;
if (pacl)
*pacl = acl;
break;
@@ -570,11 +556,10 @@ _acl_check (struct acl_entry *ent, struct acl_input *input)
if (ent->groups)
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator (ent->groups);
- while (result && gl_list_iterator_next (&itr, &p, NULL))
- result = match_group (input->groups, p);
- gl_list_iterator_free (&itr);
+ struct grecs_list_entry *ep;
+
+ for (ep = ent->groups->head; result && ep; ep = ep->next)
+ result = match_group (input->groups, ep->data);
if (!result)
return result;
}
@@ -585,16 +570,15 @@ _acl_check (struct acl_entry *ent, struct acl_input *input)
if (ent->sockaddrs)
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator (ent->sockaddrs);
+ struct grecs_list_entry *ep;
+
result = 0;
- while (gl_list_iterator_next (&itr, &p, NULL))
+ for (ep = ent->sockaddrs->head; ep; ep = ep->next)
{
- result = _check_sockaddr ((struct pies_sockaddr *)p, input);
+ result = _check_sockaddr ((struct pies_sockaddr *)ep->data, input);
if (result)
break;
}
- gl_list_iterator_free (&itr);
}
return result;
@@ -604,7 +588,7 @@ static int
_acl_check_cb (struct acl_entry *ent, struct acl_input *input, int *pres)
{
int result = _acl_check (ent, input);
- debug (1, ("%s:%d: %s", ent->locus.file, ent->locus.line,
+ debug (1, ("%s:%d: %s", ent->locus.beg.file, ent->locus.beg.line,
/* TRANSLATORS: `MATCHES' is the verb `match' in 2nd person.
E.g., in French: CONCORD AVEC */
result ? _("MATCHES") : _("does not match")));
@@ -622,12 +606,11 @@ pies_acl_check (pies_acl_t acl, struct acl_input *input, int result)
{
if (acl)
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator (acl->list);
- while (gl_list_iterator_next (&itr, &p, NULL)
- && !_acl_check_cb ((struct acl_entry *)p, input, &result))
- ;
- gl_list_iterator_free (&itr);
+ struct grecs_list_entry *ep;
+
+ for (ep = acl->list->head; ep; ep = ep->next)
+ if (_acl_check_cb ((struct acl_entry *)ep->data, input, &result))
+ break;
}
return result;
}
@@ -635,43 +618,78 @@ pies_acl_check (pies_acl_t acl, struct acl_input *input, int result)
/* Hash table */
-static Hash_table *acl_table;
+static struct grecs_symtab *acl_table;
/* Calculate the hash of a string. */
-static size_t
-acl_hasher (void const *data, size_t n_buckets)
+static unsigned
+acl_hasher (void *data, unsigned long n_buckets)
{
const struct pies_acl *p = data;
- return hash_string (p->name, n_buckets);
+ return grecs_hash_string (p->name, n_buckets);
}
/* Compare two strings for equality. */
-static bool
+static int
acl_compare (void const *data1, void const *data2)
{
const struct pies_acl *p1 = data1;
const struct pies_acl *p2 = data2;
- return strcasecmp (p1->name, p2->name) == 0;
+ return strcasecmp (p1->name, p2->name);
}
-int
-pies_acl_install (pies_acl_t acl, grecs_locus_t * locus)
+static int
+acl_copy (void *a, void *b)
+{
+ const struct pies_acl *pb = b;
+
+ memcpy (a, b, sizeof (struct pies_acl));
+ memset (b, 0, sizeof (struct pies_acl));
+ return 0;
+}
+
+static void
+acl_free_entry (void *p)
+{
+ pies_acl_free (p);
+}
+
+pies_acl_t
+pies_acl_install (pies_acl_t acl)
{
pies_acl_t ret;
- if (!((acl_table
- || (acl_table = hash_initialize (0, 0,
- acl_hasher,
- acl_compare, 0)))
- && (ret = hash_insert (acl_table, acl))))
- xalloc_die ();
-
- if (ret != acl)
+ int install = 1;
+
+ if (!acl_table)
{
- if (locus)
- *locus = ret->locus;
- return 1;
+ acl_table = grecs_symtab_create(sizeof (struct pies_acl),
+ acl_hasher,
+ acl_compare,
+ acl_copy,
+ NULL,
+ acl_free_entry);
+ if (!acl_table)
+ xalloc_die ();
}
- return 0;
+
+ ret = grecs_symtab_lookup_or_install (acl_table, acl, &install);
+
+ if (!ret)
+ {
+ logmsg (LOG_ERR, _("cannot install acl: %s"), strerror (errno));
+ exit (1);
+ }
+
+ if (!install)
+ {
+ grecs_error (&acl->locus, 0,
+ _("redefinition of ACL %s"),
+ ret->name);
+ grecs_error (&ret->locus, 0,
+ _("location of the previous definition"));
+ ret = NULL;
+ }
+ pies_acl_free (acl);
+ return ret;
}
pies_acl_t
@@ -681,5 +699,5 @@ pies_acl_lookup (const char *name)
if (!acl_table)
return NULL;
samp.name = (char *) name;
- return hash_lookup (acl_table, &samp);
+ return grecs_symtab_lookup_or_install (acl_table, &samp, NULL);
}
diff --git a/src/acl.h b/src/acl.h
index 65dcf40..c8e4d07 100644
--- a/src/acl.h
+++ b/src/acl.h
@@ -1,5 +1,5 @@
/* This file is part of GNU Pies
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 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
@@ -30,7 +30,7 @@ int pies_acl_check (pies_acl_t acl, struct acl_input *input, int result);
int parse_acl_line (grecs_locus_t *locus, int allow, pies_acl_t acl,
grecs_value_t *value);
pies_acl_t pies_acl_lookup (const char *name);
-int pies_acl_install (pies_acl_t acl, grecs_locus_t * locus);
+pies_acl_t pies_acl_install (pies_acl_t acl);
int assert_grecs_value_type (grecs_locus_t *locus,
const grecs_value_t *value, int type);
diff --git a/src/cmdline.opt b/src/cmdline.opt
new file mode 100644
index 0000000..31fcf20
--- /dev/null
+++ b/src/cmdline.opt
@@ -0,0 +1,193 @@
+/* This file is part of GNU Pies. -*- c -*-
+ Copyright (C) 2008, 2009, 2010, 2011 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/>. */
+
+OPTIONS_BEGIN("pies",
+ [<process invocation and execution supervisor>],
+ [<>],
+ [<gnu>],
+ [<copyright_year=2011>],
+ [<copyright_holder=Sergey Poznyakoff>])
+
+GROUP(Operation Mode)
+
+OPTION(config-file,c,FILE,
+ [<use FILE instead of the default configuration>])
+BEGIN
+ add_config (current_syntax, optarg);
+END
+
+OPTION(config-help,,,
+ [<show configuration file summary>])
+BEGIN
+ config_help ();
+ exit (0);
+END
+
+OPTION(,E,,
+ [<preprocess config and exit>])
+BEGIN
+ preprocess_only = 1;
+END
+
+OPTION(force,,,
+ [<force startup even if another instance may be running>])
+BEGIN
+ force_option = 1;
+END
+
+OPTION(foreground,,,
+ [<remain in foreground>])
+BEGIN
+ log_to_stderr_only = 1;
+ foreground = 1;
+END
+
+OPTION(inetd,i,,
+ [<run in inetd mode>])
+BEGIN
+ if (!instance)
+ instance = "inetd";
+ current_syntax = CONF_INETD;
+ inetd_mode = 1;
+END
+
+OPTION(instance,,NAME,
+ [<set instance name>])
+BEGIN
+ instance = optarg;
+END
+
+OPTION(rate,,NUMBER,
+ [<set default maximum rate for inetd-style components>])
+BEGIN
+ char *p;
+ default_max_rate = strtoul (optarg, &p, 10);
+ if (*p)
+ {
+ logmsg (LOG_ERR, _("not a number: %s"), optarg);
+ exit (EX_USAGE);
+ }
+END
+
+OPTION(stderr,,,
+ [<log to stderr>])
+BEGIN
+ log_to_stderr_only = 1;
+END
+
+OPTION(syntax,,[<{pies|inetd|meta1}>],
+ [<expect configuration files in the given syntax>])
+BEGIN
+ if (str_to_config_syntax (optarg, &current_syntax))
+ {
+ logmsg (LOG_ERR, _("unknown syntax type: %s"), optarg);
+ exit (EX_USAGE);
+ }
+END
+
+OPTION(syslog,,,
+ [<log to syslog>])
+BEGIN
+ log_to_stderr_only = 0;
+END
+
+OPTION(lint,t,,
+ [<parse configuration file and exit>])
+BEGIN
+ log_to_stderr_only = 1;
+ lint_mode = 1;
+END
+
+GROUP(Preprocessor)
+
+OPTION(define,D,[<NAME[=VALUE]>],
+ [<define a preprocessor symbol NAME as having VALUE or empty>])
+BEGIN
+ add_pp_option ("-D", optarg);
+END
+
+OPTION(undefine,U,NAME,
+ [<undefine a preprocessor symbol NAME>])
+BEGIN
+ add_pp_option ("-U", optarg);
+END
+
+GROUP(Component Management)
+
+OPTION(reload,r,,
+ [<reload the running instance of pies>])
+ALIAS(hup)
+BEGIN
+ log_to_stderr_only = 1;
+ command = COM_RELOAD;
+END
+
+OPTION(restart-component,R,,
+ [<restart components named in the command line>])
+BEGIN
+ log_to_stderr_only = 1;
+ command = COM_RESTART;
+END
+
+OPTION(status,s,,
+ [<display info about the running instance>])
+BEGIN
+ log_to_stderr_only = 1;
+ command = COM_STATUS;
+END
+
+OPTION(stop,S,,
+ [<stop the running instance>])
+BEGIN
+ log_to_stderr_only = 1;
+ command = COM_STOP;
+END
+
+GROUP(Debugging and Additional Diagnostics)
+
+OPTION(dump-depmap,,,
+ [<dump dependency map>])
+BEGIN
+ log_to_stderr_only = 1;
+ command = COM_DUMP_DEPMAP;
+END
+
+OPTION(dump-prereq,,,
+ [<dump prerequisite charts>])
+BEGIN
+ log_to_stderr_only = 1;
+ command = COM_DUMP_PREREQ;
+END
+
+OPTION(source-info,,,
+ [<show source info with debugging messages>])
+BEGIN
+ source_info_option = 1;
+END
+
+OPTION(debug,x,LEVEL,
+ [<set debug verbosity level>])
+BEGIN
+ debug_level = strtoul (optarg, NULL, 0);
+END
+
+OPTIONS_END
+
+void
+parse_options(int argc, char *argv[], int *index)
+{
+ GETOPT(argc, argv, *index)
+}
diff --git a/src/diag.c b/src/diag.c
index 53bc044..fe057d0 100644
--- a/src/diag.c
+++ b/src/diag.c
@@ -1,5 +1,5 @@
/* This file is part of GNU Pies.
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 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
@@ -125,15 +125,43 @@ logmsg_printf (int prio, const char *fmt, ...)
void
grecs_print_diag (grecs_locus_t *locus, int err, int errcode, const char *msg)
{
+ char *locstr = NULL;
+
if (locus)
{
+ size_t size = 0;
+
+ if (locus->beg.col == 0)
+ grecs_asprintf (&locstr, &size, "%s:%u",
+ locus->beg.file,
+ locus->beg.line);
+ else if (strcmp (locus->beg.file, locus->end.file))
+ grecs_asprintf (&locstr, &size, "%s:%u.%u-%s:%u.%u",
+ locus->beg.file,
+ locus->beg.line, locus->beg.col,
+ locus->end.file,
+ locus->end.line, locus->end.col);
+ else if (locus->beg.line != locus->end.line)
+ grecs_asprintf (&locstr, &size, "%s:%u.%u-%u.%u",
+ locus->beg.file,
+ locus->beg.line, locus->beg.col,
+ locus->end.line, locus->end.col);
+ else
+ grecs_asprintf (&locstr, &size, "%s:%u.%u-%u",
+ locus->beg.file,
+ locus->beg.line, locus->beg.col,
+ locus->end.col);
+ }
+
+ if (locstr)
+ {
if (errcode)
- logmsg (err ? LOG_ERR : LOG_WARNING, "%s:%lu: %s: %s",
- locus->file, (unsigned long)locus->line, msg,
- strerror (errcode));
+ logmsg (err ? LOG_ERR : LOG_WARNING, "%s: %s: %s",
+ locstr, msg, strerror (errcode));
else
- logmsg (err ? LOG_ERR : LOG_WARNING, "%s:%lu: %s",
- locus->file, (unsigned long)locus->line, msg);
+ logmsg (err ? LOG_ERR : LOG_WARNING, "%s: %s",
+ locstr, msg);
+ free (locstr);
}
else
{
diff --git a/src/inetd.c b/src/inetd.c
index 012266a..1d7798d 100644
--- a/src/inetd.c
+++ b/src/inetd.c
@@ -1,5 +1,5 @@
/* This file is part of GNU Pies.
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 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
@@ -28,11 +28,11 @@
#define IFLD_MIN_COUNT 6 /* Minimum number of fields in entry */
-/* FIXME: Duplicated in grex-lex.l */
+/* FIXME: Copied from grecs/src/tree.c */
static void
-listel_dispose(const void *el)
+listel_dispose(void *el)
{
- free((void*)el);
+ free(el);
}
#define TCPMUX_PREFIX_STR "tcpmux/"
@@ -281,13 +281,9 @@ inetd_conf_file (const char *file)
comp->privs.user = xstrdup (user); /* FIXME: memory leak */
if (group)
{
- comp->privs.groups =
- gl_list_create_empty (&gl_linked_list_implementation,
- NULL,
- NULL,
- listel_dispose,
- true);
- gl_list_add_last (comp->privs.groups, xstrdup (group));
+ comp->privs.groups = grecs_list_create ();
+ comp->privs.groups->free_entry = listel_dispose;
+ grecs_list_append (comp->privs.groups, xstrdup (group));
}
comp->program = xstrdup (ws.ws_wordv[IFLD_SERVER_PATH]);
diff --git a/src/meta1gram.y b/src/meta1gram.y
index 6256448..deaf382 100644
--- a/src/meta1gram.y
+++ b/src/meta1gram.y
@@ -1,6 +1,6 @@
%{
/* MeTA1 configuration parser for GNU Pies.
- Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2008, 2009, 2010, 2011 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
@@ -20,8 +20,10 @@
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")
@@ -51,7 +53,7 @@ meta1_stmt_create (enum meta1_stmt_type type, const char *ident)
p->next = NULL;
p->type = type;
p->ident = ident;
- p->locus = meta1_locus;
+ p->locus = meta1lloc;
return p;
}
@@ -84,9 +86,12 @@ reverse (struct meta1_stmt *in)
static void meta1_translate (struct meta1_stmt *);
%}
+%error-verbose
+%locations
+
%union {
char *string;
- gl_list_t list;
+ struct grecs_list *list;
grecs_value_t *value;
struct meta1_stmt *stmt;
}
@@ -168,29 +173,25 @@ value : string
string : META1_IDENT
| slist
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator ($1);
-
+ struct grecs_list_entry *ep;
meta1_line_begin ();
- while (gl_list_iterator_next (&itr, &p, NULL))
- meta1_line_add (p, strlen (p));
- gl_list_iterator_free (&itr);
+ 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
{
- $$ = gl_list_create_empty (&gl_linked_list_implementation,
- NULL,
- NULL,
- NULL,
- true);
- gl_list_add_last ($$, $1);
+ $$ = grecs_list_create ();
+ grecs_list_append ($$, $1);
}
| slist META1_STRING
{
- gl_list_add_last ($1, $2);
+ grecs_list_append ($1, $2);
$$ = $1;
}
;
@@ -207,16 +208,12 @@ list : '{' values '}'
values : value
{
- $$ = gl_list_create_empty (&gl_linked_list_implementation,
- NULL,
- NULL,
- NULL,
- true);
- gl_list_add_last ($$, $1);
+ $$ = grecs_list_create ();
+ grecs_list_append ($$, $1);
}
| values ',' value
{
- gl_list_add_last ($1, $3);
+ grecs_list_append ($1, $3);
$$ = $1;
}
;
@@ -229,7 +226,7 @@ opt_sc : /* empty */
int
yyerror (char *s)
{
- meta1_parse_error ("%s", s);
+ grecs_error (&yylloc, 0, "%s", s);
return 0;
}
diff --git a/src/meta1lex.h b/src/meta1lex.h
index 0f7c75d..213fb40 100644
--- a/src/meta1lex.h
+++ b/src/meta1lex.h
@@ -1,5 +1,5 @@
/* This file is part of GNU Pies.
- Copyright (C) 2009, 2010, 2009 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 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
@@ -14,7 +14,6 @@
You should have received a copy of the GNU General Public License
along with GNU Pies. If not, see <http://www.gnu.org/licenses/>. */
-extern grecs_locus_t meta1_locus;
extern size_t meta1_error_count;
extern char *meta1_queue_dir;
diff --git a/src/meta1lex.l b/src/meta1lex.l
index 4eca9e2..7faaf41 100644
--- a/src/meta1lex.l
+++ b/src/meta1lex.l
@@ -1,7 +1,7 @@
/* MeTA1 configuration lexer for GNU Pies. -*- c -*- */
%top {
/* MeTA1 configuration lexer for GNU Pies.
- Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2008, 2009, 2010, 2011 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
@@ -26,16 +26,27 @@
%{
#include "pies.h"
+#include "grecs-locus.h"
#include "meta1gram.h"
#include "meta1lex.h"
-grecs_locus_t meta1_locus;
-size_t meta1_error_count;
+static struct grecs_locus_point meta1_locus_point;
struct obstack meta1_stk;
int meta1_stk_init;
char *meta1_queue_dir;
-
#define yylval meta1lval
+
+#define YY_USER_ACTION do \
+ { \
+ if (YYSTATE == 0) \
+ { \
+ meta1lloc.beg = meta1_locus_point; \
+ meta1lloc.beg.col++; \
+ } \
+ meta1_locus_point.col += yyleng; \
+ meta1lloc.end = meta1_locus_point; \
+ } \
+ while (0);
%}
%x COMMENT STR
@@ -45,10 +56,10 @@ X [0-9a-fA-F]
"/*" BEGIN (COMMENT);
<COMMENT>[^*\n]* /* eat anything that's not a '*' */
<COMMENT>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
-<COMMENT>\n ++meta1_locus.line;
+<COMMENT>\n grecs_locus_point_advance_line(meta1_locus_point);
<COMMENT>"*"+"/" BEGIN (INITIAL);
/* End-of-line comments */
-#.*\n { meta1_locus.line++; }
+#.*\n grecs_locus_point_advance_line(meta1_locus_point);
#.* /* end-of-file comment */;
/* Number */
0[xX]{X}+ |
@@ -82,18 +93,18 @@ X [0-9a-fA-F]
yylval.string = meta1_line_finish ();
return META1_STRING; }
<STR>[^\\"\n]*\n { BEGIN (INITIAL);
- meta1_parse_error (_("newline in a string"));
+ grecs_error (&meta1lloc, 0, _("newline in a string"));
meta1_line_add (yytext, yyleng - 1);
yylval.string = meta1_line_finish ();
return META1_STRING; }
/* Other tokens */
[ \t\f][ \t\f]* ;
-\n { meta1_locus.line++; }
+\n grecs_locus_point_advance_line(meta1_locus_point);
[,;{}=] return yytext[0];
. { if (isascii (yytext[0]) && isprint (yytext[0]))
- meta1_parse_error (_("stray character %c"), yytext[0]);
+ grecs_error (&meta1lloc, 0, _("stray character %c"), yytext[0]);
else
- meta1_parse_error (_("stray character \\%03o"),
+ grecs_error (&meta1lloc, 0, _("stray character \\%03o"),
(unsigned char) yytext[0]); }
%%
@@ -135,7 +146,7 @@ unescape_to_line (int c)
{
t = unescape_char (c);
if (t == c && t != '\\' && t != '\"')
- meta1_parse_error (_("unknown escape sequence '\\%c'"), c);
+ grecs_error (&meta1lloc, 0, _("unknown escape sequence '\\%c'"), c);
}
obstack_1grow (&meta1_stk, t);
}
@@ -182,20 +193,6 @@ meta1_string (const char *str, size_t len)
}
void
-meta1_parse_error (const char *fmt, ...)
-{
- va_list ap;
-
- logmsg_printf (LOG_ERR, "%s:%lu: ", meta1_locus.file,
- (unsigned long) meta1_locus.line);
- va_start (ap, fmt);
- logmsg_vprintf (LOG_ERR, fmt, ap);
- va_end (ap);
- logmsg_printf (LOG_ERR, "\n");
- meta1_error_count++;
-}
-
-void
meta1_lexer_set_debug ()
{
char *p = getenv ("META1_DEBUG_LEX");
@@ -217,15 +214,17 @@ meta1_config_parse (const char *name)
_("%s: cannot open file: %s"), name, strerror (errno));
return 1;
}
- meta1_locus.file = meta1_string (name, strlen (name));
- meta1_locus.line = 1;
+ meta1_locus_point.file = meta1_string (name, strlen (name));
+ meta1_locus_point.line = 1;
+ meta1_locus_point.col = 0;
meta1_lexer_set_debug ();
meta1_parser_set_debug ();
yyrestart (fp);
+ grecs_error_count = 0;
rc = meta1parse ();
fclose (fp);
- if (meta1_error_count)
+ if (grecs_error_count)
rc = 1;
return rc;
}
diff --git a/src/pies.c b/src/pies.c
index 112bfb6..cc2c26b 100644
--- a/src/pies.c
+++ b/src/pies.c
@@ -1,5 +1,5 @@
/* This file is part of GNU Pies.
- Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2008, 2009, 2010, 2011 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
@@ -26,7 +26,18 @@ int log_facility = LOG_USER;
char *log_tag;
struct pies_privs pies_privs;
int foreground;
-int command;
+
+enum pies_command {
+ COM_START,
+ COM_RESTART,
+ COM_RELOAD,
+ COM_STATUS,
+ COM_STOP,
+ COM_DUMP_PREREQ,
+ COM_DUMP_DEPM