root/source4/lib/cmdline/popt_common.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. popt_version_callback
  2. popt_samba_callback
  3. popt_common_callback

   1 /* 
   2    Unix SMB/CIFS implementation.
   3    Common popt routines
   4 
   5    Copyright (C) Tim Potter 2001,2002
   6    Copyright (C) Jelmer Vernooij 2002,2003,2005
   7 
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "version.h"
  24 #include "lib/cmdline/popt_common.h"
  25 #include "param/param.h"
  26 
  27 /* Handle command line options:
  28  *              -d,--debuglevel 
  29  *              -s,--configfile 
  30  *              -O,--socket-options 
  31  *              -V,--version
  32  *              -l,--log-base
  33  *              -n,--netbios-name
  34  *              -W,--workgroup
  35  *              --realm
  36  *              -i,--scope
  37  */
  38 
  39 enum {OPT_OPTION=1,OPT_LEAK_REPORT,OPT_LEAK_REPORT_FULL,OPT_DEBUG_STDERR};
  40 
  41 struct cli_credentials *cmdline_credentials = NULL;
  42 struct loadparm_context *cmdline_lp_ctx = NULL;
  43 
  44 static void popt_version_callback(poptContext con,
     /* [<][>][^][v][top][bottom][index][help] */
  45                            enum poptCallbackReason reason,
  46                            const struct poptOption *opt,
  47                            const char *arg, const void *data)
  48 {
  49         switch(opt->val) {
  50         case 'V':
  51                 printf("Version %s\n", SAMBA_VERSION_STRING );
  52                 exit(0);
  53         }
  54 }
  55 
  56 static void popt_samba_callback(poptContext con, 
     /* [<][>][^][v][top][bottom][index][help] */
  57                            enum poptCallbackReason reason,
  58                            const struct poptOption *opt,
  59                            const char *arg, const void *data)
  60 {
  61         const char *pname;
  62 
  63         if (reason == POPT_CALLBACK_REASON_POST) {
  64                 if (lp_configfile(cmdline_lp_ctx) == NULL) {
  65             lp_load_default(cmdline_lp_ctx);
  66                 }
  67                 /* Hook any 'every Samba program must do this, after
  68                  * the smb.conf is setup' functions here */
  69                 return;
  70         }
  71 
  72         /* Find out basename of current program */
  73         pname = strrchr_m(poptGetInvocationName(con),'/');
  74 
  75         if (!pname)
  76                 pname = poptGetInvocationName(con);
  77         else 
  78                 pname++;
  79 
  80         if (reason == POPT_CALLBACK_REASON_PRE) {
  81                 cmdline_lp_ctx = loadparm_init(talloc_autofree_context());
  82 
  83                 /* Hook for 'almost the first thing to do in a samba program' here */
  84                 /* setup for panics */
  85                 fault_setup(poptGetInvocationName(con));
  86 
  87                 /* and logging */
  88                 setup_logging(pname, DEBUG_STDOUT);
  89 
  90                 return;
  91         }
  92 
  93         switch(opt->val) {
  94 
  95         case OPT_LEAK_REPORT:
  96                 talloc_enable_leak_report();
  97                 break;
  98 
  99         case OPT_LEAK_REPORT_FULL:
 100                 talloc_enable_leak_report_full();
 101                 break;
 102 
 103         case OPT_OPTION:
 104                 if (!lp_set_option(cmdline_lp_ctx, arg)) {
 105                         fprintf(stderr, "Error setting option '%s'\n", arg);
 106                         exit(1);
 107                 }
 108                 break;
 109 
 110         case 'd':
 111                 lp_set_cmdline(cmdline_lp_ctx, "log level", arg);
 112                 break;
 113 
 114         case OPT_DEBUG_STDERR:
 115                 setup_logging(pname, DEBUG_STDERR);
 116                 break;
 117 
 118         case 's':
 119                 if (arg) {
 120                         lp_load(cmdline_lp_ctx, arg);
 121                 }
 122                 break;
 123 
 124         case 'l':
 125                 if (arg) {
 126                         char *new_logfile = talloc_asprintf(NULL, "%s/log.%s", arg, pname);
 127                         lp_set_cmdline(cmdline_lp_ctx, "log file", new_logfile);
 128                         talloc_free(new_logfile);
 129                 }
 130                 break;
 131         
 132 
 133         }
 134 
 135 }
 136 
 137 
 138 static void popt_common_callback(poptContext con, 
     /* [<][>][^][v][top][bottom][index][help] */
 139                            enum poptCallbackReason reason,
 140                            const struct poptOption *opt,
 141                            const char *arg, const void *data)
 142 {
 143         struct loadparm_context *lp_ctx = cmdline_lp_ctx;
 144 
 145         switch(opt->val) {
 146         case 'O':
 147                 if (arg) {
 148                         lp_set_cmdline(lp_ctx, "socket options", arg);
 149                 }
 150                 break;
 151         
 152         case 'W':
 153                 lp_set_cmdline(lp_ctx, "workgroup", arg);
 154                 break;
 155 
 156         case 'r':
 157                 lp_set_cmdline(lp_ctx, "realm", arg);
 158                 break;
 159                 
 160         case 'n':
 161                 lp_set_cmdline(lp_ctx, "netbios name", arg);
 162                 break;
 163                 
 164         case 'i':
 165                 lp_set_cmdline(lp_ctx, "netbios scope", arg);
 166                 break;
 167 
 168         case 'm':
 169                 lp_set_cmdline(lp_ctx, "client max protocol", arg);
 170                 break;
 171 
 172         case 'R':
 173                 lp_set_cmdline(lp_ctx, "name resolve order", arg);
 174                 break;
 175 
 176         case 'S':
 177                 lp_set_cmdline(lp_ctx, "client signing", arg);
 178                 break;
 179 
 180         }
 181 }
 182 
 183 struct poptOption popt_common_connection[] = {
 184         { NULL, 0, POPT_ARG_CALLBACK, (void *)popt_common_callback },
 185         { "name-resolve", 'R', POPT_ARG_STRING, NULL, 'R', "Use these name resolution services only", "NAME-RESOLVE-ORDER" },
 186         { "socket-options", 'O', POPT_ARG_STRING, NULL, 'O', "socket options to use", "SOCKETOPTIONS" },
 187         { "netbiosname", 'n', POPT_ARG_STRING, NULL, 'n', "Primary netbios name", "NETBIOSNAME" },
 188         { "signing", 'S', POPT_ARG_STRING, NULL, 'S', "Set the client signing state", "on|off|required" },
 189         { "workgroup", 'W', POPT_ARG_STRING, NULL, 'W', "Set the workgroup name", "WORKGROUP" },
 190         { "realm", 0, POPT_ARG_STRING, NULL, 'r', "Set the realm name", "REALM" },
 191         { "scope", 'i', POPT_ARG_STRING, NULL, 'i', "Use this Netbios scope", "SCOPE" },
 192         { "maxprotocol", 'm', POPT_ARG_STRING, NULL, 'm', "Set max protocol level", "MAXPROTOCOL" },
 193         { NULL }
 194 };
 195 
 196 struct poptOption popt_common_samba[] = {
 197         { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST, (void *)popt_samba_callback },
 198         { "debuglevel",   'd', POPT_ARG_STRING, NULL, 'd', "Set debug level", "DEBUGLEVEL" },
 199         { "debug-stderr", 0, POPT_ARG_NONE, NULL, OPT_DEBUG_STDERR, "Send debug output to STDERR", NULL },
 200         { "configfile",   's', POPT_ARG_STRING, NULL, 's', "Use alternative configuration file", "CONFIGFILE" },
 201         { "option",         0, POPT_ARG_STRING, NULL, OPT_OPTION, "Set smb.conf option from command line", "name=value" },
 202         { "log-basename", 'l', POPT_ARG_STRING, NULL, 'l', "Basename for log/debug files", "LOGFILEBASE" },
 203         { "leak-report",     0, POPT_ARG_NONE, NULL, OPT_LEAK_REPORT, "enable talloc leak reporting on exit", NULL },   
 204         { "leak-report-full",0, POPT_ARG_NONE, NULL, OPT_LEAK_REPORT_FULL, "enable full talloc leak reporting on exit", NULL },
 205         { NULL }
 206 };
 207 
 208 struct poptOption popt_common_version[] = {
 209         { NULL, 0, POPT_ARG_CALLBACK, (void *)popt_version_callback },
 210         { "version", 'V', POPT_ARG_NONE, NULL, 'V', "Print version" },
 211         { NULL }
 212 };
 213 

/* [<][>][^][v][top][bottom][index][help] */