---
 bgpd/bgp_main.c | 13 +++++++++++--
 doc/bgpd.8      |  5 ++++-
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c
index 11c73ce..562afc2 100644
--- a/bgpd/bgp_main.c
+++ b/bgpd/bgp_main.c
@@ -67,6 +67,7 @@ static const struct option longopts[] =
   { "no_kernel",   no_argument,       NULL, 'n'},
   { "user",        required_argument, NULL, 'u'},
   { "group",       required_argument, NULL, 'g'},
+  { "skip_runas",  no_argument,       NULL, 'S'},
   { "version",     no_argument,       NULL, 'v'},
   { "dryrun",      no_argument,       NULL, 'C'},
   { "help",        no_argument,       NULL, 'h'},
@@ -161,6 +162,7 @@ redistribution between different routing protocols.\n\n\
 -n, --no_kernel    Do not install route to kernel.\n\
 -u, --user         User to run as\n\
 -g, --group        Group to run as\n\
+-S, --skip_runas   Skip user and group run as\n\
 -v, --version      Print program version\n\
 -C, --dryrun       Check configuration for validity and exit\n\
 -h, --help         Display this help and exit\n\
@@ -200,7 +202,8 @@ sigint (void)
   if (! retain_mode) 
     {
       bgp_terminate ();
-      zprivs_terminate (&bgpd_privs);
+      if (bgpd_privs.user)      /* NULL if skip_runas flag set */
+        zprivs_terminate (&bgpd_privs);
     }
 
   bgp_exit (0);
@@ -346,6 +349,7 @@ main (int argc, char **argv)
   char *progname;
   struct thread thread;
   int tmp_port;
+  int skip_runas = 0;
 
   /* Set umask before anything for security */
   umask (0027);
@@ -362,7 +366,7 @@ main (int argc, char **argv)
   /* Command line argument treatment. */
   while (1) 
     {
-      opt = getopt_long (argc, argv, "df:i:z:hp:l:A:P:rnu:g:vC", longopts, 0);
+      opt = getopt_long (argc, argv, "df:i:z:hp:l:A:P:rnu:g:vCS", longopts, 0);
     
       if (opt == EOF)
        break;
@@ -420,6 +424,9 @@ main (int argc, char **argv)
        case 'g':
          bgpd_privs.group = optarg;
          break;
+       case 'S':   /* skip run as = override bgpd_privs */
+          skip_runas = 1;
+         break;
        case 'v':
          print_version (progname);
          exit (0);
@@ -439,6 +446,8 @@ main (int argc, char **argv)
   /* Initializations. */
   srandom (time (NULL));
   signal_init (bm->master, array_size(bgp_signals), bgp_signals);
+  if (skip_runas)
+    memset (&bgpd_privs, 0, sizeof (bgpd_privs));
   zprivs_init (&bgpd_privs);
   cmd_init (1);
   vty_init (bm->master);
diff --git a/doc/bgpd.8 b/doc/bgpd.8
index 8daaefa..1a873b4 100644
--- a/doc/bgpd.8
+++ b/doc/bgpd.8
@@ -6,7 +6,7 @@ software
 .SH SYNOPSIS
 .B bgpd
 [
-.B \-dhrv
+.B \-dhrSv
 ] [
 .B \-f
 .I config-file
@@ -74,6 +74,9 @@ Specify the user to run as. Default is \fIquagga\fR.
 \fB\-r\fR, \fB\-\-retain\fR 
 When the program terminates, retain routes added by \fBbgpd\fR.
 .TP
+\fB\-S\fR, \fB\-\-skip_runas\fR 
+Skip setting the process effective user and group.
+.TP
 \fB\-v\fR, \fB\-\-version\fR
 Print the version and exit.
 .SH FILES
-- 
2.1.3


_______________________________________________
Quagga-dev mailing list
Quagga-dev@lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to