File drac.dif of Package drac
--- drac/Makefile
+++ drac/Makefile
@@ -5,9 +5,9 @@
# Paths
-INSTALL = /usr/ucb/install
-EBIN = /usr/local/sbin
-MAN = /usr/local/man/man
+INSTALL = /usr/bin/install
+EBIN = /usr/sbin
+MAN = /usr/share/man/man
# OS-Dependant settings
@@ -33,26 +33,27 @@
# -DCIDR_KEY # keys in CIDR format
# -DTERM_KD # keys and data nul-terminated
-DEFS = -DTI_RPC -DFCNTL_LOCK -DSYSINFO
+DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C
# Compiler flags
-CC = cc
+CC = gcc
RANLIB = :
-CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-4.1.25/build_unix
+OPTFLAGS = -O2 -Wall
+CFLAGS = $(DEFS) $(OPTFLAGS)
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-3.1.17/build_unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-2.4.14/Unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db.1.85/PORT/sunos.5.2/include
-LDLIBS = -L/usr/local/src/db/db-4.1.25/build_unix -lnsl -ldb-4.1
+LDLIBS = -lnsl -ldb -lpthread
#LDLIBS = -L/usr/local/src/db/db-3.1.17/build_unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db-2.4.14/Unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db.1.85/PORT/sunos.5.2 -lnsl -ldb
TSTLIBS = -L. -ldrac -lnsl
-RPCGENFLAGS =
-#RPCGENFLAGS = -C
+#RPCGENFLAGS =
+RPCGENFLAGS = -C
# Man sections
MANLIB = 3
-MANADM = 1m
+MANADM = 8
## Nothing to change after this point
@@ -110,7 +111,7 @@
$(CC) -o $(CLIENT) $(TST_OBJ) $(TSTLIBS)
$(SERVER): $(S_OBJS)
- $(CC) -o $(SERVER) $(S_OBJS) $(LDLIBS)
+ $(CC) -o $(SERVER) $(S_OBJS) $(LDLIBS) -pie
clean:
rm -f core $(RPC_ALL) $(H_OBJS) $(TST_OBJ) $(CLIENT) \
@@ -120,7 +121,7 @@
tar cf drac.tar $(PACKAGE)
install: $(SERVER)
- $(INSTALL) -c -o bin -g bin -m 0755 $(SERVER) $(EBIN)
+ $(INSTALL) -c -m 0755 $(SERVER) $(EBIN)
install-man: $(SERVER).1m dracauth.3
$(INSTALL) -c -m 0444 $(SERVER).1m $(MAN)$(MANADM)/$(SERVER).$(MANADM)
--- drac/rc.dracd
+++ drac/rc.dracd
@@ -0,0 +1,149 @@
+#! /bin/sh
+# Copyright (c) 2000 SuSE GmbH Nuernberg, Germany.
+# Copyright (c) 2002 SuSE Linux Ag Nuernberg, Germany.
+#
+# Author: Carsten Hoeger, Ralf Haferkamp
+#
+# /sbin/init.d/dracd
+#
+# and symbolic its link
+#
+# /sbin/rcdracd
+#
+### BEGIN INIT INFO
+# Provides: drac
+# Required-Start: $remote_fs portmap
+# Required-Stop: $remote_fs portmap
+# Default-Start: 3 5
+# Description: start the DRAC Daemon
+### END INIT INFO
+
+test -f /etc/sysconfig/dracd && . /etc/sysconfig/dracd
+
+# Determine the base and follow a runlevel link name.
+base=${0##*/}
+link=${base#*[SK][0-9][0-9]}
+
+DRAC_BIN=/usr/sbin/rpc.dracd
+test -x $DRAC_BIN || exit 5
+
+# Shell functions sourced from /etc/rc.status:
+# rc_check check and set local and overall rc status
+# rc_status check and set local and overall rc status
+# rc_status -v ditto but be verbose in local rc status
+# rc_status -v -r ditto and clear the local rc status
+# rc_failed set local and overall rc status to failed
+# rc_failed <num> set local and overall rc status to <num><num>
+# rc_reset clear local rc status (overall remains)
+# rc_exit exit appropriate to overall rc status
+. /etc/rc.status
+
+# First reset status of this service
+rc_reset
+
+# Return values acc. to LSB for all commands but status:
+# 0 - success
+# 1 - generic or unspecified error
+# 2 - invalid or excess argument(s)
+# 3 - unimplemented feature (e.g. "reload")
+# 4 - insufficient privilege
+# 5 - program is not installed
+# 6 - program is not configured
+# 7 - program is not running
+#
+# Note that starting an already running service, stopping
+# or restarting a not-running service as well as the restart
+# with force-reload (in case signalling is not supported) are
+# considered a success.
+
+case "$1" in
+ start)
+ echo -n "Starting service DRAC"
+ ## Start daemon with startproc(8). If this fails
+ ## the echo return value is set appropriate.
+
+ # NOTE: startproc return 0, even if service is
+ # already running to match LSB spec.
+ startproc $DRAC_BIN -i -e $DRACD_RELAYTIME $DRACD_DRACDB
+
+ # Remember status and be verbose
+ rc_status -v
+ ;;
+ stop)
+ echo -n "Shutting down service DRAC"
+ ## Stop daemon with killproc(8) and if this fails
+ ## set echo the echo return value.
+
+ killproc -TERM $DRAC_BIN
+
+ # Remember status and be verbose
+ rc_status -v
+ ;;
+ try-restart)
+ ## Stop the service and if this succeeds (i.e. the
+ ## service was running before), start it again.
+ ## Note: try-restart is not (yet) part of LSB (as of 0.7.5)
+ $0 status >/dev/null && $0 restart
+
+ # Remember status and be quiet
+ rc_status
+ ;;
+ restart)
+ ## Stop the service and regardless of whether it was
+ ## running or not, start it again.
+ $0 stop
+ $0 start
+
+ # Remember status and be quiet
+ rc_status
+ ;;
+ force-reload)
+ ## Signal the daemon to reload its config. Most daemons
+ ## do this on signal 1 (SIGHUP).
+ ## If it does not support it, restart.
+
+ echo -n "Reload service DRAC"
+ ## if it supports it:
+ #killproc -HUP $CYRUS_BIN
+ #touch /var/run/FOO.pid
+ #rc_status -v
+
+ # Otherwise:
+ $0 stop && $0 start
+ rc_status
+ ;;
+ reload)
+ ## Like force-reload, but if daemon does not support
+ ## signalling, do nothing (!)
+
+ echo -n "Reload service DRAC"
+ # If it supports signalling:
+ #killproc -HUP $CYRUS_BIN
+ #touch /var/run/FOO.pid
+ #rc_status -v
+
+ # Otherwise if it does not support reload:
+ rc_failed 3
+ rc_status -v
+ ;;
+ status)
+ echo -n "Checking for service DRAC: "
+ ## Check status with checkproc(8), if process is running
+ ## checkproc will return with exit status 0.
+
+ # Status has a slightly different for the status command:
+ # 0 - service running
+ # 1 - service dead, but /var/run/ pid file exists
+ # 2 - service dead, but /var/lock/ lock file exists
+ # 3 - service not running
+
+ # NOTE: checkproc returns LSB compliant status values.
+ checkproc $DRAC_BIN
+ rc_status -v
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
+ exit 1
+ ;;
+esac
+rc_exit
--- drac/README
+++ drac/README
@@ -18,7 +18,7 @@
periodically expires old entries.
o Only trusted mail servers are permitted to communicate with rpc.dracd,
- as controlled by /etc/mail/dracd.allow .
+ as controlled by /etc/dracd.allow .
o The daemon can optionally re-create the database on startup.
--- drac/rpc.dracd.1m
+++ drac/rpc.dracd.1m
@@ -22,7 +22,7 @@
The daemon, rpc.dracd, adds or updates entries in the cache, and
periodically expires old entries.
Only trusted mail servers are permitted to communicate with rpc.dracd,
-as controlled by \f4/etc/mail/dracd.allow\f1.
+as controlled by \f4/etc/dracd.allow\f1.
If this file does not exist, all local IP addresses are permitted.
.SS Allow File Format
The Allow File file consists of entries of the form:
@@ -61,7 +61,7 @@
.B /etc/mail/dracd.db
default database file
.TP
-.B /etc/mail/dracd.allow
+.B /etc/dracd.allow
default allow file.
.PD
.SH SEE ALSO
--- drac/rpc.dracd.c
+++ drac/rpc.dracd.c
@@ -37,7 +37,7 @@
#include "drac.h"
#define DBFILE "/etc/mail/dracd.db"
-#define ALFILE "/etc/mail/dracd.allow"
+#define ALFILE "/etc/dracd.allow"
struct net_def {
struct net_def *nd_next;
@@ -62,12 +62,17 @@
FILE *debugf;
#endif
+static void expire();
+static int lockdb();
+static int unlockdb();
+static void iniclist();
/* On SIGTERM, must close db */
void catcher(n) int n; {
terminate = 1;
}
/* Parse command-line options */
+int
main(argc, argv) int argc; char **argv; {
int c;
extern char *optarg;
@@ -93,6 +98,7 @@
}
/* Called once after fork */
+void
drac_run() {
int sel;
time_t nexte, now;
@@ -176,7 +182,11 @@
(initdb) ? DB_TRUNCATE|DB_CREATE : DB_CREATE,
0644);
#else
+#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1)
+ errno = dbp->open(dbp, NULL, dbfile, NULL, DB_BTREE,
+#else
errno = dbp->open(dbp, dbfile, NULL, DB_BTREE,
+#endif
(initdb) ? DB_TRUNCATE|DB_CREATE : DB_CREATE,
0644);
#endif
@@ -357,6 +367,7 @@
}
/* Expire old entries from the database */
+static void
expire() {
#if DB_VERSION_MAJOR < 2
int seqerr, flags;
@@ -386,7 +397,7 @@
#endif
if ( errno != 0 ) {
syslog(LOG_ERR, "expire cursor failed: %m");
- return 0;
+ return;
}
#endif
@@ -440,6 +451,7 @@
}
/* Lock the database */
+static int
lockdb() {
#ifdef FCNTL_LOCK
struct flock lfd;
@@ -454,6 +466,7 @@
}
/* Unlock the database */
+static int
unlockdb() {
#ifdef FCNTL_LOCK
struct flock lfd;
@@ -469,6 +482,7 @@
/* Initialize the trusted client table */
/* All in network byte order */
+static void
iniclist() {
FILE *alfp;
char buf[128], mask[32], addr[32], hname[128];
--- drac/sysconfig.dracd
+++ drac/sysconfig.dracd
@@ -0,0 +1,17 @@
+## Path: Network/Mail/Drac
+## Description: Dynamic Relay Authorization Control (POP-before-SMTP)
+## Type: integer
+## Default: 5
+## ServiceRestart: dracd
+#
+# The TTL of a per IP open relay in minutes
+#
+DRACD_RELAYTIME="5"
+
+## Type: string
+## Default: /etc/postfix/dracd.db
+## ServiceRestart: dracd
+#
+# The name of the (btree) dracdb.
+#
+DRACD_DRACDB="/etc/postfix/dracd.db"
--- drac/testing.c
+++ drac/testing.c
@@ -3,6 +3,7 @@
*/
#include <stdio.h>
+#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -24,4 +25,5 @@
ip = inet_addr(argv[2]);
rc = dracauth(host, ip, &err);
if (rc != 0) printf("%s: %s\n", argv[0], err);
+ return 0;
}