diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-01-28 22:07:31 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-01-28 22:07:31 +0000 |
commit | df4a2a61ce0cde5190def22309e9807cb5a56ab0 (patch) | |
tree | 364eb6562f6bd41eb3fe0ca15e497a2a76a4b57c | |
parent | 5f392fc3cf8e94112ed7b15b2038e51f1b2b3800 (diff) | |
download | gsc-df4a2a61ce0cde5190def22309e9807cb5a56ab0.tar.gz gsc-df4a2a61ce0cde5190def22309e9807cb5a56ab0.tar.bz2 |
Remove jabberd
git-svn-id: file:///svnroot/gsc/trunk@339 d2de0444-eb31-0410-8365-af798a554d48
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | doc/gsc.texi | 449 | ||||
-rw-r--r-- | jabberd/Makefile.am | 22 | ||||
-rw-r--r-- | jabberd/jabberd.h | 62 | ||||
-rw-r--r-- | jabberd/main.c | 910 | ||||
-rw-r--r-- | jabberd/progman.c | 647 | ||||
-rw-r--r-- | mc/trurl.mc | 15 |
9 files changed, 15 insertions, 2102 deletions
@@ -1,2 +1,8 @@ +2010-01-29 Sergey Poznyakoff <gray@gnu.org.ua> + + * jabberd: Removed. Use GNU pies instead. + * Makefile.am, configure.ac: Update. + * doc/gsc.texi: Update. + 2009-08-03 Sergey Poznyakoff <gray@gnu.org.ua> diff --git a/Makefile.am b/Makefile.am index 6215e1f..fcba8a0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -35,4 +35,3 @@ SUBDIRS=\ mc\ ppp\ - rc.d\ - jabberd + rc.d diff --git a/configure.ac b/configure.ac index 97a928d..d9dabeb 100644 --- a/configure.ac +++ b/configure.ac @@ -117,6 +117,5 @@ maint mc ppp -rc.d -jabberd' +rc.d' AC_ARG_VAR([XMODLIST], diff --git a/doc/gsc.texi b/doc/gsc.texi index 29e5e1b..87e1ce5 100644 --- a/doc/gsc.texi +++ b/doc/gsc.texi @@ -120,5 +120,4 @@ Root Utilities * firewall:: M4 Wrappers For Setting Firewalls. * session-cleanup:: Manage PHP Sessions. -* jabberd:: Jabberd dispatcher daemon. firewall @@ -126,15 +125,4 @@ firewall * Primitives:: A set of primitives defined in @file{firewall.m4} -Jabberd - -* jabintro:: Jabberd Operation Overview -* jabopts:: Command Line Options. -* jabberd.cfg:: Main Jabberd Configuration File. - -Jabberd Configuration File - -* cfgstat:: Configuration File Statements -* example:: An Example of the Configuration file - Startup Scripts @@ -842,5 +830,4 @@ cases, though not always. Such files should probably be inspected after * firewall:: M4 Wrappers For Setting Firewalls. * session-cleanup:: Manage PHP Sessions. -* jabberd:: Jabberd dispatcher daemon. @end menu @@ -1168,440 +1155,4 @@ actually remove them. @end table -@node jabberd -@section Jabberd -@cindex jabberd - The @command{jabberd} utility is a dispatcher daemon for -@samp{Jabberd 2.x} -(@uref{http://www.jabber.org/software/jabberd2x.shtml}). It is -intended as a replacement for the similar utility shipped with the -@samp{jabberd 2.x} package. There were two reasons that urged for the -replacement: first, the original @command{jabberd} is written in Perl -and consumes way too many resources because of that. Secondly, it is -not flexible enough. In particular, it is only able to control jabber -daemons, but cannot control external transports (such as @acronym{GG} -or @acronym{GIT}. - -@menu -* jabintro:: Jabberd Operation Overview -* jabopts:: Command Line Options. -* jabberd.cfg:: Main Jabberd Configuration File. -@end menu - -@node jabintro -@subsection Jabberd Operation Overview - - The @acronym{GSC} @command{jabberd} is a supervisor daemon that -starts a number of @dfn{components} and controls their execution. -A component is either a jabberd core component (as, -e.g. @command{c2s}) or some external program (e.g. a transport). The -daemon reads the list of components from its configuration file upon -startup. By default, the configuration file is named -@file{jabberd.cfg} and is located in @code{$sysconfdir} directory, but -its exact location can be overridden at startup (see @option{-c} -option, below). If run with the root privileges, @command{jabberd} -switches to the privileges of a selected user (by default -@samp{jabber}) right after startup. Then, the program changes file -creation mask to a safe value (the default is @samp{037}). Unless -explicitly requested to remain in the foreground, the utility detaches -itself from the controlling terminal and switches to the background. -The daemon starts the configured components -in the order of their appearance in the configuration file. The exact -command line options and arguments for each component are specified -in the configuration file. If a particular subprocess prints its -diagnostics on stderr or stdout, you may instruct @command{jabberd} to -capture and divert it to a particular @command{syslogd} -priority (@pxref{stdout}). After launching the components -@command{jabberd} enters its main loop. It sleeps until either some -component finishes or a signal is delivered. If a component finishes, -@command{jabberd} scans its internal list to find components that -depend on the finished one. Each such component is then terminated -by sending it @acronym{SIGTERM} signal. Then, the finished component and -its dependent components are started again. If a process is -restarted more than 10 times within a two minutes interval, it is -disabled for the next five minutes (the same way the standard -@acronym{UNIX} @command{init} utility operates). - - The @command{jabberd} utility exits if it recieves any of the -following signals: @acronym{SIGTERM}, @acronym{SIGQUIT}, -@acronym{SIGINT}. It attempts to restart itself if delivered the -@acronym{SIGHUP} signal. This is possible only if the utility is -started using its absolute file name. In any case, before exiting, -the utility shuts down all components @emph{in the reverse -order} of their appearance in the configuration file. The processes -are shut down by sending them @acronym{SIGTERM} signals. If a -component does not exit within a 1 second interval, it is re-sent the -same signal. This procedure continues until either all components -terminate or the @dfn{shutdown timeout} interval expires, whichever -happens first. If the latter happens, any components still left -running are slayed using @acronym{SIGKILL} signal. The default -shutdown timeout is 5 seconds and it may be changed using -@code{shutdown-timeout} configuration file statement (@pxref{cfgstat}). - - Two signals are special to @command{jabberd}: @acronym{SIGUSR1} -and @acronym{SIGUSR2}. The @acronym{SIGUSR1} signal instructs the -program to shut down and restart a particular component or a set -of components. The list of components to be restarted is passed to -the running program via a @dfn{control file} (@pxref{ctlfile}). This -mechanism is used by @command{jabberd ---restart}. @FIXME-xref{restarting selected components}. - - The @acronym{SIGUSR2} signal instructs @command{jabberd} to return -statistics about running components. It is used by @command{jabberd ---status} (@FIXME-pxref{showing runtime statistics}). - -@node jabopts -@subsection Jabberd Invocation -@UNREVISED{} - - By default, @command{jabberd} attempts to start in @dfn{dispatcher -mode}, which is described in the previous subsection. If started -without additional options, the program will use compiled-in defaults. -Otherwise, the following options may be given: - -@table @option -@item --config-file=@var{file} -@itemx -c @var{file} - Use @var{file} as the main configuration file. - -@item --debug -@itemx -D - Increase debugging level. - -@item --foreground -@itemx -f - Do not disconnect from the controlling terminal, but run in -foreground mode instead. This option is mainly useful for debugging. -It implies @option{-e} (see below). - -@item --force - Attempt to start up even if another instance of @command{jabberd} -seems to be running. - -@item --stderr -@itemx -e - Print all diagnostics on the standard output. -@end table - - A set of options may be used to control the running instance of the -program and request a detailed information about it. - -@table @option -@item --restart @var{tag} [@var{tags}...] -@itemx -r @var{tag} [@var{tag}...] - Restart named components. Any number of arguments can be -specified. Each @var{tag} must correspond to a valid tag in -@file{jabberd.cfg} file. - -@item --status - Display information about the running instance. Return 0 if the -instance is running, 1 otherwise. - -@smallexample -$ jabberd --status -jabberd: [INFO] jabberd is running; PID 537 -retranslator jit/stderr 548 -retranslator jit/stdout 547 -retranslator ggtrans/stderr 545 -retranslator ggtrans/stdout 544 -core router 539 router -c /usr/local/etc/jabberd/router.xml -core resolver 540 resolver -c /usr/local/etc/jabberd/resolver.xml -core sm 541 sm -c /usr/local/etc/jabberd/sm.xml -core s2s 542 s2s -c /usr/local/etc/jabberd/s2s.xml -core c2s 543 c2s -c /usr/local/etc/jabberd/c2s.xml -transport ggtrans 546 /usr/local/sbin/jggtrans -f -transport jit 549 /usr/local/bin/jabberd-jit -c /usr/local/etc/jit.xml -@end smallexample - -@item --stop - Stop the running instance by sending it the @acronym{SIGTERM} signal. - -@item --reload -@item --hup - Restart the running instance by sending it the @acronym{SIGHUP} signal. -@end table - - The following are informational options: - -@table @option -@item --help -@itemx -h - Display a terse usage summary. - -@item --version -@itemx -v - Print program version and licensing information and exit. -@end table - -@node jabberd.cfg -@subsection Jabberd Configuration File - - The configuration file has a line-oriented syntax. Empty lines are -ignored. Comments are introduced by a pound sign (@samp{#}), -everything starting from the first occurrence of @samp{#} up to the -end of line is ignored. - - Configuration statements consist of @dfn{command word} and one or -several @dfn{arguments}, separated by any amount of whitespace. There -are @samp{simple} and @samp{compound} configuration statements. -Simple statements occupy a single line. Compound statements begin -with a simple statement, occupy several lines, and end with @code{end} -statement, appearing on a line by itself. Compound statements in turn -contain another simple statements. - - The simplest working @file{jabberd.cfg} file is: - -@smallexample -prog router /usr/local/etc/jabberd/router.xml -prog resolver /usr/local/etc/jabberd/resolver.xml -prog sm /usr/local/etc/jabberd/sm.xml -prog s2s /usr/local/etc/jabberd/s2s.xml -prog c2s /usr/local/etc/jabberd/c2s.xml -@end smallexample - - This file instructs @command{jabberd} to launch five basic jabber -components and supply the given configuration files to them. The -@code{prog} statement is a simple statement taking one to two -arguments. The first one names the program to lauch, and an optional -second one specifies its configuration file. All the programs will be -launched in the order of their appearance in the @file{jabberd.cfg} -file, and will be shut down in the reverse order. The @code{prog} -statement is designed expressly to start jabber core programs, it -should not be used to start third-party programs. - - To start third-party programs, e.g. transports, use @code{transport} -statement. It is a compound statement that has the following -structure: - -@smallexample -transport @var{tag} - command @var{command-line} - depend @var{modlist} - stdout @var{prio} - stderr @var{prio} -end -@end smallexample - - The sub-statement @code{command} specifies the full command line of -the program. Notice that most transports behave as daemons. If it is -so, you will have to use a special command line option requiring the -transport to remain in the foreground (see the transport documentation -to find this option). If the program prints its diagnostics on the -standard error, the @code{stderr} statement can be used to capture and -redirect it to the syslog. For example, @code{stderr debug}, -instructs @command{jabberd} to divert the program's standard error to -the syslog, using priority @samp{debug}. In this case the log entries -will be prefixed with @var{tag}, or, if it is absent, with the first -word of @var{command-line}. - - For example, the @acronym{GG} transport can be started using the -following statement: - -@smallexample -transport ggtrans - command /usr/local/sbin/jggtrans -f - depend all - stdout notice - stderr notice -end -@end smallexample - - - Several configuration statemenst control various aspects of the -behavior of the @command{jabberd}. For example, @code{user} statement -instructs it to switch to privileges of the named user after startup. -By default the utility will switch to the privileges of the user -@samp{jabberd}, this statement can be used to change that, for -example: - -@smallexample -user nobody -@end smallexample - - When switching to user privileges, @command{jabberd} retains only -the main user group, as specified in @file{/etc/passwd} file and drops -all supplementary groups the user might be a member of. To retain the -privileges of a supplementary group, name it with @code{group} -statement. This statement can be used several times, to retain -several groups. For example, the following statement switches to the -privileges of user @samp{nobody} and retains two supplementary groups: -@samp{staff} and @samp{ftp}: - -@smallexample -user nobody -group staff -group ftp -@end smallexample - - The following subsubsection describes all configuration file -statements in detail. - -@menu -* cfgstat:: Configuration File Statements -* example:: An Example of the Configuration file -@end menu - -@node cfgstat -@subsubsection Configuration File Statements - -@deffn {Jabber Statement} transport [@var{tag}] -Schedule a third-party program (e.g. a transport) for startup. -@var{tag} specifies the prefix to identify this program in the -diagnostic poutput. The @code{transport} statement is a block statement -that have the following structure: - -@smallexample -transport @var{tag} - command @var{command-line} - depend @var{component-list} - stdout @var{prio} - stderr @var{prio} - facility @var{fac} -end -@end smallexample - -The subordinate statements are: - -@deffn {transport statement} command @var{command-line} -Set the command line of the transport. @var{command-line} is parsed -much the same way as in shell, except that no variable substitution -takes place. -@end deffn - -@deffn {transport statement} depend @var{component-list} -Declare that this module depends on the components listed in -@var{component-list}. Whenever one of these components is restarted, -the transport will be restarted as well. - -@var{component-list} is either a whitespace-separated list of -components, or one of the following words: @samp{all}, meaning that -this transport depends on all core components started before it, and -@samp{none}, meaning that it does not depend on anything. - -The default is @samp{all}. -@end deffn - -@anchor{stdout} -@deffn {transport statement} stdout @var{prio} -@deffnx {transport statement} stderr @var{prio} -Redirect program's standard output (or error, in case of -@code{stderr}) to the given syslog priority. Allowed values for -@var{prio} are: @samp{EMERG}, @samp{ALERT}, @samp{CRIT}, @samp{ERR}, -@samp{WARNING}, @samp{NOTICE}, @samp{INFO}, and @samp{DEBUG}, -optionally prefixed with @samp{LOG_}. The string matching is -case-insensitive. -@end deffn - -@deffn {transport statement} facility @var{facility} -This statement does nothing. It is reserved for future use. - -@deffn {transport statement} pidfile @var{file} -Remove @var{file} before starting the transport. It may be useful if -the transport fails to delete its pidfile at the exit. -@end deffn -@end deffn - -@end deffn -@deffn {Jabber Statement} group @var{name} -Retain supplementary group @var{name} after switching to the user's -privileges. -@end deffn - -@deffn {Jabber Statement} pidfile @var{file} -Write master process @acronym{ID} to @var{file} -@end deffn - -@anchor{ctlfile} -@deffn {Jabber Statement} ctlfile @var{file} -Set location of the control file. This file is used to pass additional -information to the running daemon program (e.g., when running -@command{jabberd --restart @var{comp}}). The default value is -@file{/usr/local/var/jabberd/.jabberd.ctl}. -@end deffn - -@deffn {Jabber Statement} statfile @var{file} -Set location of the statistics output file. This file is used to pass -statistics information from the running daemon program (e.g., when running -@command{jabberd --status}). The default value is -@file{/usr/local/var/jabberd/.jabberd.stat}. -@end deffn - -@deffn {Jabber Statement} prog @var{command} [@var{config-file}] -Schedule a jabber core program for startup. The program name is given -by @var{command} argument. Optional @var{config-file} gives the -location of its configuration file. The program command line will be -(parts enclosed by square brackets being optional): - -@smallexample -@var{command} [-c @var{config-file}] [-D] -@end smallexample - - The @option{-D} is given only if the @command{jabberd} debugging -level is greater than 2 (e.g. when running it as @command{jabberd -DDD}). -@end deffn - -@deffn {Jabber Statement} umask @var{n} -Set file creation mask to @var{n}. The default umask is @samp{037}. -@end deffn - -@deffn {Jabber Statement} user @var{name} -Run with this user privileges. -@end deffn - -@deffn {Jabber Statement} shutdown-timeout @var{n} -Wait @var{n} seconds for all children to shut down. -@end deffn - -@deffn {Jabber Statement} syslog-facility @var{facility} -Output diagnostics to the given syslog facility. The @var{facility} -may be one of the following: @samp{USER}, @samp{DAEMON}, @samp{AUTH}, -@samp{AUTHPRIV}, @samp{LOCAL0} through @samp{LOCAL7}, and @samp{MAIL}. -The string matching is case insensitive. Optionally, @samp{LOG_} -prefix may be prepended to @var{facility}. -@end deffn - -@deffn {Jabber Statement} syslog-tag @var{tag} -Mark @command{jabberd} diagnostics with the given syslog tag. By -default @samp{jabberd} is used. -@end deffn - -@node example -@subsubsection An Example of @file{jabberd.cfg} file - -@smallexample -# @r{Run as user @samp{jabber}} -user jabber -# @r{Retain two supplementary groups:} -group staff -group nobody - -# @r{Store @acronym{PID} to the given file} -pidfile /usr/local/var/jabberd/pid/jabberd.pid -# @r{Wait 10 seconds for the shutdown of the children.} -shutdown-timeout 10 - -# @r{Start basic jabberd framework:} -prog router /usr/local/etc/jabberd/router.xml -prog resolver /usr/local/etc/jabberd/resolver.xml -prog sm /usr/local/etc/jabberd/sm.xml -prog s2s /usr/local/etc/jabberd/s2s.xml -prog c2s /usr/local/etc/jabberd/c2s.xml - -# @r{Start @acronym{GG} transport and capture its output:} -transport ggtrans - command /usr/local/sbin/jggtrans -f - stdout notice - stderr notice -end - -# @r{Start @acronym{ICQ} transport and capture its output:} -transport jit - command /usr/local/bin/jabberd-jit -c /usr/local/etc/jit.xml - # @r{Ensure the pidfile is removed at the startup.} - pidfile /usr/local/var/jabberd/pid/jit.pid - stdout notice - stderr notice -end -@end smallexample - @node Sendmail mc Files, Startup Scripts, Root Utilities, Top @chapter Sendmail @file{mc} Files diff --git a/jabberd/Makefile.am b/jabberd/Makefile.am deleted file mode 100644 index 726eeb4..0000000 --- a/jabberd/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# This file is part of GSC -# Copyright (C) 2005, 2006, 2007 Sergey Poznyakoff -# -# GSC 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. -# -# GSC 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 GSC. If not, see <http://www.gnu.org/licenses/>. - -bin_PROGRAMS = jabberd -jabberd_SOURCES = main.c progman.c jabberd.h -LDADD = ../lib/libgsc.a ../gnu/libgnu.a -INCLUDES = -I$(top_srcdir)/lib -I$(top_srcdir)/gnu -I../gnu -AM_CPPFLAGS=-DSYSCONFDIR=\"$(sysconfdir)\"\ - -DSTATEDIR=\"$(localstatedir)/jabberd\" diff --git a/jabberd/jabberd.h b/jabberd/jabberd.h deleted file mode 100644 index 1537db4..0000000 --- a/jabberd/jabberd.h +++ /dev/null @@ -1,62 +0,0 @@ -/* jabberd - a dispatcher program for jabber 2.x - Copyright (C) 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 - Free Software Foundation; either version 3 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program. If not, see <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif -#include <sys/types.h> -#include <sys/wait.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <unistd.h> -#include <syslog.h> -#include <getopt.h> -#include <errno.h> -#include <string.h> -#include <pwd.h> -#include <grp.h> -#include <signal.h> - -#include "gsc.h" - -#define RETR_OUT 0 -#define RETR_ERR 1 - -#define TESTTIME 2*60 -#define SLEEPTIME 5*60 -#define MAXSPAWN 10 - -void register_transport (char *tag, char **argv, int retr[2], char **depv, - char *pidfile); -void register_jabber_process (char *cmd, char *cfg); -void logmsg (int prio, char *fmt, ...); -void signal_setup (RETSIGTYPE (*sf)(int)); - -void *emalloc (size_t size); - -void progman_start (void); -void progman_stop (void); -void progman_cleanup (int); -void progman_wake_disabled (void); -void progman_stop_component (const char *); -void progman_dump_stats (const char *); - -extern int debug_level; -extern char *syslog_tag; -extern int log_facility; -extern unsigned long shutdown_timeout; - diff --git a/jabberd/main.c b/jabberd/main.c deleted file mode 100644 index de0551f..0000000 --- a/jabberd/main.c +++ /dev/null @@ -1,910 +0,0 @@ -/* jabberd - a dispatcher program for jabber 2.x - Copyright (C) 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 - Free Software Foundation; either version 3 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program. If not, see <http://www.gnu.org/licenses/>. */ - -#include "jabberd.h" - -char *progname; -char *config_file = SYSCONFDIR "/jabberd.cfg"; -int debug_level = 0; -int foreground = 0; -int log_to_stderr = 0; -char *user = "jabber"; -char *syslog_tag = "jabberd"; -int log_facility = LOG_LOCAL7; -int x_argc; -char **x_argv; -char *pidfile = STATEDIR "/jabberd.pid"; -char *ctlfile = STATEDIR "/.jabberd.ctl"; -char *statfile = STATEDIR "/.jabberd.stat"; -unsigned long shutdown_timeout = 5; -mode_t jabberd_umask = 037; - -void -syslog_printer (int prio, const char *fmt, va_list ap) -{ -#if HAVE_VSYSLOG - vsyslog (prio, fmt, ap); -#else - char buf[128]; - vsnprintf (buf, sizeof buf, fmt, ap); - syslog (prio, "%s", buf); -#endif -} - -void -stderr_printer (int prio, const char *fmt, va_list ap) -{ - const char *p = gsc_syslog_priority_to_str (prio); - fprintf (stderr, "%s: ", progname); - - if (p) - fprintf (stderr, "[%s] ", p); - - vfprintf (stderr, fmt, ap); - fputc ('\n', stderr); -} - - -static void (*log_printer) (int prio, const char *fmt, va_list ap) = - stderr_printer; - -void -logmsg (int prio, char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - log_printer (prio, fmt, ap); - va_end (ap); -} - -void * -emalloc (size_t size) -{ - char *p = malloc (size); - if (!p) - { - logmsg (LOG_EMERG, "%s", strerror (errno)); - exit (1); - } - return p; -} - -void -usage () -{ - printf ("usage: jabberd [-Dfehv][-c config][-r tag [tag...]]\n"); - printf ("jabberd -- A dispatcher program for jabber 2.x\n"); - printf ("\n"); - printf ("General-purpose options:\n"); - printf (" -c, --config-file=FILE use this configuration file\n"); - printf (" -D, --debug increase debugging level\n"); - printf (" -e, --stderr use standard error for diagnostics output\n"); - printf (" -f, --foreground run in foreground mode (implies -e)\n"); - printf (" --force start up even if another copy seems to be running\n"); - - printf ("\nControlling running instance:\n"); - printf (" --status display status information\n"); - printf (" --stop stop the running copy\n"); - printf (" --reload, --hup reload the running copy\n"); - printf (" -r, --restart tag [tag...] restart named components\n"); - - printf ("\nInformational options:\n"); - printf (" -h, --help display this help list\n"); - printf (" -v, --version display program version\n"); - - - printf ("\n"); - printf ("Report bugs to <%s>\n", PACKAGE_BUGREPORT); -} - - -/* Configuration file handling */ - -void -cfg_syslog_tag (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - syslog_tag = strdup (val); -} - -void -cfg_syslog_facility (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - if (gsc_str_to_syslog_facility (val, &log_facility)) - file->error_msg (file->file_name, file->line, "Unknown facility `%s'", - val); -} - -void -cfg_user (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - struct passwd *pwd = getpwnam (val); - if (!pwd) - file->error_msg (file->file_name, file->line, "no such user `%s'", - val); - else if (pwd->pw_uid == 0) - file->error_msg (file->file_name, file->line, "user `%s' has zero UID", - val); - else - user = strdup (val); -} - -struct group_list -{ - struct group_list *next; - gid_t gid; -}; - -static struct group_list *group_list; - -void -cfg_group (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - struct group *group = getgrnam (val); - if (group) - { - struct group_list *p = emalloc (sizeof *p); - p->gid = group->gr_gid; - p->next = group_list; - group_list = p; - } - else - file->error_msg (file->file_name, file->line, "unknown group `%s'", - val); -} - -void -cfg_pidfile (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - pidfile = strdup (val); -} - -void -cfg_ctlfile (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - ctlfile = strdup (val); -} - -void -cfg_statfile (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - ctlfile = strdup (val); -} - -void -cfg_umask (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - char *p; - unsigned long n = strtoul (val, &p, 8); - if (*p) - file->error_msg (file->file_name, file->line, - "invalid umask; stopped near `%s'", p); - else - jabberd_umask = (mode_t) n; -} - -void -cfg_prog (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - char *prog = val; - char *p = val; - - for (; *p && !isspace (*p); p++) - ; - - if (*p) - { - *p++ = 0; - for (; *p && isspace (*p); p++) - ; - - val = p; - } - else - val = 0; - - register_jabber_process (prog, val); -} - -struct transport_rec -{ - char *tag; - char *command; - int facility; - int retr[2]; - int depc; - char **depv; - char *pidfile; -}; - -static void -cfg_transport_command (gsc_config_file_t *file, char *kw, char *val, void *data) -{ - struct transport_rec *prec = data; - prec->command = strdup (val); -} - -void -cfg_transport_facility (gsc_config_file_t *file, char *kw, char *val, void *data) -{ - struct transport_rec *prec = data; - if (gsc_str_to_syslog_facility (val, &prec->facility)) - file->error_msg (file->file_name, file->line, - "Unknown facility `%s'", - val); -} - -void -cfg_transport_stdout (gsc_config_file_t *file, char *kw, char *val, void *data) -{ - struct transport_rec *prec = data; - if (gsc_str_to_syslog_priority (val, &prec->retr[RETR_OUT])) - file->error_msg (file->file_name, file->line, "Unknown priority `%s'", - val); -} - -void -cfg_transport_stderr (gsc_config_file_t *file, char *kw, char *val, void *data) -{ - struct transport_rec *prec = data; - if (gsc_str_to_syslog_priority (val, &prec->retr[RETR_ERR])) - file->error_msg (file->file_name, file->line, "Unknown priority `%s'", - val); -} - -void -cfg_transport_depend (gsc_config_file_t *file, char *kw, char *val, void *data) -{ - struct transport_rec *prec = data; - int rc; - if (rc = argcv_get (val, NULL, NULL, &prec->depc, &prec->depv)) - file->error_msg (file->file_name, file->line, - "cannot split dependency line: %s", - strerror (rc)); -} - -void -cfg_transport_pidfile (gsc_config_file_t *file, char *kw, char *val, - void *data) -{ - struct transport_rec *prec = data; - prec->pidfile = strdup (val); -} - -void -cfg_transport (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - int rc; - int argc; - char **argv; - - struct transport_rec rec; - static struct gsc_config_keyword kwtab[] = { - { "command", cfg_transport_command }, - { "stdout", cfg_transport_stdout }, - { "stderr", cfg_transport_stderr }, - { "facility", cfg_transport_facility }, - { "depend", cfg_transport_depend }, - { "pidfile", cfg_transport_pidfile }, - { NULL } - }; - memset (&rec, 0, sizeof rec); - rec.retr[RETR_OUT] = rec.retr[RETR_ERR] = -1; - if (val) - rec.tag = strdup (val); - - gsc_config_parse_block (file, &rec, kwtab, "end"); - - if (rc = argcv_get (rec.command, NULL, NULL, &argc, &argv)) - { - file->error_msg (file->file_name, file->line, - "cannot split command line: %s", - strerror (rc)); - return; - } - register_transport (rec.tag, argv, rec.retr, rec.depv, rec.pidfile); - free (rec.tag); - free (rec.command); - free (rec.pidfile); - argcv_free (rec.depc, rec.depv); - argcv_free (argc, argv); -} - -void -cfg_shutdown_timeout (gsc_config_file_t *file, char *kw, char *val, void *unused) -{ - char *p; - - shutdown_timeout = strtoul (val, &p, 10); - if (*p) - file->error_msg (file->file_name, file->line, - "unrecognized timeout value, stopped near %s", p); -} - -struct gsc_config_keyword kw_handler[] = { - { "syslog-tag", cfg_syslog_tag }, - { "syslog-facility", cfg_syslog_facility }, - { "user", cfg_user }, - { "group", cfg_group }, - { "pidfile", cfg_pidfile }, - { "ctlfile", cfg_ctlfile }, - { "statfile", cfg_statfile }, - { "umask", cfg_umask }, - { "prog", cfg_prog }, - { "transport", cfg_transport }, - { "exec", cfg_transport }, - { "shutdown-timeout", cfg_shutdown_timeout }, - { NULL } -}; - -void -jabber_cfg_error (const char *name, unsigned line, const char *fmt, ...) -{ - va_list ap; - size_t n; - char buffer[128]; - - n = snprintf (buffer, sizeof buffer, "%s:%u: ", name, line); - va_start (ap, fmt); - vsnprintf (buffer + n, sizeof buffer - n, fmt, ap); - va_end (ap); - logmsg (LOG_ERR, "%s", buffer); -} - -void -parse_config () -{ - switch (gsc_config_parse (config_file, jabber_cfg_error, kw_handler)) - { - case gsc_config_success: - break; - - case gsc_config_open: - logmsg (LOG_EMERG, "cannot open config file `%s': %s", - config_file, strerror (errno)); - exit (1); - - case gsc_config_error: - exit (1); - } -} - - -void -pidfile_write () -{ - FILE *fp = fopen (pidfile, "w"); - if (!fp) - { - logmsg (LOG_CRIT, "cannot open pidfile `%s' for writing: %s", - pidfile, strerror (errno)); - return; - } - fprintf (fp, "%lu\n", (unsigned long) getpid ()); - fclose (fp); -} - -pid_t -pidfile_read (int must_exist) -{ - int c; - pid_t n = 0; - FILE *fp = fopen (pidfile, "r"); - if (!fp) - { - if (must_exist && errno != ENOENT) - logmsg (LOG_ERR, "cannot open pid file `%s': %s", - pidfile, - strerror (errno)); - return -1; - } - - while ((c = fgetc (fp)) != EOF) - { - if (isdigit (c)) - n = n * 10 + c - '0'; - else if (c == '\n') - break; - else - { - logmsg (LOG_ERR, "unexpected character %#03o in pidfile `%s'", - c, pi |