r23784: use the GPLv3 boilerplate as recommended by the FSF and the license text
[samba.git] / source3 / lib / popt_common.c
index 3c9a87b361cda8f966c9d4e6876e05fdb9e35d2f..efffd3c11b4dc461fe4aa1bc4fd42898654a66f9 100644 (file)
@@ -4,10 +4,11 @@
 
    Copyright (C) Tim Potter 2001,2002
    Copyright (C) Jelmer Vernooij 2002,2003
+   Copyright (C) James Peach 2006
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -16,8 +17,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
  *             -V,--version
  *             -l,--log-base
  *             -n,--netbios-name
+ *             -W,--workgroup
  *             -i,--scope
  */
 
 extern pstring user_socket_options;
 extern BOOL AllowDebugChange;
+extern BOOL override_logfile;
 
 struct user_auth_info cmdline_auth_info;
 
-static void popt_common_callback(poptContext con, 
-                          enum poptCallbackReason reason,
-                          const struct poptOption *opt,
-                          const char *arg, const void *data)
+static void set_logfile(poptContext con, const char * arg)
 {
+
        pstring logfile;
        const char *pname;
        
@@ -53,9 +53,18 @@ static void popt_common_callback(poptContext con,
        else 
                pname++;
 
+       pstr_sprintf(logfile, "%s/log.%s", arg, pname);
+       lp_set_logfile(logfile);
+}
+
+static void popt_common_callback(poptContext con,
+                          enum poptCallbackReason reason,
+                          const struct poptOption *opt,
+                          const char *arg, const void *data)
+{
+
        if (reason == POPT_CALLBACK_REASON_PRE) {
-               pstr_sprintf(logfile, "%s/log.%s", dyn_LOGFILEBASE, pname);
-               lp_set_logfile(logfile);
+               set_logfile(con, dyn_LOGFILEBASE);
                return;
        }
 
@@ -68,7 +77,7 @@ static void popt_common_callback(poptContext con,
                break;
 
        case 'V':
-               printf( "Version %s\n", VERSION );
+               printf( "Version %s\n", SAMBA_VERSION_STRING);
                exit(0);
                break;
 
@@ -92,8 +101,9 @@ static void popt_common_callback(poptContext con,
 
        case 'l':
                if (arg) {
-                       pstr_sprintf(logfile, "%s/log.%s", arg, pname);
-                       lp_set_logfile(logfile);
+                       set_logfile(con, arg);
+                       override_logfile = True;
+                       pstr_sprintf(dyn_LOGFILEBASE, "%s", arg);
                }
                break;
 
@@ -102,49 +112,165 @@ static void popt_common_callback(poptContext con,
                          set_global_scope(arg);
                }
                break;
+
+       case 'W':
+               if (arg) {
+                       set_global_myworkgroup(arg);
+               }
+               break;
        }
 }
 
-struct poptOption popt_common_debug[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, popt_common_callback },
-       { "debuglevel", 'd', POPT_ARG_STRING, NULL, 'd', "Set debug level", "DEBUGLEVEL" },
-       { 0 }
-};
-
-struct poptOption popt_common_scope[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, popt_common_callback }, 
-    { "scope", 'i', POPT_ARG_STRING, NULL, 'i', "Use this Netbios scope", "SCOPE" },  
-       { 0 }
-};
+struct poptOption popt_common_connection[] = {
+       { NULL, 0, POPT_ARG_CALLBACK, (void *)popt_common_callback },
+       { "socket-options", 'O', POPT_ARG_STRING, NULL, 'O', "socket options to use",
+         "SOCKETOPTIONS" },
+       { "netbiosname", 'n', POPT_ARG_STRING, NULL, 'n', "Primary netbios name", "NETBIOSNAME" },
+       { "workgroup", 'W', POPT_ARG_STRING, NULL, 'W', "Set the workgroup name", "WORKGROUP" },
+       { "scope", 'i', POPT_ARG_STRING, NULL, 'i', "Use this Netbios scope", "SCOPE" },
 
-struct poptOption popt_common_configfile[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, popt_common_callback },
-       { "configfile", 's', POPT_ARG_STRING, NULL, 's', "Use alternative configuration file" },
-       { 0 }
+       POPT_TABLEEND
 };
 
-struct poptOption popt_common_socket_options[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, popt_common_callback },
-       {"socket-options", 'O', POPT_ARG_STRING, NULL, 'O', "socket options to use" },
-       { 0 }
+struct poptOption popt_common_samba[] = {
+       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE, (void *)popt_common_callback },
+       { "debuglevel", 'd', POPT_ARG_STRING, NULL, 'd', "Set debug level", "DEBUGLEVEL" },
+       { "configfile", 's', POPT_ARG_STRING, NULL, 's', "Use alternate configuration file", "CONFIGFILE" },
+       { "log-basename", 'l', POPT_ARG_STRING, NULL, 'l', "Base name for log files", "LOGFILEBASE" },
+       { "version", 'V', POPT_ARG_NONE, NULL, 'V', "Print version" },
+       POPT_TABLEEND
 };
 
 struct poptOption popt_common_version[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, popt_common_callback },
-       {"version", 'V', POPT_ARG_NONE, NULL, 'V', "Print version" },
-       { 0 }
+       { NULL, 0, POPT_ARG_CALLBACK, (void *)popt_common_callback },
+       { "version", 'V', POPT_ARG_NONE, NULL, 'V', "Print version" },
+       POPT_TABLEEND
 };
 
-struct poptOption popt_common_netbios_name[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, popt_common_callback },
-       {"netbiosname", 'n', POPT_ARG_STRING, NULL, 'n', "Primary netbios name"},
-       { 0 }
+
+/* Handle command line options:
+ *             --sbindir
+ *             --bindir
+ *             --swatdir
+ *             --lmhostsfile
+ *             --libdir
+ *             --shlibext
+ *             --lockdir
+ *             --piddir
+ *             --smb-passwd-file
+ *             --private-dir
+ */
+
+enum dyn_item{
+       DYN_SBINDIR = 1,
+       DYN_BINDIR,
+       DYN_SWATDIR,
+       DYN_LMHOSTSFILE,
+       DYN_LIBDIR,
+       DYN_SHLIBEXT,
+       DYN_LOCKDIR,
+       DYN_PIDDIR,
+       DYN_SMB_PASSWD_FILE,
+       DYN_PRIVATE_DIR,
 };
 
-struct poptOption popt_common_log_base[] = {
-       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE, popt_common_callback },
-       { "log-basename", 'l', POPT_ARG_STRING, NULL, 'l', "Basename for log/debug files"},
-       { 0 }
+
+static void popt_dynconfig_callback(poptContext con,
+                          enum poptCallbackReason reason,
+                          const struct poptOption *opt,
+                          const char *arg, const void *data)
+{
+
+       switch (opt->val) {
+       case DYN_SBINDIR:
+               if (arg) {
+                       dyn_SBINDIR = SMB_STRDUP(arg);
+               }
+               break;
+
+       case DYN_BINDIR:
+               if (arg) {
+                       dyn_BINDIR = SMB_STRDUP(arg);
+               }
+               break;
+
+       case DYN_SWATDIR:
+               if (arg) {
+                       dyn_SWATDIR = SMB_STRDUP(arg);
+               }
+               break;
+
+       case DYN_LMHOSTSFILE:
+               if (arg) {
+                       pstrcpy(dyn_LMHOSTSFILE, arg);
+               }
+               break;
+
+       case DYN_LIBDIR:
+               if (arg) {
+                       pstrcpy(dyn_LIBDIR, arg);
+               }
+               break;
+
+       case DYN_SHLIBEXT:
+               if (arg) {
+                       fstrcpy(dyn_SHLIBEXT, arg);
+               }
+               break;
+
+       case DYN_LOCKDIR:
+               if (arg) {
+                       pstrcpy(dyn_LOCKDIR, arg);
+               }
+               break;
+
+       case DYN_PIDDIR:
+               if (arg) {
+                       pstrcpy(dyn_PIDDIR, arg);
+               }
+               break;
+
+       case DYN_SMB_PASSWD_FILE:
+               if (arg) {
+                       pstrcpy(dyn_SMB_PASSWD_FILE, arg);
+               }
+               break;
+
+       case DYN_PRIVATE_DIR:
+               if (arg) {
+                       pstrcpy(dyn_PRIVATE_DIR, arg);
+               }
+               break;
+
+       }
+}
+
+const struct poptOption popt_common_dynconfig[] = {
+
+       { NULL, '\0', POPT_ARG_CALLBACK, (void *)popt_dynconfig_callback },
+
+       { "sbindir", '\0' , POPT_ARG_STRING, NULL, DYN_SBINDIR,
+           "Path to sbin directory", "SBINDIR" },
+       { "bindir", '\0' , POPT_ARG_STRING, NULL, DYN_BINDIR,
+           "Path to bin directory", "BINDIR" },
+       { "swatdir", '\0' , POPT_ARG_STRING, NULL, DYN_SWATDIR,
+           "Path to SWAT installation directory", "SWATDIR" },
+       { "lmhostsfile", '\0' , POPT_ARG_STRING, NULL, DYN_LMHOSTSFILE,
+           "Path to lmhosts file", "LMHOSTSFILE" },
+       { "libdir", '\0' , POPT_ARG_STRING, NULL, DYN_LIBDIR,
+           "Path to shared library directory", "LIBDIR" },
+       { "shlibext", '\0' , POPT_ARG_STRING, NULL, DYN_SHLIBEXT,
+           "Shared library extension", "SHLIBEXT" },
+       { "lockdir", '\0' , POPT_ARG_STRING, NULL, DYN_LOCKDIR,
+           "Path to lock file directory", "LOCKDIR" },
+       { "piddir", '\0' , POPT_ARG_STRING, NULL, DYN_PIDDIR,
+           "Path to PID file directory", "PIDDIR" },
+       { "smb-passwd-file", '\0' , POPT_ARG_STRING, NULL, DYN_SMB_PASSWD_FILE,
+           "Path to smbpasswd file", "SMB_PASSWD_FILE" },
+       { "private-dir", '\0' , POPT_ARG_STRING, NULL, DYN_PRIVATE_DIR,
+           "Path to private data directory", "PRIVATE_DIR" },
+
+       POPT_TABLEEND
 };
 
 /****************************************************************************
@@ -255,7 +381,7 @@ static void get_credentials_file(const char *file, struct user_auth_info *info)
                else if (strwicmp("username", param) == 0)
                        pstrcpy(info->username, val);
                else if (strwicmp("domain", param) == 0)
-                       pstrcpy(info->workgroup,val);
+                       set_global_myworkgroup(val);
                memset(buf, 0, sizeof(buf));
        }
        x_fclose(auth);
@@ -263,23 +389,25 @@ static void get_credentials_file(const char *file, struct user_auth_info *info)
 
 /* Handle command line options:
  *             -U,--user
- *             -W,--workgroup
  *             -A,--authentication-file
  *             -k,--use-kerberos
  *             -N,--no-pass
+ *             -S,--signing
+ *              -P --machine-pass
  */
 
 
 static void popt_common_credentials_callback(poptContext con, 
-                                                                                        enum poptCallbackReason reason,
-                                                                                        const struct poptOption *opt,
-                                                                                        const char *arg, const void *data)
+                                       enum poptCallbackReason reason,
+                                       const struct poptOption *opt,
+                                       const char *arg, const void *data)
 {
        char *p;
 
        if (reason == POPT_CALLBACK_REASON_PRE) {
                cmdline_auth_info.use_kerberos = False;
                cmdline_auth_info.got_pass = False;
+               cmdline_auth_info.signing_state = Undefined;
                pstrcpy(cmdline_auth_info.username, "GUEST");   
 
                if (getenv("LOGNAME"))pstrcpy(cmdline_auth_info.username,getenv("LOGNAME"));
@@ -327,30 +455,71 @@ static void popt_common_credentials_callback(poptContext con,
                get_credentials_file(arg, &cmdline_auth_info);
                break;
 
-               case 'W':
-                       pstrcpy(cmdline_auth_info.workgroup,arg);
-                       break;
-
-               case 'k':
+       case 'k':
 #ifndef HAVE_KRB5
-                       d_printf("No kerberos support compiled in\n");
-                       exit(1);
+               d_printf("No kerberos support compiled in\n");
+               exit(1);
 #else
-                       cmdline_auth_info.got_pass = True;
+               cmdline_auth_info.use_kerberos = True;
+               cmdline_auth_info.got_pass = True;
 #endif
+               break;
 
-                       break;
+       case 'S':
+               {
+                       cmdline_auth_info.signing_state = -1;
+                       if (strequal(arg, "off") || strequal(arg, "no") || strequal(arg, "false"))
+                               cmdline_auth_info.signing_state = False;
+                       else if (strequal(arg, "on") || strequal(arg, "yes") || strequal(arg, "true") ||
+                                       strequal(arg, "auto") )
+                               cmdline_auth_info.signing_state = True;
+                       else if (strequal(arg, "force") || strequal(arg, "required") || strequal(arg, "forced"))
+                               cmdline_auth_info.signing_state = Required;
+                       else {
+                               fprintf(stderr, "Unknown signing option %s\n", arg );
+                               exit(1);
+                       }
                }
+               break;
+       case 'P':
+               {
+                       char *opt_password = NULL;
+                       /* it is very useful to be able to make ads queries as the
+                          machine account for testing purposes and for domain leave */
+                       
+                       if (!secrets_init()) {
+                               d_printf("ERROR: Unable to open secrets database\n");
+                               exit(1);
+                       }
+                       
+                       opt_password = secrets_fetch_machine_password(lp_workgroup(), NULL, NULL);
+                       
+                       if (!opt_password) {
+                               d_printf("ERROR: Unable to fetch machine password\n");
+                               exit(1);
+                       }
+                       pstr_sprintf(cmdline_auth_info.username, "%s$", 
+                                    global_myname());
+                       pstrcpy(cmdline_auth_info.password,opt_password);
+                       SAFE_FREE(opt_password);
+
+                       /* machine accounts only work with kerberos */
+                       cmdline_auth_info.use_kerberos = True;
+                       cmdline_auth_info.got_pass = True;
+               }
+               break;
        }
+}
 
 
 
-       struct poptOption popt_common_credentials[] = {
-               { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE, popt_common_credentials_callback },
-               { "user", 'U', POPT_ARG_STRING, NULL, 'U', "Set the network username", "USERNAME" },
-               { "no-pass", 'N', POPT_ARG_VAL, &cmdline_auth_info.got_pass, True, "Don't ask for a password" },
-               { "kerberos", 'k', POPT_ARG_VAL, &cmdline_auth_info.use_kerberos, True, "Use kerberos (active directory) authentication" },
-               { "authentication-file", 'A', POPT_ARG_STRING, NULL, 'A', "Get the credentials from a file", "FILE" },
-               { "workgroup", 'W', POPT_ARG_STRING, NULL, 'W', "Set the workgroup name", "WORKGROUP" },
-               { 0 }
-       };
+struct poptOption popt_common_credentials[] = {
+       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE, (void *)popt_common_credentials_callback },
+       { "user", 'U', POPT_ARG_STRING, NULL, 'U', "Set the network username", "USERNAME" },
+       { "no-pass", 'N', POPT_ARG_NONE, &cmdline_auth_info.got_pass, 0, "Don't ask for a password" },
+       { "kerberos", 'k', POPT_ARG_NONE, &cmdline_auth_info.use_kerberos, 'k', "Use kerberos (active directory) authentication" },
+       { "authentication-file", 'A', POPT_ARG_STRING, NULL, 'A', "Get the credentials from a file", "FILE" },
+       { "signing", 'S', POPT_ARG_STRING, NULL, 'S', "Set the client signing state", "on|off|required" },
+       {"machine-pass", 'P', POPT_ARG_NONE, NULL, 'P', "Use stored machine account password" },
+       POPT_TABLEEND
+};