aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am40
-rw-r--r--NEWS8
-rw-r--r--bootstrap.conf9
-rw-r--r--configure.ac9
-rw-r--r--gnulib.modules3
m---------grecs0
-rw-r--r--lib/libpies.h6
-rw-r--r--src/.gitignore1
-rw-r--r--src/Makefile.am17
-rw-r--r--src/acl.c198
-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.y43
-rw-r--r--src/meta1lex.h3
-rw-r--r--src/meta1lex.l55
-rw-r--r--src/pies.c319
-rw-r--r--src/pies.h12
-rw-r--r--src/progman.c76
-rw-r--r--src/userprivs.c49
21 files changed, 545 insertions, 558 deletions
diff --git a/Makefile.am b/Makefile.am
index b3c49a2..de4bf81 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,3 +1,3 @@
# This file is part of GNU Pies.
-# Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+# Copyright (C) 2008, 2009, 2010, 2011 Sergey Poznyakoff
#
@@ -36,9 +36,6 @@ alphacheck:
-# Define the following variables in order to use the ChangeLog rule below:
-# prev_change_log [optional] Name of the previous ChangeLog file.
-# gen_start_date [optional] Start ChangeLog from this date.
-# changelog_dir [mandatory] Directory where to create ChangeLog
+# Name of the previous ChangeLog file.
prev_change_log = ChangeLog.mfd
+# Start Git ChangeLog from this date.
gen_start_date = 2009-09-04
-changelog_dir = .
@@ -46,25 +43,10 @@ changelog_dir = .
ChangeLog:
- @if test -d .git; then \
- cmd=$(top_srcdir)/build-aux/gitlog-to-changelog; \
- if test -n "$(gen_start_date)"; then \
- cmd="$$cmd --since=\"$(gen_start_date)\""; \
- fi; \
- $$cmd --format='%s%n%n%b%n' | \
- sed '/<unknown>$$/d' | fmt -s > $(changelog_dir)/cl-t; \
- if test -n "$(prev_change_log)" && test -f "$(prev_change_log)"; \
- then \
- echo "" >> $(changelog_dir)/cl-t; \
- cat "$(prev_change_log)" | \
- sed '/^Local Variables:/,/^End:/d' >> $(changelog_dir)/cl-t; \
- fi; \
- echo "Local Variables:" >> $(changelog_dir)/cl-t; \
- echo "mode: change-log" >> $(changelog_dir)/cl-t; \
- echo "version-control: never" >> $(changelog_dir)/cl-t; \
- echo "buffer-read-only: t" >> $(changelog_dir)/cl-t; \
- echo "End:" >> $(changelog_dir)/cl-t; \
- echo "" >> $(changelog_dir)/cl-t; \
- sed -n '1,/^[^#]/s/^#//p' $(top_srcdir)/Makefile.am \
- >> $(changelog_dir)/cl-t; \
- rm -f $(changelog_dir)/ChangeLog; \
- mv $(changelog_dir)/cl-t $(changelog_dir)/ChangeLog; \
+ $(AM_V_GEN)if test -d .git; then \
+ git log --pretty='format:%ct %an <%ae>%n%n%s%n%n%b%n' | \
+ awk -f $(top_srcdir)/@GRECS_SUBDIR@/build-aux/git2chg.awk \
+ -vsince=\"$(gen_start_date)\" -vappend=\"$(prev_change_log)\" \
+ > ChangeLog.tmp; \
+ cmp ChangeLog ChangeLog.tmp > /dev/null 2>&1 || \
+ mv ChangeLog.tmp ChangeLog; \
+ rm -f ChangeLog.tmp; \
fi
diff --git a/NEWS b/NEWS
index d4b2392..9bc6609 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,3 @@
-GNU Pies NEWS -- history of user-visible changes. 2009-12-11
-Copyright (C) 2009, 2010 Sergey Poznyakoff
+GNU Pies NEWS -- history of user-visible changes. 2011-10-23
+Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
See the end of file for copying conditions.
@@ -8,2 +8,4 @@ Please send Pies bug reports to <bug-pies@gnu.org> or
+Version 1.2.90 (Git)
+
Version 1.2, 2009-12-11
@@ -74,3 +76,3 @@ Copyright information:
-Copyright (C) 2009 Sergey Poznyakoff
+Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
diff --git a/bootstrap.conf b/bootstrap.conf
index 364978b..492aa78 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -1,3 +1,3 @@
# Bootstrap configuration for GNU Pies. -*- shell-script -*-
-# Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+# Copyright (C) 2008, 2009, 2010, 2011 Sergey Poznyakoff
#
@@ -33,7 +33,8 @@ fi
# gnulib modules used by this package.
-gnulib_modules=`grep -h '^[^#]' gnulib.modules grecs/gnulib.modules | sort | uniq`
+gnulib_modules=`grep -h '^[^#]' gnulib.modules | sort | uniq`
NLS_MARKERS="\
- mu_error:1"
-
+ mu_error:1\
+ grecs_error:3\
+ grecs_warning:3"
diff --git a/configure.ac b/configure.ac
index a8848dd..0c1d2b9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,3 +1,3 @@
# This file is part of GNU Pies. -*- autoconf -*-
-# Copyright (C) 2009, 2010 Sergey Poznyakoff
+# Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
#
@@ -17,3 +17,3 @@
AC_PREREQ([2.63])
-AC_INIT([GNU Pies], [1.2], [bug-pies@gnu.org.ua])
+AC_INIT([GNU Pies], [1.2.90], [bug-pies@gnu.org.ua])
AC_CONFIG_SRCDIR([src/pies.h])
@@ -59,3 +59,4 @@ gl_INIT
# Grecs
-GRECS_SETUP
+GRECS_SETUP([grecs],[tests git2chg getopt])
+GRECS_HOST_PROJECT_INCLUDES='-I$(top_srcdir)/gnu -I$(top_builddir)/gnu'
@@ -87,4 +88,2 @@ AC_CONFIG_FILES([Makefile
gnu/Makefile
- grecs/Makefile
- grecs/src/Makefile
lib/Makefile
diff --git a/gnulib.modules b/gnulib.modules
index d62e1a3..1e01a93 100644
--- a/gnulib.modules
+++ b/gnulib.modules
@@ -3,8 +3,7 @@
-argp
c-ctype
c-strcase
+configmake
fprintftime
gettext
-gitlog-to-changelog
inttostr
diff --git a/grecs b/grecs
-Subproject edcc575bcdc9e50bdb79f422ad0f11dc79f3eaa
+Subproject a52ab6c6c38e1dca047ada4d60249fb323942f0
diff --git a/lib/libpies.h b/lib/libpies.h
index 04910d5..d071846 100644
--- a/lib/libpies.h
+++ b/lib/libpies.h
@@ -1,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
@@ -21,6 +21,2 @@
-#define _(String) gettext(String)
-#define N_(String) String
-
-
#if defined HAVE_SYSCONF && defined _SC_OPEN_MAX
diff --git a/src/.gitignore b/src/.gitignore
index 18a7111..4ad4290 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -1 +1,2 @@
+cmdline.h
inetd
diff --git a/src/Makefile.am b/src/Makefile.am
index 19c6483..455b2c2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,3 +1,3 @@
# This file is part of GNU Pies.
-# Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+# Copyright (C) 2008, 2009, 2010, 2011 Sergey Poznyakoff
#
@@ -37,2 +37,3 @@ noinst_HEADERS = \
acl.h\
+ cmdline.h\
meta1gram.h\
@@ -43,5 +44,13 @@ 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
@@ -51,3 +60,3 @@ INCLUDES = \
-I$(top_builddir)/gnu\
- -I$(top_srcdir)/grecs/src
+ @GRECS_INCLUDES@
@@ -55,3 +64,3 @@ LDADD = \
../lib/libpies.a\
- ../grecs/src/libgrecs.a\
+ @GRECS_LDADD@\
../gnu/libgnu.a\
diff --git a/src/acl.c b/src/acl.c
index a0ee85e..dc459f5 100644
--- a/src/acl.c
+++ b/src/acl.c
@@ -1,3 +1,3 @@
/* This file is part of GNU Pies
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
@@ -27,3 +27,2 @@
#include <netdb.h>
-#include <hash.h>
@@ -42,4 +41,4 @@ struct acl_entry
pies_acl_t acl;
- gl_list_t groups;
- gl_list_t sockaddrs;
+ struct grecs_list *groups;
+ struct grecs_list *sockaddrs;
};
@@ -50,3 +49,3 @@ struct pies_acl
grecs_locus_t locus;
- gl_list_t list;
+ struct grecs_list *list;
};
@@ -63,7 +62,3 @@ pies_acl_create (const char *name, grecs_locus_t *locus)
acl->locus = *locus;
- acl->list = gl_list_create_empty(&gl_linked_list_implementation,
- NULL,
- NULL,
- NULL,
- false);
+ acl->list = grecs_list_create ();
return acl;
@@ -71,2 +66,10 @@ pies_acl_create (const char *name, grecs_locus_t *locus)
+void
+pies_acl_free (pies_acl_t acl)
+{
+ free (acl->name);
+ grecs_list_free (acl->list);
+ free (acl);
+}
+
static struct pies_sockaddr *
@@ -191,3 +194,3 @@ _parse_sockaddr (struct acl_entry *entry, const grecs_value_t *value)
}
- gl_list_add_last (entry->sockaddrs, sptr);
+ grecs_list_append (entry->sockaddrs, sptr);
return 0;
@@ -196,3 +199,3 @@ _parse_sockaddr (struct acl_entry *entry, const grecs_value_t *value)
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)
{
@@ -200,3 +203,3 @@ _parse_from (struct acl_entry *entry, size_t argc, const grecs_value_t *argv)
return 0;
- else if (argv->type == GRECS_TYPE_LIST)
+ else if (argv[0]->type == GRECS_TYPE_LIST)
{
@@ -205,6 +208,6 @@ _parse_from (struct acl_entry *entry, size_t argc, const grecs_value_t *argv)
}
- 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;
@@ -221,10 +224,6 @@ _parse_from (struct acl_entry *entry, size_t argc, const grecs_value_t *argv)
- 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;
@@ -233,8 +232,7 @@ _parse_from (struct acl_entry *entry, size_t argc, const grecs_value_t *argv)
{
- 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)
@@ -252,3 +250,3 @@ _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)
{
@@ -256,3 +254,3 @@ _parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
return 0;
- if (strcmp (argv->v.string, "acl") == 0)
+ if (strcmp (argv[0]->v.string, "acl") == 0)
{
@@ -267,3 +265,3 @@ _parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
- if (argv->type != GRECS_TYPE_STRING)
+ if (argv[0]->type != GRECS_TYPE_STRING)
{
@@ -274,3 +272,3 @@ _parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
- entry->acl = pies_acl_lookup (argv->v.string);
+ entry->acl = pies_acl_lookup (argv[0]->v.string);
@@ -279,3 +277,3 @@ _parse_sub_acl (struct acl_entry *entry, size_t argc, grecs_value_t *argv)
grecs_error (&entry->locus, 0, _("ACL not defined: `%s'"),
- argv->v.string);
+ argv[0]->v.string);
return 1;
@@ -289,5 +287,5 @@ _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)
{
@@ -301,13 +299,9 @@ _parse_group (struct acl_entry *entry, size_t argc, grecs_value_t * argv)
}
- 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--;
@@ -319,7 +313,7 @@ _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);
@@ -358,3 +352,3 @@ parse_acl_line (grecs_locus_t *locus, int allow, pies_acl_t acl,
}
- gl_list_add_last (acl->list, entry);
+ grecs_list_append (acl->list, entry);
return 0;
@@ -375,3 +369,2 @@ _acl_common_section_parser (enum grecs_callback_command cmd,
pies_acl_t acl;
- grecs_locus_t defn_loc;
const char *tag = NULL;
@@ -414,11 +407,4 @@ _acl_common_section_parser (enum grecs_callback_command cmd,
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"));
+ if (tag && (acl = pies_acl_install (acl)) == NULL)
return 1;
- }
if (pacl)
@@ -572,7 +558,6 @@ _acl_check (struct acl_entry *ent, struct acl_input *input)
{
- 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)
@@ -587,8 +572,8 @@ _acl_check (struct acl_entry *ent, struct acl_input *input)
{
- 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)
@@ -596,3 +581,2 @@ _acl_check (struct acl_entry *ent, struct acl_input *input)
}
- gl_list_iterator_free (&itr);
}
@@ -606,3 +590,3 @@ _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.
@@ -624,8 +608,7 @@ pies_acl_check (pies_acl_t acl, struct acl_input *input, int result)
{
- 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;
}
@@ -637,10 +620,10 @@ pies_acl_check (pies_acl_t acl, struct acl_input *input, int result)
-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);
}
@@ -648,3 +631,3 @@ acl_hasher (void const *data, size_t n_buckets)
/* Compare two strings for equality. */
-static bool
+static int
acl_compare (void const *data1, void const *data2)
@@ -653,23 +636,58 @@ acl_compare (void const *data1, void const *data2)
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,
+ int install = 1;
+
+ if (!acl_table)
+ {
+ acl_table = grecs_symtab_create(sizeof (struct pies_acl),
acl_hasher,
- acl_compare, 0)))
- && (ret = hash_insert (acl_table, acl))))
+ acl_compare,
+ acl_copy,
+ NULL,
+ acl_free_entry);
+ if (!acl_table)
xalloc_die ();
+ }
+
+ ret = grecs_symtab_lookup_or_install (acl_table, acl, &install);
- if (ret != acl)
+ if (!ret)
{
- if (locus)
- *locus = ret->locus;
- return 1;
+ logmsg (LOG_ERR, _("cannot install acl: %s"), strerror (errno));
+ exit (1);
}
- return 0;
+
+ 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;
}
@@ -683,3 +701,3 @@ pies_acl_lookup (const char *name)
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,3 +1,3 @@
/* This file is part of GNU Pies
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
@@ -32,3 +32,3 @@ int parse_acl_line (grecs_locus_t *locus, int allow, pies_acl_t acl,
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);
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,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
@@ -127,11 +127,39 @@ 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);
}
diff --git a/src/inetd.c b/src/inetd.c
index 012266a..1d7798d 100644
--- a/src/inetd.c
+++ b/src/inetd.c
@@ -1,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
@@ -30,7 +30,7 @@
-/* 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);
}
@@ -283,9 +283,5 @@ inetd_conf_file (const char *file)
{
- 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));
}
diff --git a/src/meta1gram.y b/src/meta1gram.y
index 6256448..deaf382 100644
--- a/src/meta1gram.y
+++ b/src/meta1gram.y
@@ -2,3 +2,3 @@
/* MeTA1 configuration parser for GNU Pies.
- Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2008, 2009, 2010, 2011 Sergey Poznyakoff
@@ -22,3 +22,5 @@
#include "pies.h"
+#include "grecs-locus.h"
#include "meta1lex.h"
+#include "meta1gram.h"
@@ -53,3 +55,3 @@ meta1_stmt_create (enum meta1_stmt_type type, const char *ident)
p->ident = ident;
- p->locus = meta1_locus;
+ p->locus = meta1lloc;
return p;
@@ -86,5 +88,8 @@ 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;
@@ -170,9 +175,9 @@ string : META1_IDENT
{
- 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))
+ for (ep = $1->head; ep; ep = ep->next)
+ {
+ const char *p = ep->data;
meta1_line_add (p, strlen (p));
- gl_list_iterator_free (&itr);
+ }
$$ = meta1_line_finish ();
@@ -183,8 +188,4 @@ 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);
}
@@ -192,3 +193,3 @@ slist : META1_STRING
{
- gl_list_add_last ($1, $2);
+ grecs_list_append ($1, $2);
$$ = $1;
@@ -209,8 +210,4 @@ 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);
}
@@ -218,3 +215,3 @@ values : value
{
- gl_list_add_last ($1, $3);
+ grecs_list_append ($1, $3);
$$ = $1;
@@ -231,3 +228,3 @@ 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,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2009, 2010, 2009 Sergey Poznyakoff
+ Copyright (C) 2009, 2010, 2011 Sergey Poznyakoff
@@ -16,3 +16,2 @@
-extern grecs_locus_t meta1_locus;
extern size_t meta1_error_count;
diff --git a/src/meta1lex.l b/src/meta1lex.l
index 4eca9e2..7faaf41 100644
--- a/src/meta1lex.l
+++ b/src/meta1lex.l
@@ -3,3 +3,3 @@
/* MeTA1 configuration lexer for GNU Pies.
- Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2008, 2009, 2010, 2011 Sergey Poznyakoff
@@ -28,2 +28,3 @@
#include "pies.h"
+#include "grecs-locus.h"
#include "meta1gram.h"
@@ -31,4 +32,3 @@
-grecs_locus_t meta1_locus;
-size_t meta1_error_count;
+static struct grecs_locus_point meta1_locus_point;
struct obstack meta1_stk;
@@ -36,4 +36,15 @@ 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);
%}
@@ -47,6 +58,6 @@ X [0-9a-fA-F]
<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 */;
@@ -84,3 +95,3 @@ X [0-9a-fA-F]
<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);
@@ -90,8 +101,8 @@ X [0-9a-fA-F]
[ \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]); }
@@ -137,3 +148,3 @@ unescape_to_line (int c)
if (t == c && t != '\\' && t != '\"')
- meta1_parse_error (_("unknown escape sequence '\\%c'"), c);
+ grecs_error (&meta1lloc, 0, _("unknown escape sequence '\\%c'"), c);
}
@@ -184,16 +195,2 @@ 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 ()
@@ -219,4 +216,5 @@ meta1_config_parse (const char *name)
}
- 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 ();
@@ -225,5 +223,6 @@ meta1_config_parse (const char *name)
yyrestart (fp);
+ grecs_error_count = 0;
rc = meta1parse ();
fclose (fp);
- if (meta1_error_count)
+ if (grecs_error_count)
rc = 1;
diff --git a/src/pies.c b/src/pies.c
index 112bfb6..cc2c26b 100644
--- a/src/pies.c
+++ b/src/pies.c
@@ -1,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2008, 2009, 2010, 2011 Sergey Poznyakoff
@@ -28,3 +28,14 @@ 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_DEPMAP
+};
+
+enum pies_command command;
char *statedir = DEFAULT_STATE_DIR;
@@ -147,5 +158,2 @@ stderr_closed_p ()
-#define GRECS_VALUE_IS_EMPTY(val) \
- (!(val) || ((val)->type == GRECS_TYPE_STRING && !(val)->v.string))
-
int
@@ -154,3 +162,3 @@ assert_grecs_value_type (grecs_locus_t *locus,
{
- if (GRECS_VALUE_IS_EMPTY (value))
+ if (GRECS_VALUE_EMPTY_P (value))
{
@@ -414,5 +422,5 @@ _get_array_arg (grecs_value_t *val, int num, grecs_locus_t *locus)
{
- if (assert_grecs_value_type (locus, &val->v.arg.v[num],
+ if (assert_grecs_value_type (locus, val->v.arg.v[num],
GRECS_TYPE_STRING) == 0)
- return val->v.arg.v[num].v.string;
+ return val->v.arg.v[num]->v.string;
}
@@ -424,3 +432,3 @@ _get_list_arg (grecs_value_t *val, int num, grecs_locus_t *locus)
{
- grecs_value_t *elt = (grecs_value_t *) gl_list_get_at (val->v.list, num);
+ grecs_value_t *elt = (grecs_value_t *) grecs_list_index (val->v.list, num);
if (!elt)
@@ -447,3 +455,3 @@ return_code_section_parser (enum grecs_callback_command cmd,
case grecs_callback_section_begin:
- if (GRECS_VALUE_IS_EMPTY (value))
+ if (GRECS_VALUE_EMPTY_P (value))
{
@@ -465,3 +473,3 @@ return_code_section_parser (enum grecs_callback_command cmd,
case GRECS_TYPE_LIST:
- count = gl_list_size (value->v.list);
+ count = grecs_list_size (value->v.list);
act = create_action (comp, locus, value, count, _get_list_arg);
@@ -499,5 +507,5 @@ config_array_to_argv (grecs_value_t *val, grecs_locus_t *locus, size_t *pargc)
{
- if (assert_grecs_value_type (locus, &val->v.arg.v[i], GRECS_TYPE_STRING)
+ if (assert_grecs_value_type (locus, val->v.arg.v[i], GRECS_TYPE_STRING)
== 0)
- argv[j++] = xstrdup (val->v.arg.v[i].v.string);
+ argv[j++] = xstrdup (val->v.arg.v[i]->v.string);
}
@@ -704,8 +712,8 @@ _cb_redir (enum grecs_callback_command cmd,
case GRECS_TYPE_ARRAY:
- if (assert_grecs_value_type (locus, &value->v.arg.v[0],
+ if (assert_grecs_value_type (locus, value->v.arg.v[0],
GRECS_TYPE_STRING))
return 0;
- if (strtotok (redirtab, value->v.arg.v[0].v.string, &res))
+ if (strtotok (redirtab, value->v.arg.v[0]->v.string, &res))
grecs_error (locus, 0, _("%s: unrecognised redirector type"),
- value->v.arg.v[0].v.string);
+ value->v.arg.v[0]->v.string);
else
@@ -719,3 +727,3 @@ _cb_redir (enum grecs_callback_command cmd,
}
- if (assert_grecs_value_type (locus, &value->v.arg.v[1],
+ if (assert_grecs_value_type (locus, value->v.arg.v[1],
GRECS_TYPE_STRING))
@@ -729,3 +737,3 @@ _cb_redir (enum grecs_callback_command cmd,
case redir_syslog:
- if (string_to_syslog_priority (value->v.arg.v[1].v.string,
+ if (string_to_syslog_priority (value->v.arg.v[1]->v.string,
&rp->v.prio))
@@ -734,3 +742,3 @@ _cb_redir (enum grecs_callback_command cmd,
_("unknown syslog priority `%s'"),
- value->v.arg.v[1].v.string);
+ value->v.arg.v[1]->v.string);
return 0;
@@ -740,3 +748,3 @@ _cb_redir (enum grecs_callback_command cmd,
case redir_file:
- rp->v.file = xstrdup (value->v.arg.v[1].v.string);
+ rp->v.file = xstrdup (value->v.arg.v[1]->v.string);
break;
@@ -912,8 +920,7 @@ _cb_flags (enum grecs_callback_command cmd,
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator (value->v.list);
+ struct grecs_list_entry *ep;
- while (gl_list_iterator_next (&itr, &p, NULL))
+ for (ep = value->v.list->head; ep; ep = ep->next)
{
- const grecs_value_t *vp = p;
+ const grecs_value_t *vp = ep->data;
if (assert_grecs_value_type (locus, vp, GRECS_TYPE_STRING))
@@ -1562,3 +1569,2 @@ config_init ()
{
- grecs_set_keywords (pies_keywords);
grecs_include_path_setup (DEFAULT_VERSION_INCLUDE_DIR,
@@ -1581,214 +1587,9 @@ config_help ()
"For more information, use `info pies configuration'.");
- grecs_format_docstring (stdout, docstring, 0);
- grecs_format_statement_array (stdout, pies_keywords, 1, 0);
+ grecs_print_docstring (docstring, 0, stdout);
+ grecs_print_statement_array (pies_keywords, 1, 0, stdout);
}
-
-const char *program_version = "pies (" PACKAGE_STRING ")";
-const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
-static char doc[] = N_("pies -- process invocation and execution supervisor");
-static char args_doc[] = "";
-
-enum
-{
- OPT_FOREGROUND = 256,
- OPT_SYNTAX,
- OPT_SYSLOG,
- OPT_STDERR,
- OPT_DUMP_PREREQ,
- OPT_DUMP_DEPMAP,
- OPT_FORCE,
- OPT_CONFIG_HELP,
- OPT_SOURCE_INFO,
- OPT_RATE,
- OPT_INSTANCE
-};
-
-#define OPT_RESTART 'R'
-#define OPT_RELOAD 'r'
-#define OPT_STATUS 's'
-#define OPT_STOP 'S'
-
-static struct argp_option options[] = {
-#define GRP 0
- {NULL, 0, NULL, 0, N_("Operation Mode"), GRP},
- {"foreground", OPT_FOREGROUND, 0, 0, N_("remain in foreground"), GRP + 1},
- {"stderr", OPT_STDERR, NULL, 0, N_("log to stderr"),},
- {"syslog", OPT_SYSLOG, NULL, 0, N_("log to syslog"),},
- {"force", OPT_FORCE, NULL, 0,
- N_("force startup even if another instance may be running"), GRP + 1},
- {"lint", 't', NULL, 0,
- N_("parse configuration file and exit"), GRP + 1},
- {NULL, 'E', NULL, 0,
- N_("preprocess config and exit"), GRP + 1},
- {"inetd", 'i', NULL, 0,
- N_("run in inetd mode"), GRP + 1},
- {"config-file", 'c', N_("FILE"), 0,
- N_("use FILE instead of the default configuration"), GRP + 1},
- {"config-help", OPT_CONFIG_HELP, NULL, 0,
- N_("show configuration file summary"), GRP + 1},
- {"syntax", OPT_SYNTAX, "{pies|inetd|meta1}", 0,
- N_("expect configuration files in the given syntax"), GRP+1 },
- {"rate", OPT_RATE, N_("NUMBER"), 0,
- N_("set default maximum rate for inetd-style components"),
- GRP + 1},
- {"instance", OPT_INSTANCE, N_("NAME"), 0,
- N_("set instance name"),
- GRP + 1},
-#undef GRP
-
-#define GRP 5
- {NULL, 0, NULL, 0, N_("Preprocessor"), GRP},
- {"define", 'D', N_("NAME[=VALUE]"), 0,
- N_("define a preprocessor symbol NAME as having VALUE, or empty"), GRP+1 },
- {"undefine", 'U', N_("NAME"), 0,
- N_("undefine a preprocessor symbol NAME"), GRP+1 },
-#undef GRP
-
-#define GRP 10
- {NULL, 0, NULL, 0, N_("Component Management"), GRP},
- {"restart-component", OPT_RESTART, NULL, 0,
- N_("restart components named in the command line"), GRP + 1},
- {"reload", OPT_RELOAD, NULL, 0,
- N_("reload the running instance of pies "), GRP + 1},
- {"hup", 0, NULL, OPTION_ALIAS},
- {"status", OPT_STATUS, NULL, 0,
- N_("display info about the running instance "), GRP + 1},
- {"stop", OPT_STOP, NULL, 0,
- N_("stop the running instance "), GRP + 1},
-#undef GRP
-
-#define GRP 20
- {NULL, 0, NULL, 0, N_("Debugging and Additional Diagnostics"), GRP},
- {"debug", 'x', N_("LEVEL"), 0,
- N_("set debug verbosity level"), GRP + 1},
- {"source-info", OPT_SOURCE_INFO, NULL, 0,
- N_("show source info with debugging messages"), GRP + 1},
- {"dump-prereq", OPT_DUMP_PREREQ, NULL, 0,
- N_("dump prerequisite charts"), GRP + 1},
- {"dump-depmap", OPT_DUMP_DEPMAP, NULL, 0,
- N_("dump dependency map"), GRP + 1},
-#undef GRP
- {NULL}
-};
-
static enum config_syntax current_syntax = CONF_PIES;
-static error_t
-parse_opt (int key, char *arg, struct argp_state *state)
-{
- char *p;
-
- switch (key)
- {
- case 'c':
- add_config (current_syntax, arg);
- break;
-
- case 'D':
- add_pp_option ("-D", arg);
- break;
-
- case 'U':
- add_pp_option ("-U", arg);
- break;
-
- case 'E':
- preprocess_only = 1;
- break;
-
- case 'i':
- if (!instance)
- instance = "inetd";
- current_syntax = CONF_INETD;
- inetd_mode = 1;
- break;
-
- case 't':
- log_to_stderr_only = 1;
- lint_mode = 1;
- break;
-
- case OPT_CONFIG_HELP:
- config_help ();
- exit (0);
-
- case OPT_FOREGROUND:
- log_to_stderr_only = 1;
- foreground = 1;
- break;
-
- case OPT_INSTANCE:
- instance = arg;
- break;
-
- case OPT_SYNTAX:
- if (str_to_config_syntax (arg, &current_syntax))
- {
- logmsg (LOG_ERR, _("unknown syntax type: %s"), arg);
- exit (EX_USAGE);
- }
- break;
-
- case OPT_RELOAD:
- case OPT_STATUS:
- case OPT_STOP:
- case OPT_RESTART:
- case OPT_DUMP_PREREQ:
- case OPT_DUMP_DEPMAP:
- log_to_stderr_only = 1;
- command = key;
- break;
-
- case OPT_SYSLOG:
- log_to_stderr_only = 0;
- break;
-
- case OPT_STDERR:
- log_to_stderr_only = 1;
- break;
-
- case 'x':
- debug_level = strtoul (arg, NULL, 0);
- break;
-
- case OPT_RATE:
- default_max_rate = strtoul (arg, &p, 10);
- if (*p)
- {
- logmsg (LOG_ERR, _("not a number: %s"), arg);
- exit (EX_USAGE);
- }
- break;
-
- case OPT_SOURCE_INFO:
- source_info_option = 1;
- break;
-
- case OPT_FORCE:
- force_option = 1;
- break;
-
- case ARGP_KEY_INIT:
- break;
-
- case ARGP_KEY_FINI:
- break;
-
- default:
- return ARGP_ERR_UNKNOWN;
- }
- return 0;
-}
-
-static struct argp argp = {
- options,
- parse_opt,
- args_doc,
- doc,
- NULL,
- NULL,
- NULL
-};
-
+#include "cmdline.h"
@@ -2158,30 +1959,2 @@ set_mailer_argcv ()
-const char version_etc_copyright[] =
- /* Do *not* mark this string for translation. %s is a copyright
- symbol suitable for this locale */
- "Copyright %s 2009 Sergey Poznyakoff";
-
-
-static void
-version (FILE *stream, struct argp_state *state)
-{
- fprintf (stream, "%s (%s) %s\n", PACKAGE, PACKAGE_NAME, PACKAGE_VERSION);
- /* TRANSLATORS: Translate "(C)" to the copyright symbol
- (C-in-a-circle), if this symbol is available in the user's
- locale. Otherwise, do not translate "(C)"; leave it as-is. */
- fprintf (stream, version_etc_copyright, _("(C)"));
-
- fputs (_("\
-\n\
-License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n\
-This is free software: you are free to change and redistribute it.\n\
-There is NO WARRANTY, to the extent permitted by law.\n\
-\n\
-"),
- stream);
-
- /* TRANSLATORS: %s denotes an author name. */
- fprintf (stream, _("Written by %s.\n"), "Sergey Poznyakoff");
-}
-
static char *
@@ -2250,5 +2023,3 @@ main (int argc, char **argv)
config_init ();
- argp_program_version_hook = version;
- if (argp_parse (&argp, argc, argv, 0, &index, NULL))
- exit (EX_USAGE);
+ parse_options (argc, argv, &index);
@@ -2291,5 +2062,9 @@ main (int argc, char **argv)
case CONF_PIES:
- if (grecs_parse (file->name))
+ {
+ struct grecs_node *tree = grecs_parse (file->name);
+ if (!tree || grecs_tree_process (tree, pies_keywords))
exit (EX_CONFIG);
+ grecs_tree_free (tree);
break;
+ }
@@ -2319,3 +2094,3 @@ main (int argc, char **argv)
- if (argc != index && command != 'R')
+ if (argc != index && command != COM_RESTART)
{
@@ -2328,3 +2103,3 @@ main (int argc, char **argv)
{
- case OPT_RESTART:
+ case COM_RESTART:
pies_priv_setup (&pies_privs);
@@ -2334,12 +2109,12 @@ main (int argc, char **argv)
- case OPT_RELOAD:
+ case COM_RELOAD:
exit (pies_reload ());
- case OPT_STATUS:
+ case COM_STATUS:
exit (pies_status ());
- case OPT_STOP:
+ case COM_STOP:
exit (pies_stop ());
- case OPT_DUMP_PREREQ:
+ case COM_DUMP_PREREQ:
progman_dump_prereq ();
@@ -2347,3 +2122,3 @@ main (int argc, char **argv)
- case OPT_DUMP_DEPMAP:
+ case COM_DUMP_DEPMAP:
progman_dump_depmap ();
diff --git a/src/pies.h b/src/pies.h
index 6be870b..73b0583 100644
--- a/src/pies.h
+++ b/src/pies.h
@@ -1,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2008, 2009, 2010, 2011 Sergey Poznyakoff
@@ -44,3 +44,3 @@
#include <sysexits.h>
-#include <argp.h>
+#include <ctype.h>
@@ -119,3 +119,3 @@ struct pies_privs
int allgroups;
- gl_list_t groups;
+ struct grecs_list *groups;
};
@@ -168,4 +168,4 @@ struct component
char *dir; /* Working directory */
- gl_list_t prereq; /* Prerequisites */
- gl_list_t depend; /* Dependency targets */
+ struct grecs_list *prereq; /* Prerequisites */
+ struct grecs_list *depend; /* Dependency targets */
int flags; /* CF_ bitmask */
@@ -377,3 +377,3 @@ char *sockaddr_to_astr (const struct sockaddr *sa, int salen);
/* userprivs.c */
-int switch_to_privs (uid_t uid, gid_t gid, gl_list_t retain_groups);
+int switch_to_privs (uid_t uid, gid_t gid, struct grecs_list *retain_groups);
diff --git a/src/progman.c b/src/progman.c
index 4420a21..d24ea1a 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -1,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2007, 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2007, 2008, 2009, 2010, 2011 Sergey Poznyakoff
@@ -17,3 +17,2 @@
#include "pies.h"
-#include <hash.h>
@@ -91,3 +90,3 @@ static pies_depmap_t depmap;
static int recompute_alarm;
-static Hash_table *conn_tab;
+static struct grecs_symtab *conn_tab;
@@ -359,6 +358,6 @@ prog_rebuild_prerequisites (struct prog *prog)
{
- depc = gl_list_size (comp->prereq);
+ depc = grecs_list_size (comp->prereq);
if (depc == 1)
{
- const char *item = gl_list_get_at (comp->prereq, 0);
+ const char *item = grecs_list_index (comp->prereq, 0);
if (strcmp (item, "all") == 0)
@@ -372,3 +371,3 @@ prog_rebuild_prerequisites (struct prog *prog)
{
- gl_list_free (comp->prereq);
+ grecs_list_free (comp->prereq);
comp->prereq = NULL;
@@ -394,9 +393,6 @@ prog_rebuild_prerequisites (struct prog *prog)
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator (comp->prereq);
- while (gl_list_iterator_next (&itr, &p, NULL))
- {
- prog->prereq[depc++] = (char*) p;
- }
- gl_list_iterator_free (&itr);
+ struct grecs_list_entry *ep;
+
+ for (ep = comp->prereq->head; ep; ep = ep->next)
+ prog->prereq[depc++] = (char*) ep->data;
}
@@ -523,6 +519,6 @@ open_redirector (struct prog *master, int stream)
-static size_t
-conn_class_hasher (void const *data, size_t n_buckets)
+static unsigned
+conn_class_hasher (void *data, unsigned long n_buckets)
{
- struct conn_class const *pcclass = data;
+ struct conn_class *pcclass = data;
unsigned char const *tag = (unsigned char const *)pcclass->tag;
@@ -544,3 +540,3 @@ conn_class_hasher (void const *data, size_t n_buckets)
/* Compare two strings for equality. */
-static bool
+static int
conn_class_compare (void const *data1, void const *data2)
@@ -550,5 +546,5 @@ conn_class_compare (void const *data1, void const *data2)
- return p1->sa_len == p2->sa_len &&
+ return !(p1->sa_len == p2->sa_len &&
memcmp (&p1->sa_storage, &p2->sa_storage, p1->sa_len) == 0 &&
- strcmp (p1->tag, p2->tag) == 0;
+ strcmp (p1->tag, p2->tag) == 0);
}
@@ -561,2 +557,10 @@ conn_class_free (void *data)
+static int
+conn_class_copy(void *a, void *b)
+{
+ memcpy(a, b, sizeof(struct conn_class));
+ memset(a, 0, sizeof(struct conn_class));
+ return 0;
+}
+
static struct conn_class *
@@ -566,2 +570,3 @@ conn_class_lookup (const char *tag,
{
+ int install = 1;
struct conn_class *probe, *ret;
@@ -588,12 +593,15 @@ conn_class_lookup (const char *tag,
probe->count = 0;
-
- if (!((conn_tab
- || (conn_tab = hash_initialize (0, 0,
+ if (!conn_tab)
+ {
+ conn_tab = grecs_symtab_create(sizeof (struct conn_class),
conn_class_hasher,
conn_class_compare,
- conn_class_free)))
- && (ret = hash_insert (conn_tab, probe))))
+ conn_class_copy,
+ NULL,
+ conn_class_free);
+ if (!conn_tab)
xalloc_die ();
+ }
- if (probe != ret)
+ ret = grecs_symtab_lookup_or_install (conn_tab, probe, &install);
free (probe);
@@ -1413,4 +1421,3 @@ component_fixup_depend (struct component *comp)
{
- const void *p;
- gl_list_iterator_t itr;
+ struct grecs_list_entry *ep;
@@ -1419,6 +1426,5 @@ component_fixup_depend (struct component *comp)
- itr = gl_list_iterator (comp->depend);
- while (gl_list_iterator_next (&itr, &p, NULL))
+ for (ep = comp->depend->head; ep; ep = ep->next)
{
- const char *tag = p;
+ const char *tag = ep->data;
struct component *tgt;
@@ -1436,12 +1442,8 @@ component_fixup_depend (struct component *comp)
{
- tgt->prereq = gl_list_create_empty(&gl_linked_list_implementation,
- NULL,
- NULL,
- NULL,
- false);
+ tgt->prereq = grecs_list_create();
}
/* FIXME: memory allocation */
- gl_list_add_last (tgt->prereq, xstrdup (comp->tag));
+ grecs_list_append (tgt->prereq, xstrdup (comp->tag));
}
- gl_list_free (comp->depend);
+ grecs_list_free (comp->depend);
comp->depend = NULL;
diff --git a/src/userprivs.c b/src/userprivs.c
index b224a00..3270905 100644
--- a/src/userprivs.c
+++ b/src/userprivs.c
@@ -1,3 +1,3 @@
/* This file is part of GNU Pies.
- Copyright (C) 2007, 2008, 2009, 2010 Sergey Poznyakoff
+ Copyright (C) 2007, 2008, 2009, 2010, 2011 Sergey Poznyakoff
@@ -40,4 +40,4 @@ str_dispose (const void *elt)
-gl_list_t
-get_user_groups (gl_list_t init_list, const char *user)
+struct grecs_list *
+get_user_groups (struct grecs_list *init_list, const char *user)
{
@@ -45,9 +45,5 @@ get_user_groups (gl_list_t init_list, const char *user)
struct group *gr;
- gl_list_t list;
+ struct grecs_list *list;
- list = gl_list_create_empty(&gl_linked_list_implementation,
- str_eq,
- NULL,
- str_dispose,
- false);
+ list = grecs_list_create();
@@ -55,11 +51,8 @@ get_user_groups (gl_list_t init_list, const char *user)
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator (init_list);
- while (gl_list_iterator_next (&itr, &p, NULL))
+ struct grecs_list_entry *ep;
+
+ for (ep = init_list->head; ep; ep = ep->next)
{
- char *s = xstrdup (p);
- if (!gl_list_add_last (list, s))
- free (s);
+ grecs_list_append (list, xstrdup ((char*)ep->data));
}
- gl_list_iterator_free (&itr);
}
@@ -73,5 +66,3 @@ get_user_groups (gl_list_t init_list, const char *user)
{
- char *s = xstrdup (gr->gr_name);
- if (!gl_list_add_last (list, s))
- free (s);
+ grecs_list_append (list, xstrdup (gr->gr_name));
break;
@@ -85,3 +76,3 @@ get_user_groups (gl_list_t init_list, const char *user)
int
-switch_to_privs (uid_t uid, gid_t gid, gl_list_t retain_groups)
+switch_to_privs (uid_t uid, gid_t gid, struct grecs_list *retain_groups)
{
@@ -92,3 +83,3 @@ switch_to_privs (uid_t uid, gid_t gid, gl_list_t retain_groups)
/* Create a list of supplementary groups */
- size = 1 + (retain_groups ? gl_list_size (retain_groups) : 0);
+ size = 1 + (retain_groups ? grecs_list_size (retain_groups) : 0);
emptygidset = xcalloc (size, sizeof emptygidset[0]);
@@ -98,10 +89,11 @@ switch_to_privs (uid_t uid, gid_t gid, gl_list_t retain_groups)
{
- const void *p;
- gl_list_iterator_t itr = gl_list_iterator (retain_groups);
- while (gl_list_iterator_next (&itr, &p, NULL))
+ struct grecs_list_entry *ep;
+
+ for (ep = retain_groups->head; ep; ep = ep->next)
{
- struct group *group = getgrnam ((const char*)p);
+ const char *grname = ep->data;
+ struct group *group = getgrnam (grname);
if (!group)
{
- logmsg (LOG_ERR, _("unknown group: %s"), (const char*)p);
+ logmsg (LOG_ERR, _("unknown group: %s"), grname);
free (emptygidset);
@@ -111,3 +103,2 @@ switch_to_privs (uid_t uid, gid_t gid, gl_list_t retain_groups)
}
- gl_list_iterator_free (&itr);
}
@@ -211,3 +202,3 @@ pies_priv_setup (struct pies_privs *privs)
struct passwd *pw;
- gl_list_t grplist = 0;
+ struct grecs_list *grplist = 0;
@@ -229,3 +220,3 @@ pies_priv_setup (struct pies_privs *privs)
if (grplist)
- gl_list_free (grplist);
+ grecs_list_free (grplist);
}

Return to:

Send suggestions and report system problems to the System administrator.