1/* 2 * $Id: test-privs.c,v 1.1 2005/10/11 03:48:28 paul Exp $ 3 * 4 * This file is part of Quagga. 5 * 6 * Quagga is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2, or (at your option) any 9 * later version. 10 * 11 * Quagga is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with Quagga; see the file COPYING. If not, write to the Free 18 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 19 * 02111-1307, USA. 20 */ 21 22#include <zebra.h> 23 24#include <lib/version.h> 25#include "getopt.h" 26#include "privs.h" 27#include "memory.h" 28 29zebra_capabilities_t _caps_p [] = 30{ 31 ZCAP_NET_RAW, 32 ZCAP_BIND, 33 ZCAP_NET_ADMIN, 34 ZCAP_DAC_OVERRIDE, 35}; 36 37struct zebra_privs_t test_privs = 38{ 39#if defined(QUAGGA_USER) && defined(QUAGGA_GROUP) 40 .user = QUAGGA_USER, 41 .group = QUAGGA_GROUP, 42#endif 43#if defined(VTY_GROUP) 44 .vty_group = VTY_GROUP, 45#endif 46 .caps_p = _caps_p, 47 .cap_num_p = sizeof(_caps_p)/sizeof(_caps_p[0]), 48 .cap_num_i = 0 49}; 50 51struct option longopts[] = 52{ 53 { "help", no_argument, NULL, 'h'}, 54 { "user", required_argument, NULL, 'u'}, 55 { "group", required_argument, NULL, 'g'}, 56 { 0 } 57}; 58 59/* Help information display. */ 60static void 61usage (char *progname, int status) 62{ 63 if (status != 0) 64 fprintf (stderr, "Try `%s --help' for more information.\n", progname); 65 else 66 { 67 printf ("Usage : %s [OPTION...]\n\ 68Daemon which does 'slow' things.\n\n\ 69-u, --user User to run as\n\ 70-g, --group Group to run as\n\ 71-h, --help Display this help and exit\n\ 72\n\ 73Report bugs to %s\n", progname, ZEBRA_BUG_ADDRESS); 74 } 75 exit (status); 76} 77 78struct thread_master *master; 79/* main routine. */ 80int 81main (int argc, char **argv) 82{ 83 char *p; 84 char *progname; 85 struct zprivs_ids_t ids; 86 87 /* Set umask before anything for security */ 88 umask (0027); 89 90 /* get program name */ 91 progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]); 92 93 while (1) 94 { 95 int opt; 96 97 opt = getopt_long (argc, argv, "hu:g:", longopts, 0); 98 99 if (opt == EOF) 100 break; 101 102 switch (opt) 103 { 104 case 0: 105 break; 106 case 'u': 107 test_privs.user = optarg; 108 break; 109 case 'g': 110 test_privs.group = optarg; 111 break; 112 case 'h': 113 usage (progname, 0); 114 break; 115 default: 116 usage (progname, 1); 117 break; 118 } 119 } 120 121 /* Library inits. */ 122 memory_init (); 123 zprivs_init (&test_privs); 124 125#define PRIV_STATE() \ 126 ((test_privs.current_state() == ZPRIVS_RAISED) ? "Raised" : "Lowered") 127 128 printf ("%s\n", PRIV_STATE()); 129 test_privs.change(ZPRIVS_RAISE); 130 131 printf ("%s\n", PRIV_STATE()); 132 test_privs.change(ZPRIVS_LOWER); 133 134 printf ("%s\n", PRIV_STATE()); 135 zprivs_get_ids (&ids); 136 137 /* terminate privileges */ 138 zprivs_terminate(&test_privs); 139 140 /* but these should continue to work... */ 141 printf ("%s\n", PRIV_STATE()); 142 test_privs.change(ZPRIVS_RAISE); 143 144 printf ("%s\n", PRIV_STATE()); 145 test_privs.change(ZPRIVS_LOWER); 146 147 printf ("%s\n", PRIV_STATE()); 148 zprivs_get_ids (&ids); 149 150 printf ("terminating\n"); 151 return 0; 152} 153