Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/blacklist/bin Read from multiple sockets.



details:   https://anonhg.NetBSD.org/src/rev/6f42866c7fb1
branches:  trunk
changeset: 335729:6f42866c7fb1
user:      christos <christos%NetBSD.org@localhost>
date:      Thu Jan 22 07:57:31 2015 +0000

description:
Read from multiple sockets.

diffstat:

 external/bsd/blacklist/bin/blacklistd.8 |  14 +++--
 external/bsd/blacklist/bin/blacklistd.c |  75 +++++++++++++++++++++++++-------
 external/bsd/blacklist/bin/internal.h   |   5 +-
 3 files changed, 70 insertions(+), 24 deletions(-)

diffs (226 lines):

diff -r 62c858eeeecb -r 6f42866c7fb1 external/bsd/blacklist/bin/blacklistd.8
--- a/external/bsd/blacklist/bin/blacklistd.8   Thu Jan 22 05:49:18 2015 +0000
+++ b/external/bsd/blacklist/bin/blacklistd.8   Thu Jan 22 07:57:31 2015 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: blacklistd.8,v 1.2 2015/01/21 19:37:30 christos Exp $
+.\" $NetBSD: blacklistd.8,v 1.3 2015/01/22 07:57:31 christos Exp $
 .\" 
 .\" Copyright (c) 2015 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\" 
-.Dd January 19, 2016
+.Dd January 22, 2016
 .Dt BLACKLISTD 8
 .Os
 .Sh NAME
@@ -41,16 +41,18 @@
 .Op Fl C Ar controlprog
 .Op Fl D Ar dbfile
 .Op Fl r Ar rulename
-.Op Fl s Ar sockpath
+.Op Fl P Ar sockpathsfile
 .Op Fl t Ar timeout
 .Sh DESCRIPTION
 .Nm
 is a daemon similar to
 .Xr syslogd 8
-that listens to a socket at
-.Ar sockpath
+that listens to a sockets at paths specified in the 
+.Ar sockpathsfile
 for notifications from other daemons about successful or failed connection
 attempts.
+If no such file is specified, then it only listens to the default socket
+.Pa /var/run/blsock .
 Each notification contains a (action, port, protocol, address, owner) tuple
 that identifies the remote connection and the action.
 This tuple is consulted against entries in
@@ -150,6 +152,8 @@
 .Bl -tag -width /etc/blacklistd/control -compact
 .It Pa /etc/blacklistd/control
 Shell script invoked to interface with the packet filter.
+.It Pa /etc/blacklistd/sockets
+List of socket paths to listen to.
 .It Pa /etc/blacklistd/conf
 Configuration file.
 .It Pa /var/db/blacklistd.db
diff -r 62c858eeeecb -r 6f42866c7fb1 external/bsd/blacklist/bin/blacklistd.c
--- a/external/bsd/blacklist/bin/blacklistd.c   Thu Jan 22 05:49:18 2015 +0000
+++ b/external/bsd/blacklist/bin/blacklistd.c   Thu Jan 22 07:57:31 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: blacklistd.c,v 1.17 2015/01/22 05:35:55 christos Exp $ */
+/*     $NetBSD: blacklistd.c,v 1.18 2015/01/22 07:57:31 christos Exp $ */
 
 /*-
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #include "config.h"
 #endif
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: blacklistd.c,v 1.17 2015/01/22 05:35:55 christos Exp $");
+__RCSID("$NetBSD: blacklistd.c,v 1.18 2015/01/22 07:57:31 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -101,8 +101,8 @@
 {
        warnx("Unknown option `%c'", (char)c);
        fprintf(stderr, "Usage: %s [-df] [-c <config>] [-r <rulename>] "
-           "[-s <sockpath>] [-C <controlprog>] [-D <dbfile>] [-t <timeout>]\n",
-           getprogname());
+           "[-P <sockpathsfile>] [-C <controlprog>] [-D <dbfile>] "
+           "[-t <timeout>]\n", getprogname());
        exit(EXIT_FAILURE);
 }
 
@@ -237,20 +237,42 @@
        }
 }
 
+static void
+addfd(struct pollfd **pfdp, bl_t **blp, size_t *nfd, size_t *maxfd,
+    const char *path)
+{
+       bl_t bl = bl_create(true, path, lfun);
+       if (bl == NULL || !bl_isconnected(bl))
+               exit(EXIT_FAILURE);
+       if (*nfd >= *maxfd) {
+               *maxfd += 10;
+               *blp = realloc(*blp, sizeof(**blp) * *maxfd);
+               if (*blp == NULL)
+                       err(EXIT_FAILURE, "malloc");
+               *pfdp = realloc(*pfdp, sizeof(**pfdp) * *maxfd);
+               if (*pfdp == NULL)
+                       err(EXIT_FAILURE, "malloc");
+       }
+
+       (*pfdp)[*nfd].fd = bl_getfd(bl);
+       (*pfdp)[*nfd].events = POLLIN;
+       (*blp)[*nfd] = bl;
+       *nfd += 1;
+}
+
 int
 main(int argc, char *argv[])
 {
-       bl_t bl;
        int c, tout, flags, reset;
        const char *spath;
 
        setprogname(argv[0]);
 
-       spath = _PATH_BLSOCK;
+       spath = NULL;
        reset = 0;
        tout = 0;
        flags = O_RDWR|O_EXCL|O_CLOEXEC;
-       while ((c = getopt(argc, argv, "C:c:D:dfr:s:t:")) != -1) {
+       while ((c = getopt(argc, argv, "C:c:D:dfr:P:t:")) != -1) {
                switch (c) {
                case 'C':
                        controlprog = optarg;
@@ -270,7 +292,7 @@
                case 'r':
                        rulename = optarg;
                        break;
-               case 's':
+               case 'P':
                        spath = optarg;
                        break;
                case 't':
@@ -288,13 +310,12 @@
        signal(SIGUSR1, sigusr1);
        signal(SIGUSR2, sigusr2);
 
+
        if (debug) {
                lfun = dlog;
                if (tout == 0)
                        tout = 5000;
        } else {
-               if (daemon(0, 0) == -1)
-                       err(EXIT_FAILURE, "daemon failed");
                if (tout == 0)
                        tout = 15000;
        }
@@ -306,24 +327,40 @@
                flags |= O_TRUNC;
        }
 
-       bl = bl_create(true, spath, lfun);
-       if (bl == NULL || !bl_isconnected(bl))
-               return EXIT_FAILURE;
+       struct pollfd *pfd = NULL;
+       bl_t *bl = NULL;
+       size_t nfd = 0;
+       size_t maxfd = 0;
+
+       if (spath == NULL)
+               addfd(&pfd, &bl, &nfd, &maxfd, _PATH_BLSOCK);
+       else {
+               FILE *fp = fopen(spath, "r");
+               char *line;
+               if (fp == NULL)
+                       err(EXIT_FAILURE, "Can't open `%s'", spath);
+               for (; (line = fparseln(fp, NULL, NULL, NULL, 0)) != NULL;
+                   free(line))
+                       addfd(&pfd, &bl, &nfd, &maxfd, line);
+               fclose(fp);
+       }
+
        state = state_open(dbfile, flags, 0600);
        if (state == NULL)
                state = state_open(dbfile,  flags | O_CREAT, 0600);
        if (state == NULL)
                return EXIT_FAILURE;
 
-       struct pollfd pfd;
-       pfd.fd = bl_getfd(bl);
-       pfd.events = POLLIN;
+       if (!debug)
+               if (daemon(0, 0) == -1)
+                       err(EXIT_FAILURE, "daemon failed");
+
        while (!done) {
                if (rconf) {
                        rconf = 0;
                        conf_parse(configfile);
                }
-               switch (poll(&pfd, 1, tout)) {
+               switch (poll(pfd, (nfds_t)nfd, tout)) {
                case -1:
                        if (errno == EINTR)
                                continue;
@@ -332,7 +369,9 @@
                case 0:
                        break;
                default:
-                       process(bl);
+                       for (size_t i = 0; i < nfd; i++)
+                               if (pfd[i].revents & POLLIN)
+                                       process(bl[i]);
                }
                update();
        }
diff -r 62c858eeeecb -r 6f42866c7fb1 external/bsd/blacklist/bin/internal.h
--- a/external/bsd/blacklist/bin/internal.h     Thu Jan 22 05:49:18 2015 +0000
+++ b/external/bsd/blacklist/bin/internal.h     Thu Jan 22 07:57:31 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: internal.h,v 1.7 2015/01/22 03:48:07 christos Exp $    */
+/*     $NetBSD: internal.h,v 1.8 2015/01/22 07:57:31 christos Exp $    */
 
 /*-
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -37,6 +37,9 @@
 #ifndef _PATH_BLCONTROL
 #define        _PATH_BLCONTROL "/etc/blacklistd/control"
 #endif
+#ifndef _PATH_BLSOCKETS
+#define        _PATH_BLSOCKETS "/etc/blacklistd/sockets"
+#endif
 #ifndef _PATH_BLSTATE
 #define        _PATH_BLSTATE   "/var/db/blacklistd.db"
 #endif



Home | Main Index | Thread Index | Old Index