Hi,

this is the adaption of the recent ospfd commit to ospf6d.

Early in the startup the main process checks if another process is listening
on the control socket and exits if that is the case. Otherwise the master
process opens the control socket and passes it on to the ospf engine.

OK?

Remi



Index: control.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/control.c,v
retrieving revision 1.26
diff -u -p -r1.26 control.c
--- control.c   12 Aug 2017 16:27:50 -0000      1.26
+++ control.c   31 Aug 2018 13:23:15 -0000
@@ -39,6 +39,33 @@ struct ctl_conn      *control_connbypid(pid_t
 void            control_close(int);
 
 int
+control_check(char *path)
+{
+       struct sockaddr_un       sun;
+       int                      fd;
+
+       bzero(&sun, sizeof(sun));
+       sun.sun_family = AF_UNIX;
+       strlcpy(sun.sun_path, path, sizeof(sun.sun_path));
+
+       if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
+               log_warn("control_check: socket check");
+               return (-1);
+       }
+
+       if (connect(fd, (struct sockaddr *)&sun, sizeof(sun)) == 0) {
+               log_warnx("control_check: socket in use");
+               close(fd);
+               return (-1);
+       }
+
+       close(fd);
+
+       return (0);
+}
+
+
+int
 control_init(char *path)
 {
        struct sockaddr_un       sun;
@@ -78,9 +105,7 @@ control_init(char *path)
                return (-1);
        }
 
-       control_state.fd = fd;
-
-       return (0);
+       return (fd);
 }
 
 int
Index: control.h
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/control.h,v
retrieving revision 1.5
diff -u -p -r1.5 control.h
--- control.h   10 Feb 2015 05:39:10 -0000      1.5
+++ control.h   31 Aug 2018 11:41:05 -0000
@@ -34,6 +34,7 @@ struct ctl_conn {
        struct imsgev           iev;
 };
 
+int    control_check(char *);
 int    control_init(char *);
 int    control_listen(void);
 void   control_accept(int, short, void *);
Index: ospf6d.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.c,v
retrieving revision 1.38
diff -u -p -r1.38 ospf6d.c
--- ospf6d.c    12 Jul 2018 13:45:03 -0000      1.38
+++ ospf6d.c    31 Aug 2018 13:39:58 -0000
@@ -115,6 +115,7 @@ main(int argc, char *argv[])
        int                      mib[4];
        size_t                   len;
        char                    *sockname = NULL;
+       int                      control_fd;
 
        conffile = CONF_FILE;
        ospfd_process = PROC_MAIN;
@@ -209,6 +210,9 @@ main(int argc, char *argv[])
        log_init(debug, LOG_DAEMON);
        log_setverbose(ospfd_conf->opts & OSPFD_OPT_VERBOSE);
 
+       if ((control_check(ospfd_conf->csock)) == -1)
+               fatalx("control socket check failed");
+
        if (!debug)
                daemon(1, 0);
 
@@ -266,6 +270,10 @@ main(int argc, char *argv[])
            iev_rde->handler, iev_rde);
        event_add(&iev_rde->ev, NULL);
 
+       if ((control_fd = control_init(ospfd_conf->csock)) == -1)
+               fatalx("control socket setup failed");
+       main_imsg_compose_ospfe_fd(IMSG_CONTROLFD, 0, control_fd);
+
        if (kr_init(!(ospfd_conf->flags & OSPFD_FLAG_NO_FIB_UPDATE),
            ospfd_conf->rdomain) == -1)
                fatalx("kr_init failed");
@@ -454,6 +462,14 @@ main_imsg_compose_ospfe(int type, pid_t 
        if (iev_ospfe == NULL)
                return;
        imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
+}
+
+void
+main_imsg_compose_ospfe_fd(int type, pid_t pid, int fd)
+{
+       if (iev_ospfe == NULL)
+               return;
+       imsg_compose_event(iev_ospfe, type, 0, pid, fd, NULL, 0);
 }
 
 void
Index: ospf6d.h
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.h,v
retrieving revision 1.37
diff -u -p -r1.37 ospf6d.h
--- ospf6d.h    12 Jul 2018 13:45:03 -0000      1.37
+++ ospf6d.h    31 Aug 2018 11:56:38 -0000
@@ -99,6 +99,7 @@ enum imsg_type {
        IMSG_CTL_KROUTE_ADDR,
        IMSG_CTL_END,
        IMSG_CTL_LOG_VERBOSE,
+       IMSG_CONTROLFD,
        IMSG_KROUTE_CHANGE,
        IMSG_KROUTE_DELETE,
        IMSG_IFINFO,
@@ -577,6 +578,7 @@ void                 rtlabel_tag(u_int16_t, u_int32_t)
 
 /* ospf6d.c */
 void   main_imsg_compose_ospfe(int, pid_t, void *, u_int16_t);
+void   main_imsg_compose_ospfe_fd(int, pid_t, int);
 void   main_imsg_compose_rde(int, pid_t, void *, u_int16_t);
 int    ospf_redistribute(struct kroute *, u_int32_t *);
 void   merge_config(struct ospfd_conf *, struct ospfd_conf *);
Index: ospfe.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/ospfe.c,v
retrieving revision 1.54
diff -u -p -r1.54 ospfe.c
--- ospfe.c     12 Jul 2018 13:45:03 -0000      1.54
+++ ospfe.c     31 Aug 2018 11:45:42 -0000
@@ -88,10 +88,6 @@ ospfe(struct ospfd_conf *xconf, int pipe
                return (pid);
        }
 
-       /* create ospfd control socket outside chroot */
-       if (control_init(xconf->csock) == -1)
-               fatalx("control socket setup failed");
-
        /* create the raw ip socket */
        if ((xconf->ospf_socket = socket(AF_INET6,
            SOCK_RAW | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_OSPF)) == -1)
@@ -133,7 +129,7 @@ ospfe(struct ospfd_conf *xconf, int pipe
            setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
                fatal("can't drop privileges");
 
-       if (pledge("stdio inet mcast", NULL) == -1)
+       if (pledge("stdio inet mcast recvfd", NULL) == -1)
                fatal("pledge");
 
        event_init();
@@ -444,6 +440,17 @@ ospfe_dispatch_main(int fd, short event,
                case IMSG_CTL_KROUTE_ADDR:
                case IMSG_CTL_END:
                        control_imsg_relay(&imsg);
+                       break;
+               case IMSG_CONTROLFD:
+                       if ((fd = imsg.fd) == -1)
+                               fatalx("%s: expected to receive imsg control"
+                                   "fd but didn't receive any", __func__);
+                       control_state.fd = fd;
+                       /* Listen on control socket. */
+                       TAILQ_INIT(&ctl_conns);
+                       control_listen();
+                       if (pledge("stdio inet mcast", NULL) == -1)
+                               fatal("pledge");
                        break;
                default:
                        log_debug("ospfe_dispatch_main: error handling imsg %d",

Reply via email to