Copyright (C) Stefan (metze) Metzmacher 2002
Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003.
Copyright (C) James Myers 2003 <myersjj@samba.org>
+ Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
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,
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 "version.h"
#include "dynconfig.h"
#include "system/time.h"
-#include "system/iconv.h"
-#include "system/network.h"
-#include "system/printing.h"
-#include "librpc/gen_ndr/ndr_svcctl.h"
-#include "librpc/gen_ndr/ndr_samr.h"
-#include "librpc/gen_ndr/ndr_nbt.h"
-#include "dlinklist.h"
+#include "system/locale.h"
+#include "system/network.h" /* needed for TCP_NODELAY */
+#include "smb_server/smb_server.h"
+#include "libcli/raw/signing.h"
+#include "lib/util/dlinklist.h"
#include "param/loadparm.h"
+#include "pstring.h"
-static BOOL bLoaded = False;
+static bool bLoaded = false;
-#ifndef GLOBAL_NAME
-#define GLOBAL_NAME "global"
-#endif
-
-#ifndef PRINTERS_NAME
-#define PRINTERS_NAME "printers"
-#endif
-
-#ifndef HOMES_NAME
-#define HOMES_NAME "homes"
-#endif
+#define standard_sub_basic strdup
/* some helpful bits */
-#define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
-#define VALID(i) ServicePtrs[i]->valid
-
-static BOOL do_parameter(const char *, const char *, void *);
-static BOOL do_parameter_var(const char *pszParmName, const char *fmt, ...);
+#define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && VALID(i))
+#define VALID(i) (ServicePtrs[i] != NULL)
-static BOOL defaults_saved = False;
+static bool do_parameter(const char *, const char *, void *);
+static bool do_parameter_var(const char *pszParmName, const char *fmt, ...);
+static bool defaults_saved = false;
struct param_opt {
struct param_opt *prev, *next;
*/
typedef struct
{
+ enum server_role server_role;
+
char **smb_ports;
- char *dos_charset;
- char *unix_charset;
char *ncalrpc_dir;
- char *display_charset;
char *szLockDir;
+ char *szModulesDir;
char *szPidDir;
char *szSetupDir;
char *szServerString;
char *szAutoServices;
char *szPasswdChat;
- char *szLogFile;
char *szConfigFile;
- char *szSMBPasswdFile;
+ char *szShareBackend;
char *szSAM_URL;
+ char *szSECRETS_URL;
char *szSPOOLSS_URL;
+ char *szWINS_CONFIG_URL;
char *szWINS_URL;
char *szPrivateDir;
char **jsInclude;
+ char *jsonrpcServicesDir;
char **szPasswordServers;
char *szSocketOptions;
char *szRealm;
char *szNetbiosScope;
char *szDomainOtherSIDs;
char **szNameResolveOrder;
- char *szPanicAction;
char **dcerpc_ep_servers;
char **server_services;
char *ntptr_providor;
char *szWinbindSeparator;
- char *swat_directory;
- BOOL tls_enabled;
+ char *szWinbinddSocketDirectory;
+ char *szTemplateShell;
+ char *szTemplateHomedir;
+ int bWinbindSealedPipes;
+ char *webapps_directory;
+ int tls_enabled;
char *tls_keyfile;
char *tls_certfile;
char *tls_cafile;
char *tls_crlfile;
+ char *tls_dhpfile;
int max_mux;
int max_xmit;
int pwordlevel;
- int maxprotocol;
- int minprotocol;
+ int srv_maxprotocol;
+ int srv_minprotocol;
+ int cli_maxprotocol;
+ int cli_minprotocol;
int security;
- char **AuthMethods;
- BOOL paranoid_server_security;
+ int paranoid_server_security;
int max_wins_ttl;
int min_wins_ttl;
int announce_as; /* This is initialised in init_globals */
int dgram_port;
int cldap_port;
int krb5_port;
+ int kpasswd_port;
int web_port;
char *socket_options;
- BOOL bWINSsupport;
- BOOL bLocalMaster;
- BOOL bPreferredMaster;
- BOOL bDomainMaster;
- BOOL bDomainLogons;
- BOOL bEncryptPasswords;
- BOOL bNullPasswords;
- BOOL bObeyPamRestrictions;
- BOOL bLargeReadwrite;
- BOOL bReadRaw;
- BOOL bWriteRaw;
- BOOL bTimeServer;
- BOOL bBindInterfacesOnly;
- BOOL bNTSmbSupport;
- BOOL bNTStatusSupport;
- BOOL bLanmanAuth;
- BOOL bNTLMAuth;
- BOOL bUseSpnego;
- int server_signing;
- int client_signing;
- BOOL bClientPlaintextAuth;
- BOOL bClientLanManAuth;
- BOOL bClientNTLMv2Auth;
- BOOL bHostMSDfs;
- BOOL bUnicode;
- BOOL bUnixExtensions;
- BOOL bDisableNetbios;
- BOOL bRpcBigEndian;
+ int bWINSsupport;
+ int bWINSdnsProxy;
+ char *szWINSHook;
+ int bLocalMaster;
+ int bPreferredMaster;
+ int bEncryptPasswords;
+ int bNullPasswords;
+ int bObeyPamRestrictions;
+ int bLargeReadwrite;
+ int bReadRaw;
+ int bWriteRaw;
+ int bTimeServer;
+ int bBindInterfacesOnly;
+ int bNTSmbSupport;
+ int bNTStatusSupport;
+ int bLanmanAuth;
+ int bNTLMAuth;
+ int bUseSpnego;
+ int server_signing;
+ int client_signing;
+ int bClientPlaintextAuth;
+ int bClientLanManAuth;
+ int bClientNTLMv2Auth;
+ int client_use_spnego_principal;
+ int bHostMSDfs;
+ int bUnicode;
+ int bUnixExtensions;
+ int bDisableNetbios;
+ int bRpcBigEndian;
struct param_opt *param_opt;
}
global;
*/
typedef struct
{
- BOOL valid;
char *szService;
char *szPath;
char *szCopy;
int iMaxPrintJobs;
int iMaxConnections;
int iCSCPolicy;
- BOOL bAvailable;
- BOOL bBrowseable;
- BOOL bRead_only;
- BOOL bPrint_ok;
- BOOL bMap_system;
- BOOL bMap_hidden;
- BOOL bMap_archive;
- BOOL bStrictLocking;
- BOOL *copymap;
- BOOL bMSDfsRoot;
- BOOL bStrictSync;
- BOOL bCIFileSystem;
+ int bAvailable;
+ int bBrowseable;
+ int bRead_only;
+ int bPrint_ok;
+ int bMap_system;
+ int bMap_hidden;
+ int bMap_archive;
+ int bStrictLocking;
+ int iCreate_mask;
+ int iCreate_force_mode;
+ int iDir_mask;
+ int iDir_force_mode;
+ int *copymap;
+ int bMSDfsRoot;
+ int bStrictSync;
+ int bCIFileSystem;
struct param_opt *param_opt;
char dummy[3]; /* for alignment */
/* This is a default service used to prime a services structure */
static service sDefault = {
- True, /* valid */
NULL, /* szService */
NULL, /* szPath */
NULL, /* szCopy */
False, /* bMap_hidden */
True, /* bMap_archive */
True, /* bStrictLocking */
+ 0744, /* iCreate_mask */
+ 0000, /* iCreate_force_mode */
+ 0755, /* iDir_mask */
+ 0000, /* iDir_force_mode */
NULL, /* copymap */
False, /* bMSDfsRoot */
False, /* bStrictSync */
static service **ServicePtrs = NULL;
static int iNumServices = 0;
static int iServiceIndex = 0;
-static BOOL bInGlobalSection = True;
-static int server_role;
-static int default_server_announce;
+static bool bInGlobalSection = True;
#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
/* prototypes for the special type handlers */
-static BOOL handle_include(const char *pszParmValue, char **ptr);
-static BOOL handle_copy(const char *pszParmValue, char **ptr);
-
-static void set_server_role(void);
-static void set_default_server_announce_type(void);
+static bool handle_include(const char *pszParmValue, char **ptr);
+static bool handle_copy(const char *pszParmValue, char **ptr);
static const struct enum_list enum_protocol[] = {
+ {PROTOCOL_SMB2, "SMB2"},
{PROTOCOL_NT1, "NT1"},
{PROTOCOL_LANMAN2, "LANMAN2"},
{PROTOCOL_LANMAN1, "LANMAN1"},
static const struct enum_list enum_security[] = {
{SEC_SHARE, "SHARE"},
{SEC_USER, "USER"},
- {SEC_SERVER, "SERVER"},
- {SEC_DOMAIN, "DOMAIN"},
-#ifdef HAVE_ADS
- {SEC_ADS, "ADS"},
-#endif
{-1, NULL}
};
-/* Types of machine we can announce as. */
-#define ANNOUNCE_AS_NT_SERVER 1
-#define ANNOUNCE_AS_WIN95 2
-#define ANNOUNCE_AS_WFW 3
-#define ANNOUNCE_AS_NT_WORKSTATION 4
-
static const struct enum_list enum_announce_as[] = {
{ANNOUNCE_AS_NT_SERVER, "NT"},
{ANNOUNCE_AS_NT_SERVER, "NT Server"},
{-1, NULL}
};
+static const struct enum_list enum_server_role[] = {
+ {ROLE_STANDALONE, "standalone"},
+ {ROLE_DOMAIN_MEMBER, "member server"},
+ {ROLE_DOMAIN_CONTROLLER, "domain controller"},
+ {-1, NULL}
+};
+
/* Note: We do not initialise the defaults union - it is not allowed in ANSI C
*
static struct parm_struct parm_table[] = {
{"Base Options", P_SEP, P_SEPARATOR},
- {"dos charset", P_STRING, P_GLOBAL, &Globals.dos_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
- {"unix charset", P_STRING, P_GLOBAL, &Globals.unix_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"server role", P_ENUM, P_GLOBAL, &Globals.server_role, NULL, enum_server_role, FLAG_BASIC},
+
+ {"dos charset", P_STRING, P_GLOBAL, &dos_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"unix charset", P_STRING, P_GLOBAL, &unix_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"ncalrpc dir", P_STRING, P_GLOBAL, &Globals.ncalrpc_dir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
- {"display charset", P_STRING, P_GLOBAL, &Globals.display_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"display charset", P_STRING, P_GLOBAL, &display_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
{"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
{"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_HIDE},
{"Security Options", P_SEP, P_SEPARATOR},
{"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
- {"auth methods", P_LIST, P_GLOBAL, &Globals.AuthMethods, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
{"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
{"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"password server", P_LIST, P_GLOBAL, &Globals.szPasswordServers, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
- {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"sam database", P_STRING, P_GLOBAL, &Globals.szSAM_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"secrets database", P_STRING, P_GLOBAL, &Globals.szSECRETS_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"spoolss database", P_STRING, P_GLOBAL, &Globals.szSPOOLSS_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"wins config database", P_STRING, P_GLOBAL, &Globals.szWINS_CONFIG_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"wins database", P_STRING, P_GLOBAL, &Globals.szWINS_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
-
{"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"client NTLMv2 auth", P_BOOL, P_GLOBAL, &Globals.bClientNTLMv2Auth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"client lanman auth", P_BOOL, P_GLOBAL, &Globals.bClientLanManAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"client plaintext auth", P_BOOL, P_GLOBAL, &Globals.bClientPlaintextAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"client use spnego principal", P_BOOL, P_GLOBAL, &Globals.client_use_spnego_principal, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE},
+ {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
+ {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
+ {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
+ {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
+
{"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
{"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
{"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_HIDE},
- {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"log file", P_STRING, P_GLOBAL, &logfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"Protocol Options", P_SEP, P_SEPARATOR},
{"dgram port", P_INTEGER, P_GLOBAL, &Globals.dgram_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"cldap port", P_INTEGER, P_GLOBAL, &Globals.cldap_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"krb5 port", P_INTEGER, P_GLOBAL, &Globals.krb5_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"kpasswd port", P_INTEGER, P_GLOBAL, &Globals.kpasswd_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"web port", P_INTEGER, P_GLOBAL, &Globals.web_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"tls enabled", P_BOOL, P_GLOBAL, &Globals.tls_enabled, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"tls keyfile", P_STRING, P_GLOBAL, &Globals.tls_keyfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"tls certfile", P_STRING, P_GLOBAL, &Globals.tls_certfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"tls cafile", P_STRING, P_GLOBAL, &Globals.tls_cafile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"tls crlfile", P_STRING, P_GLOBAL, &Globals.tls_crlfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
- {"swat directory", P_STRING, P_GLOBAL, &Globals.swat_directory, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"tls dh params file", P_STRING, P_GLOBAL, &Globals.tls_dhpfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"web application directory", P_STRING, P_GLOBAL, &Globals.webapps_directory, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_DEVELOPER},
- {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
- {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
+ {"server max protocol", P_ENUM, P_GLOBAL, &Globals.srv_maxprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
+ {"server min protocol", P_ENUM, P_GLOBAL, &Globals.srv_minprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
+ {"client max protocol", P_ENUM, P_GLOBAL, &Globals.cli_maxprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
+ {"client min protocol", P_ENUM, P_GLOBAL, &Globals.cli_minprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
{"unicode", P_BOOL, P_GLOBAL, &Globals.bUnicode, NULL, NULL, FLAG_DEVELOPER},
{"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, FLAG_DEVELOPER},
{"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, FLAG_DEVELOPER},
{"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, FLAG_DEVELOPER},
{"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, FLAG_DEVELOPER},
{"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
- {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"max xmit", P_BYTES, P_GLOBAL, &Globals.max_xmit, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"name resolve order", P_LIST, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
{"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"Logon Options", P_SEP, P_SEPARATOR},
- {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"Browse Options", P_SEP, P_SEPARATOR},
{"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
{"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
{"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
- {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
{"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
{"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE},
{"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
{"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
+ {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bWINSdnsProxy, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
+ {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED},
{"Locking Options", P_SEP, P_SEPARATOR},
{"Miscellaneous Options", P_SEP, P_SEPARATOR},
{"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
+ {"share backend", P_STRING, P_GLOBAL, &Globals.szShareBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_HIDE},
{"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"modules dir", P_STRING, P_GLOBAL, &Globals.szModulesDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"js include", P_LIST, P_GLOBAL, &Globals.jsInclude, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"jsonrpc services directory", P_STRING, P_GLOBAL, &Globals.jsonrpcServicesDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"setup directory", P_STRING, P_GLOBAL, &Globals.szSetupDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, FLAG_DEVELOPER},
- {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
-
{"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
{"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
{"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE },
{"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
- {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"panic action", P_STRING, P_GLOBAL, &panic_action, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
{"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
+ {"winbindd socket directory", P_STRING, P_GLOBAL, &Globals.szWinbinddSocketDirectory, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
+ {"winbind sealed pipes", P_BOOL, P_GLOBAL, &Globals.bWinbindSealedPipes, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
+ {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
+ {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
{NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
};
parm_table[i].type == P_USTRING) &&
parm_table[i].ptr &&
!(parm_table[i].flags & FLAG_CMDLINE)) {
- string_set(parm_table[i].ptr, "");
+ string_set(talloc_autofree_context(),
+ parm_table[i].ptr, "");
}
}
do_parameter("config file", dyn_CONFIGFILE, NULL);
+ do_parameter("share backend", "classic", NULL);
+
+ do_parameter("server role", "standalone", NULL);
+
/* options that can be set on the command line must be initialised via
the slower do_parameter() to ensure that FLAG_CMDLINE is obeyed */
#ifdef TCP_NODELAY
myname = get_myname();
do_parameter("netbios name", myname, NULL);
SAFE_FREE(myname);
- do_parameter("max protocol", "NT1", NULL);
do_parameter("name resolve order", "lmhosts wins host bcast", NULL);
do_parameter("fstype", FSTYPE_STRING, NULL);
do_parameter("ntvfs handler", "unixuid default", NULL);
do_parameter("max connections", "-1", NULL);
- do_parameter("dcerpc endpoint servers", "epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss drsuapi winreg dssetup", NULL);
- do_parameter("server services", "smb rpc nbt ldap cldap web kdc", NULL);
+ do_parameter("dcerpc endpoint servers", "epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss drsuapi winreg dssetup unixinfo", NULL);
+ do_parameter("server services", "smb rpc nbt wrepl ldap cldap web kdc drepl winbind", NULL);
do_parameter("ntptr providor", "simple_ldb", NULL);
- do_parameter("auth methods", "anonymous sam_ignoredomain", NULL);
- do_parameter("smb passwd file", dyn_SMB_PASSWD_FILE, NULL);
+ do_parameter("auth methods:domain controller", "anonymous sam_ignoredomain", NULL);
+ do_parameter("auth methods:member server", "anonymous sam winbind", NULL);
+ do_parameter("auth methods:standalone", "anonymous sam_ignoredomain", NULL);
do_parameter("private dir", dyn_PRIVATE_DIR, NULL);
do_parameter("sam database", "sam.ldb", NULL);
+ do_parameter("secrets database", "secrets.ldb", NULL);
do_parameter("spoolss database", "spoolss.ldb", NULL);
+ do_parameter("wins config database", "wins_config.ldb", NULL);
do_parameter("wins database", "wins.ldb", NULL);
do_parameter("registry:HKEY_LOCAL_MACHINE", "hklm.ldb", NULL);
do_parameter("pid directory", dyn_PIDDIR, NULL);
do_parameter("lock dir", dyn_LOCKDIR, NULL);
+ do_parameter("modules dir", dyn_MODULESDIR, NULL);
do_parameter("ncalrpc dir", dyn_NCALRPCDIR, NULL);
do_parameter("socket address", "0.0.0.0", NULL);
do_parameter("max xmit", "12288", NULL);
do_parameter("password level", "0", NULL);
do_parameter("LargeReadwrite", "True", NULL);
- do_parameter("minprotocol", "CORE", NULL);
+ do_parameter("server min protocol", "CORE", NULL);
+ do_parameter("server max protocol", "NT1", NULL);
+ do_parameter("client min protocol", "CORE", NULL);
+ do_parameter("client max protocol", "NT1", NULL);
do_parameter("security", "USER", NULL);
do_parameter("paranoid server security", "True", NULL);
do_parameter("EncryptPasswords", "True", NULL);
do_parameter("ClientLanManAuth", "True", NULL);
do_parameter("LanmanAuth", "True", NULL);
do_parameter("NTLMAuth", "True", NULL);
+ do_parameter("client use spnego principal", "False", NULL);
do_parameter("UnixExtensions", "False", NULL);
do_parameter("PreferredMaster", "Auto", NULL);
do_parameter("LocalMaster", "True", NULL);
- do_parameter("DomainMaster", "Auto", NULL); /* depending on bDomainLogons */
- do_parameter("DomainLogons", "False", NULL);
- do_parameter("WINSsupport", "False", NULL);
+
+ do_parameter("wins support", "False", NULL);
+ do_parameter("dns proxy", "True", NULL);
do_parameter("winbind separator", "\\", NULL);
+ do_parameter("winbind sealed pipes", "True", NULL);
+ do_parameter("winbindd socket directory", dyn_WINBINDD_SOCKET_DIR, NULL);
+ do_parameter("template shell", "/bin/false", NULL);
+ do_parameter("template homedir", "/home/%WORKGROUP%/%ACCOUNTNAME%", NULL);
do_parameter("client signing", "Yes", NULL);
do_parameter("server signing", "auto", NULL);
do_parameter("use spnego", "True", NULL);
- do_parameter("smb ports", SMB_PORTS, NULL);
+ do_parameter("smb ports", "445 139", NULL);
do_parameter("nbt port", "137", NULL);
do_parameter("dgram port", "138", NULL);
do_parameter("cldap port", "389", NULL);
do_parameter("krb5 port", "88", NULL);
+ do_parameter("kpasswd port", "464", NULL);
do_parameter("web port", "901", NULL);
- do_parameter("swat directory", dyn_SWATDIR, NULL);
+ do_parameter("web application directory", dyn_WEBAPPSDIR, NULL);
+ do_parameter("jsonrpc services directory", dyn_SERVICESDIR, NULL);
do_parameter("nt status support", "True", NULL);
- do_parameter("max wins ttl", "432000", NULL);
+ do_parameter("max wins ttl", "518400", NULL); /* 6 days */
do_parameter("min wins ttl", "10", NULL);
do_parameter("tls enabled", "True", NULL);
do_parameter("tls keyfile", "tls/key.pem", NULL);
do_parameter("tls certfile", "tls/cert.pem", NULL);
do_parameter("tls cafile", "tls/ca.pem", NULL);
- do_parameter_var("js include", "%s/js", dyn_LIBDIR);
- do_parameter_var("setup directory", "%s/setup", dyn_LIBDIR);
+ do_parameter_var("js include", "%s", dyn_JSDIR);
+ do_parameter_var("setup directory", "%s", dyn_SETUPDIR);
+
+ for (i = 0; parm_table[i].label; i++) {
+ if (!(parm_table[i].flags & FLAG_CMDLINE)) {
+ parm_table[i].flags |= FLAG_DEFAULT;
+ }
+ }
}
static TALLOC_CTX *lp_talloc;
if (!s)
*ret = 0;
else
- StrnCpy(ret, s, len);
+ strlcpy(ret, s, len);
if (trim_string(ret, "\"", "\"")) {
if (strchr(ret,'"') != NULL)
- StrnCpy(ret, s, len);
+ strlcpy(ret, s, len);
}
standard_sub_basic(ret,len+100);
#define FN_GLOBAL_LIST(fn_name,ptr) \
const char **fn_name(void) {return(*(const char ***)(ptr));}
#define FN_GLOBAL_BOOL(fn_name,ptr) \
- BOOL fn_name(void) {return(*(BOOL *)(ptr));}
+ BOOL fn_name(void) {return((BOOL)*(int *)(ptr));}
+#if 0 /* unused */
#define FN_GLOBAL_CHAR(fn_name,ptr) \
char fn_name(void) {return(*(char *)(ptr));}
+#endif
#define FN_GLOBAL_INTEGER(fn_name,ptr) \
int fn_name(void) {return(*(int *)(ptr));}
const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
#define FN_LOCAL_BOOL(fn_name,val) \
BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
+#if 0 /* unused */
#define FN_LOCAL_CHAR(fn_name,val) \
char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
+#endif
#define FN_LOCAL_INTEGER(fn_name,val) \
int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
-FN_GLOBAL_LIST(lp_smb_ports, &Globals.smb_ports)
-FN_GLOBAL_INTEGER(lp_nbt_port, &Globals.nbt_port)
-FN_GLOBAL_INTEGER(lp_dgram_port, &Globals.dgram_port)
-FN_GLOBAL_INTEGER(lp_cldap_port, &Globals.cldap_port)
-FN_GLOBAL_INTEGER(lp_krb5_port, &Globals.krb5_port)
-FN_GLOBAL_INTEGER(lp_web_port, &Globals.web_port)
-FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
-FN_GLOBAL_STRING(lp_swat_directory, &Globals.swat_directory)
-FN_GLOBAL_BOOL(lp_tls_enabled, &Globals.tls_enabled)
-FN_GLOBAL_STRING(lp_tls_keyfile, &Globals.tls_keyfile)
-FN_GLOBAL_STRING(lp_tls_certfile, &Globals.tls_certfile)
-FN_GLOBAL_STRING(lp_tls_cafile, &Globals.tls_cafile)
-FN_GLOBAL_STRING(lp_tls_crlfile, &Globals.tls_crlfile)
-FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
-FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
-FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
-FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
-FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
-FN_GLOBAL_STRING(lp_sam_url, &Globals.szSAM_URL)
-FN_GLOBAL_STRING(lp_spoolss_url, &Globals.szSPOOLSS_URL)
-FN_GLOBAL_STRING(lp_wins_url, &Globals.szWINS_URL)
-FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
-FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
-FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
-FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
-FN_GLOBAL_STRING(lp_setupdir, &Globals.szSetupDir)
-FN_GLOBAL_STRING(lp_ncalrpc_dir, &Globals.ncalrpc_dir)
-FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
-FN_GLOBAL_LIST(lp_dcerpc_endpoint_servers, &Globals.dcerpc_ep_servers)
-FN_GLOBAL_LIST(lp_server_services, &Globals.server_services)
-FN_GLOBAL_STRING(lp_ntptr_providor, &Globals.ntptr_providor)
-FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
-FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
-FN_GLOBAL_LIST(lp_passwordserver, &Globals.szPasswordServers)
-FN_GLOBAL_LIST(lp_name_resolve_order, &Globals.szNameResolveOrder)
-FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
-FN_GLOBAL_STRING(lp_socket_options, &Globals.socket_options)
-FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkgroup)
-FN_GLOBAL_STRING(lp_netbios_name, &Globals.szNetbiosName)
-FN_GLOBAL_STRING(lp_netbios_scope, &Globals.szNetbiosScope)
-FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
-FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
-FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
-FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
-FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
-
-FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
-FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
-FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
-FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
-FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
-FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
-FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
-FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
-FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
-FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
-static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
-FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
-FN_GLOBAL_BOOL(lp_unicode, &Globals.bUnicode)
-FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
-FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
-FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
-FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
-FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
-FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
-FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
-FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
-FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
-FN_GLOBAL_BOOL(lp_rpc_big_endian, &Globals.bRpcBigEndian)
-FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
-FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
-FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
-FN_GLOBAL_INTEGER(lp_max_xmit, &Globals.max_xmit)
-FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
-FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
-FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
-FN_GLOBAL_INTEGER(lp_security, &Globals.security)
-FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
-FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
-static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
-FN_GLOBAL_LIST(lp_js_include, &Globals.jsInclude)
-
-
-FN_LOCAL_STRING(lp_servicename, szService)
-FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
-FN_LOCAL_STRING(lp_pathname, szPath)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_server_role, &Globals.server_role)
+_PUBLIC_ FN_GLOBAL_LIST(lp_smb_ports, &Globals.smb_ports)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_nbt_port, &Globals.nbt_port)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_dgram_port, &Globals.dgram_port)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_cldap_port, &Globals.cldap_port)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_krb5_port, &Globals.krb5_port)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_kpasswd_port, &Globals.kpasswd_port)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_web_port, &Globals.web_port)
+_PUBLIC_ FN_GLOBAL_STRING(lp_dos_charset, &dos_charset)
+_PUBLIC_ FN_GLOBAL_STRING(lp_webapps_directory, &Globals.webapps_directory)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_tls_enabled, &Globals.tls_enabled)
+_PUBLIC_ FN_GLOBAL_STRING(lp_tls_keyfile, &Globals.tls_keyfile)
+_PUBLIC_ FN_GLOBAL_STRING(lp_tls_certfile, &Globals.tls_certfile)
+_PUBLIC_ FN_GLOBAL_STRING(lp_tls_cafile, &Globals.tls_cafile)
+_PUBLIC_ FN_GLOBAL_STRING(lp_tls_crlfile, &Globals.tls_crlfile)
+_PUBLIC_ FN_GLOBAL_STRING(lp_tls_dhpfile, &Globals.tls_dhpfile)
+_PUBLIC_ FN_GLOBAL_STRING(lp_unix_charset, &unix_charset)
+_PUBLIC_ FN_GLOBAL_STRING(lp_display_charset, &display_charset)
+_PUBLIC_ FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
+_PUBLIC_ FN_GLOBAL_STRING(lp_share_backend, &Globals.szShareBackend)
+_PUBLIC_ FN_GLOBAL_STRING(lp_sam_url, &Globals.szSAM_URL)
+_PUBLIC_ FN_GLOBAL_STRING(lp_secrets_url, &Globals.szSECRETS_URL)
+_PUBLIC_ FN_GLOBAL_STRING(lp_spoolss_url, &Globals.szSPOOLSS_URL)
+_PUBLIC_ FN_GLOBAL_STRING(lp_wins_config_url, &Globals.szWINS_CONFIG_URL)
+_PUBLIC_ FN_GLOBAL_STRING(lp_wins_url, &Globals.szWINS_URL)
+_PUBLIC_ FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
+_PUBLIC_ FN_GLOBAL_CONST_STRING(lp_winbindd_socket_directory, &Globals.szWinbinddSocketDirectory)
+_PUBLIC_ FN_GLOBAL_CONST_STRING(lp_template_shell, &Globals.szTemplateShell)
+_PUBLIC_ FN_GLOBAL_CONST_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_winbind_sealed_pipes, &Globals.bWinbindSealedPipes)
+_PUBLIC_ FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
+_PUBLIC_ FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
+_PUBLIC_ FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
+_PUBLIC_ FN_GLOBAL_STRING(lp_modulesdir, &Globals.szModulesDir)
+_PUBLIC_ FN_GLOBAL_STRING(lp_setupdir, &Globals.szSetupDir)
+_PUBLIC_ FN_GLOBAL_STRING(lp_ncalrpc_dir, &Globals.ncalrpc_dir)
+_PUBLIC_ FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
+_PUBLIC_ FN_GLOBAL_LIST(lp_dcerpc_endpoint_servers, &Globals.dcerpc_ep_servers)
+_PUBLIC_ FN_GLOBAL_LIST(lp_server_services, &Globals.server_services)
+_PUBLIC_ FN_GLOBAL_STRING(lp_ntptr_providor, &Globals.ntptr_providor)
+_PUBLIC_ FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
+_PUBLIC_ FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
+_PUBLIC_ FN_GLOBAL_LIST(lp_passwordserver, &Globals.szPasswordServers)
+_PUBLIC_ FN_GLOBAL_LIST(lp_name_resolve_order, &Globals.szNameResolveOrder)
+_PUBLIC_ FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
+_PUBLIC_ FN_GLOBAL_STRING(lp_socket_options, &Globals.socket_options)
+_PUBLIC_ FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkgroup)
+_PUBLIC_ FN_GLOBAL_STRING(lp_netbios_name, &Globals.szNetbiosName)
+_PUBLIC_ FN_GLOBAL_STRING(lp_netbios_scope, &Globals.szNetbiosScope)
+_PUBLIC_ FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
+_PUBLIC_ FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
+_PUBLIC_ FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
+_PUBLIC_ FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
+
+_PUBLIC_ FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_wins_dns_proxy, &Globals.bWINSdnsProxy)
+_PUBLIC_ FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_unicode, &Globals.bUnicode)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_client_use_spnego_principal, &Globals.client_use_spnego_principal)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_rpc_big_endian, &Globals.bRpcBigEndian)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_max_xmit, &Globals.max_xmit)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_srv_maxprotocol, &Globals.srv_maxprotocol)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_srv_minprotocol, &Globals.srv_minprotocol)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_cli_maxprotocol, &Globals.cli_maxprotocol)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_cli_minprotocol, &Globals.cli_minprotocol)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_security, &Globals.security)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
+_PUBLIC_ FN_GLOBAL_LIST(lp_js_include, &Globals.jsInclude)
+_PUBLIC_ FN_GLOBAL_STRING(lp_jsonrpc_services_dir, &Globals.jsonrpcServicesDir)
+_PUBLIC_
+_PUBLIC_
+_PUBLIC_ FN_LOCAL_STRING(lp_servicename, szService)
+_PUBLIC_ FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
+_PUBLIC_ FN_LOCAL_STRING(lp_pathname, szPath)
static FN_LOCAL_STRING(_lp_printername, szPrintername)
-FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
-FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
-FN_LOCAL_STRING(lp_comment, comment)
-FN_LOCAL_STRING(lp_fstype, fstype)
+_PUBLIC_ FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
+_PUBLIC_ FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
+_PUBLIC_ FN_LOCAL_STRING(lp_comment, comment)
+_PUBLIC_ FN_LOCAL_STRING(lp_fstype, fstype)
static FN_LOCAL_STRING(lp_volume, volume)
-FN_LOCAL_LIST(lp_ntvfs_handler, ntvfs_handler)
-FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
-FN_LOCAL_BOOL(lp_browseable, bBrowseable)
-FN_LOCAL_BOOL(lp_readonly, bRead_only)
-FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
-FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
-FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
-FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
-FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
-FN_LOCAL_BOOL(lp_ci_filesystem, bCIFileSystem)
-FN_LOCAL_BOOL(lp_map_system, bMap_system)
-FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
-FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
-FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
-FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
+_PUBLIC_ FN_LOCAL_LIST(lp_ntvfs_handler, ntvfs_handler)
+_PUBLIC_ FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
+_PUBLIC_ FN_LOCAL_BOOL(lp_browseable, bBrowseable)
+_PUBLIC_ FN_LOCAL_BOOL(lp_readonly, bRead_only)
+_PUBLIC_ FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
+_PUBLIC_ FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
+_PUBLIC_ FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
+_PUBLIC_ FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
+_PUBLIC_ FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
+_PUBLIC_ FN_LOCAL_BOOL(lp_ci_filesystem, bCIFileSystem)
+_PUBLIC_ FN_LOCAL_BOOL(lp_map_system, bMap_system)
+_PUBLIC_ FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
+_PUBLIC_ FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
+_PUBLIC_ FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
+_PUBLIC_ FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
+_PUBLIC_ FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
+_PUBLIC_ FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
+_PUBLIC_ FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
/* local prototypes */
static int map_parameter(const char *pszParmName);
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue);
static int getservicebyname(const char *pszServiceName,
service * pserviceDest);
static void copy_service(service * pserviceDest,
- service * pserviceSource, BOOL *pcopymapDest);
-static BOOL service_ok(int iService);
-static BOOL do_section(const char *pszSectionName, void *);
+ service * pserviceSource, int *pcopymapDest);
+static bool service_ok(int iService);
+static bool do_section(const char *pszSectionName, void *);
static void init_copymap(service * pservice);
/* This is a helper function for parametrical options support. */
char *vfskey;
struct param_opt *data;
- if (lookup_service >= iNumServices) return NULL;
+ if (lookup_service >= 0 && !LP_SNUM_OK(lookup_service))
+ return NULL;
data = (lookup_service < 0) ?
Globals.param_opt : ServicePtrs[lookup_service]->param_opt;
if (!s) {
DEBUG(0,("lp_int(%s): is called with NULL!\n",s));
- return (-1);
+ return -1;
}
return strtol(s, NULL, 0);
if (!s) {
DEBUG(0,("lp_int(%s): is called with NULL!\n",s));
- return (-1);
+ return -1;
}
return strtoul(s, NULL, 0);
}
+/*******************************************************************
+convenience routine to return unsigned long parameters.
+********************************************************************/
+static double lp_double(const char *s)
+{
+
+ if (!s) {
+ DEBUG(0,("lp_double(%s): is called with NULL!\n",s));
+ return -1;
+ }
+
+ return strtod(s, NULL);
+}
+
/*******************************************************************
convenience routine to return boolean parameters.
********************************************************************/
return False;
}
- if (!set_boolean(&ret,s)) {
+ if (!set_boolean(s, &ret)) {
DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
return False;
}
return default_v;
}
+/* Return parametric option from a given service. Type is a part of
+ * option before ':'.
+ * Parametric option has following syntax: 'Type: option = value'.
+ */
+
+int lp_parm_bytes(int lookup_service, const char *type, const char *option, int default_v)
+{
+ uint64_t bval;
+
+ const char *value = lp_get_parametric(lookup_service, type, option);
+
+ if (value && conv_str_size(value, &bval)) {
+ if (bval <= INT_MAX) {
+ return (int)bval;
+ }
+ }
+
+ return default_v;
+}
+
/* Return parametric option from a given service. Type is a part of option before ':' */
/* Parametric option has following syntax: 'Type: option = value' */
return default_v;
}
+
+double lp_parm_double(int lookup_service, const char *type, const char *option, double default_v)
+{
+ const char *value = lp_get_parametric(lookup_service, type, option);
+
+ if (value)
+ return lp_double(value);
+
+ return default_v;
+}
+
/* Return parametric option from a given service. Type is a part of option before ':' */
/* Parametric option has following syntax: 'Type: option = value' */
Initialise a service to the defaults.
***************************************************************************/
-static void init_service(service * pservice)
+static service *init_service(TALLOC_CTX *mem_ctx)
{
+ service *pservice = talloc(mem_ctx, service);
memset((char *)pservice, '\0', sizeof(service));
copy_service(pservice, &sDefault, NULL);
+ return pservice;
+}
+
+void string_free(char **str)
+{
+ if (str) {
+ talloc_free(*str);
+ *str = NULL;
+ }
}
/***************************************************************************
/* They will be added during parsing again */
data = ServicePtrs[i]->param_opt;
while (data) {
- string_free(&data->key);
- string_free(&data->value);
pdata = data->next;
- SAFE_FREE(data);
+ talloc_free(data);
data = pdata;
}
ServicePtrs[i]->param_opt = NULL;
- return (i);
+ return i;
}
}
/* find an invalid one */
for (i = 0; i < iNumServices; i++)
- if (!ServicePtrs[i]->valid)
+ if (ServicePtrs[i] == NULL)
break;
/* if not, then create one */
if (!tsp) {
DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
- return (-1);
+ return -1;
}
else {
ServicePtrs = tsp;
- ServicePtrs[iNumServices] = malloc_p(service);
- }
- if (!ServicePtrs[iNumServices]) {
- DEBUG(0,("add_a_service: out of memory!\n"));
- return (-1);
+ ServicePtrs[iNumServices] = NULL;
}
iNumServices++;
- } else
- free_service(ServicePtrs[i]);
-
- ServicePtrs[i]->valid = True;
+ }
- init_service(ServicePtrs[i]);
+ ServicePtrs[i] = init_service(talloc_autofree_context());
+ if (ServicePtrs[i] == NULL) {
+ DEBUG(0,("add_a_service: out of memory!\n"));
+ return -1;
+ }
copy_service(ServicePtrs[i], &tservice, NULL);
- if (name)
- string_set(&ServicePtrs[i]->szService, name);
- return (i);
+ if (name != NULL)
+ string_set(ServicePtrs[i], &ServicePtrs[i]->szService, name);
+ return i;
}
/***************************************************************************
i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
if (i < 0)
- return (False);
+ return false;
if (!(*(ServicePtrs[iDefaultService]->szPath))
|| strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(-1))) {
string_sub(newHomedir,"%H", pszHomedir, sizeof(newHomedir));
}
- string_set(&ServicePtrs[i]->szPath, newHomedir);
+ string_set(ServicePtrs[i], &ServicePtrs[i]->szPath, newHomedir);
if (!(*(ServicePtrs[i]->comment))) {
- pstring comment;
- slprintf(comment, sizeof(comment) - 1,
+ char *comment = talloc_asprintf(ServicePtrs[i],
"Home directory of %s", user);
- string_set(&ServicePtrs[i]->comment, comment);
+ string_set(ServicePtrs[i], &ServicePtrs[i]->comment, comment);
+ talloc_free(comment);
}
ServicePtrs[i]->bAvailable = sDefault.bAvailable;
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename,
user, newHomedir));
- return (True);
+ return true;
}
/***************************************************************************
int lp_add_service(const char *pszService, int iDefaultService)
{
- return (add_a_service(ServicePtrs[iDefaultService], pszService));
+ return add_a_service(ServicePtrs[iDefaultService], pszService);
}
/***************************************************************************
Add the IPC service.
***************************************************************************/
-static BOOL lp_add_hidden(const char *name, const char *fstype)
+static bool lp_add_hidden(const char *name, const char *fstype)
{
- pstring comment;
+ char *comment = NULL;
int i = add_a_service(&sDefault, name);
if (i < 0)
- return (False);
+ return false;
- slprintf(comment, sizeof(comment) - 1,
- "%s Service (%s)", fstype, Globals.szServerString);
+ string_set(ServicePtrs[i], &ServicePtrs[i]->szPath, tmpdir());
- string_set(&ServicePtrs[i]->szPath, tmpdir());
- string_set(&ServicePtrs[i]->comment, comment);
- string_set(&ServicePtrs[i]->fstype, fstype);
+ asprintf(&comment, "%s Service (%s)", fstype, Globals.szServerString);
+ if (comment == NULL)
+ return false;
+
+ string_set(ServicePtrs[i], &ServicePtrs[i]->comment, comment);
+ SAFE_FREE(comment);
+ string_set(ServicePtrs[i], &ServicePtrs[i]->fstype, fstype);
ServicePtrs[i]->iMaxConnections = -1;
- ServicePtrs[i]->bAvailable = True;
- ServicePtrs[i]->bRead_only = True;
- ServicePtrs[i]->bPrint_ok = False;
- ServicePtrs[i]->bBrowseable = False;
+ ServicePtrs[i]->bAvailable = true;
+ ServicePtrs[i]->bRead_only = true;
+ ServicePtrs[i]->bPrint_ok = false;
+ ServicePtrs[i]->bBrowseable = false;
if (strcasecmp(fstype, "IPC") == 0) {
lp_do_parameter(i, "ntvfs handler", "default");
DEBUG(3, ("adding hidden service %s\n", name));
- return (True);
+ return true;
}
/***************************************************************************
Add a new printer service, with defaults coming from service iFrom.
***************************************************************************/
-BOOL lp_add_printer(const char *pszPrintername, int iDefaultService)
+bool lp_add_printer(const char *pszPrintername, int iDefaultService)
{
const char *comment = "From Printcap";
int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
if (i < 0)
- return (False);
+ return false;
/* note that we do NOT default the availability flag to True - */
/* we take it from the default service passed. This allows all */
/* entry (if/when the 'available' keyword is implemented!). */
/* the printer name is set to the service name. */
- string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
- string_set(&ServicePtrs[i]->comment, comment);
+ string_set(ServicePtrs[i], &ServicePtrs[i]->szPrintername,
+ pszPrintername);
+ string_set(ServicePtrs[i], &ServicePtrs[i]->comment, comment);
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
/* Printers cannot be read_only. */
ServicePtrs[i]->bRead_only = False;
DEBUG(3, ("adding printer service %s\n", pszPrintername));
- update_server_announce_as_printserver();
-
- return (True);
+ return true;
}
/***************************************************************************
int iIndex;
if (*pszParmName == '-')
- return (-1);
+ return -1;
for (iIndex = 0; parm_table[iIndex].label; iIndex++)
if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
- return (iIndex);
+ return iIndex;
/* Warn only if it isn't parametric option */
if (strchr(pszParmName, ':') == NULL)
/* We do return 'fail' for parametric options as well because they are
stored in different storage
*/
- return (-1);
+ return -1;
}
return ((char *)ServicePtrs[snum]) + PTR_DIFF(parm->ptr, &sDefault);
}
-/***************************************************************************
- Set a boolean variable from the text value stored in the passed string.
- Returns True in success, False if the passed string does not correctly
- represent a boolean.
-***************************************************************************/
-
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
-{
- BOOL bRetval;
-
- bRetval = True;
- if (strwicmp(pszParmValue, "yes") == 0 ||
- strwicmp(pszParmValue, "true") == 0 ||
- strwicmp(pszParmValue, "1") == 0)
- *pb = True;
- else if (strwicmp(pszParmValue, "no") == 0 ||
- strwicmp(pszParmValue, "False") == 0 ||
- strwicmp(pszParmValue, "0") == 0)
- *pb = False;
- else {
- DEBUG(0,
- ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
- pszParmValue));
- bRetval = False;
- }
- return (bRetval);
-}
-
/***************************************************************************
Find a service by name. Otherwise works like get_service.
***************************************************************************/
break;
}
- return (iService);
+ return iService;
}
/***************************************************************************
If pcopymapDest is NULL then copy all fields
***************************************************************************/
-static void copy_service(service * pserviceDest, service * pserviceSource, BOOL *pcopymapDest)
+static void copy_service(service *pserviceDest, service *pserviceSource,
+ int *pcopymapDest)
{
int i;
- BOOL bcopyall = (pcopymapDest == NULL);
+ bool bcopyall = (pcopymapDest == NULL);
struct param_opt *data, *pdata, *paramo;
- BOOL not_added;
+ bool not_added;
for (i = 0; parm_table[i].label; i++)
if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
switch (parm_table[i].type) {
case P_BOOL:
- *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
+ *(int *)dest_ptr = *(int *)src_ptr;
break;
case P_INTEGER:
+ case P_OCTAL:
case P_ENUM:
*(int *)dest_ptr = *(int *)src_ptr;
break;
case P_STRING:
- string_set(dest_ptr,
+ string_set(pserviceDest, dest_ptr,
*(char **)src_ptr);
break;
case P_USTRING:
- string_set(dest_ptr,
+ string_set(pserviceDest, dest_ptr,
*(char **)src_ptr);
strupper(*(char **)dest_ptr);
break;
if (pserviceSource->copymap)
memcpy((void *)pserviceDest->copymap,
(void *)pserviceSource->copymap,
- sizeof(BOOL) * NUMPARAMETERS);
+ sizeof(int) * NUMPARAMETERS);
}
data = pserviceSource->param_opt;
/* If we already have same option, override it */
if (strcmp(pdata->key, data->key) == 0) {
string_free(&pdata->value);
- pdata->value = strdup(data->value);
- not_added = False;
+ pdata->value = talloc_reference(pdata,
+ data->value);
+ not_added = false;
break;
}
pdata = pdata->next;
}
if (not_added) {
- paramo = smb_xmalloc_p(struct param_opt);
- paramo->key = strdup(data->key);
- paramo->value = strdup(data->value);
+ paramo = talloc(pserviceDest, struct param_opt);
+ if (paramo == NULL)
+ smb_panic("OOM");
+ paramo->key = talloc_reference(paramo, data->key);
+ paramo->value = talloc_reference(paramo, data->value);
DLIST_ADD(pserviceDest->param_opt, paramo);
}
data = data->next;
DEBUG(0, ("WARNING: [%s] service MUST be printable!\n",
ServicePtrs[iService]->szService));
ServicePtrs[iService]->bPrint_ok = True;
- update_server_announce_as_printserver();
}
/* [printers] service must also be non-browsable. */
if (ServicePtrs[iService]->bBrowseable)
DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
ServicePtrs[iService]->szService));
- return (bRetval);
+ return bRetval;
}
static struct file_lists {
DEBUG(6, ("lp_file_list_changed()\n"));
while (f) {
- pstring n2;
+ char *n2;
time_t mod_time;
- pstrcpy(n2, f->name);
- standard_sub_basic(n2,sizeof(n2));
+ n2 = standard_sub_basic(f->name);
DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
f->name, n2, ctime(&f->modtime)));
f->modtime = mod_time;
SAFE_FREE(f->subfname);
f->subfname = strdup(n2);
- return (True);
+ return true;
}
f = f->next;
}
- return (False);
+ return false;
}
/***************************************************************************
Handle the include operation.
***************************************************************************/
-static BOOL handle_include(const char *pszParmValue, char **ptr)
+static bool handle_include(const char *pszParmValue, char **ptr)
{
- pstring fname;
- pstrcpy(fname, pszParmValue);
-
- standard_sub_basic(fname,sizeof(fname));
+ char *fname = standard_sub_basic(pszParmValue);
add_to_file_list(pszParmValue, fname);
- string_set(ptr, fname);
+ string_set(talloc_autofree_context(), ptr, fname);
if (file_exist(fname))
- return (pm_process(fname, do_section, do_parameter, NULL));
+ return pm_process(fname, do_section, do_parameter, NULL);
DEBUG(2, ("Can't find include file %s\n", fname));
- return (False);
+ return false;
}
/***************************************************************************
Handle the interpretation of the copy parameter.
***************************************************************************/
-static BOOL handle_copy(const char *pszParmValue, char **ptr)
+static bool handle_copy(const char *pszParmValue, char **ptr)
{
- BOOL bRetval;
+ bool bRetval;
int iTemp;
- service serviceTemp;
+ service *serviceTemp;
- string_set(ptr, pszParmValue);
+ string_set(talloc_autofree_context(), ptr, pszParmValue);
- init_service(&serviceTemp);
+ serviceTemp = init_service(talloc_autofree_context());
- bRetval = False;
+ bRetval = false;
DEBUG(3, ("Copying service from service %s\n", pszParmValue));
- if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0) {
+ if ((iTemp = getservicebyname(pszParmValue, serviceTemp)) >= 0) {
if (iTemp == iServiceIndex) {
DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue));
} else {
copy_service(ServicePtrs[iServiceIndex],
- &serviceTemp,
+ serviceTemp,
ServicePtrs[iServiceIndex]->copymap);
- bRetval = True;
+ bRetval = true;
}
} else {
DEBUG(0, ("Unable to copy service - source not found: %s\n", pszParmValue));
- bRetval = False;
+ bRetval = false;
}
- free_service(&serviceTemp);
- return (bRetval);
+ free_service(serviceTemp);
+ return bRetval;
}
/***************************************************************************
{
int i;
SAFE_FREE(pservice->copymap);
- pservice->copymap = malloc_array_p(BOOL, NUMPARAMETERS);
+ pservice->copymap = malloc_array_p(int, NUMPARAMETERS);
if (!pservice->copymap)
DEBUG(0,
("Couldn't allocate copymap!! (size %d)\n",
pservice->copymap[i] = True;
}
+#if 0 /* not used anywhere */
/***************************************************************************
Return the local pointer to a parameter given the service number and the
pointer into the default structure.
{
return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
}
-
+#endif
/***************************************************************************
Process a parametric option
***************************************************************************/
-static BOOL lp_do_parameter_parametric(int snum, const char *pszParmName, const char *pszParmValue, int flags)
+static bool lp_do_parameter_parametric(int snum, const char *pszParmName,
+ const char *pszParmValue, int flags)
{
struct param_opt *paramo, *data;
char *name;
+ TALLOC_CTX *mem_ctx;
while (isspace((unsigned char)*pszParmName)) {
pszParmName++;
if (snum < 0) {
data = Globals.param_opt;
+ mem_ctx = talloc_autofree_context();
} else {
data = ServicePtrs[snum]->param_opt;
+ mem_ctx = ServicePtrs[snum];
}
/* Traverse destination */
return True;
}
- free(paramo->value);
- paramo->value = strdup(pszParmValue);
+ talloc_free(paramo->value);
+ paramo->value = talloc_strdup(paramo, pszParmValue);
paramo->flags = flags;
free(name);
return True;
}
}
- paramo = smb_xmalloc_p(struct param_opt);
- paramo->key = strdup(name);
- paramo->value = strdup(pszParmValue);
+ paramo = talloc(mem_ctx, struct param_opt);
+ if (!paramo)
+ smb_panic("OOM");
+ paramo->key = talloc_strdup(paramo, name);
+ paramo->value = talloc_strdup(paramo, pszParmValue);
paramo->flags = flags;
if (snum < 0) {
DLIST_ADD(Globals.param_opt, paramo);
free(name);
- return True;
+ return true;
}
/***************************************************************************
Process a parameter for a particular service number. If snum < 0
then assume we are in the globals.
***************************************************************************/
-BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
+bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
{
int parmnum, i;
void *parm_ptr = NULL; /* where we are going to store the result */
void *def_ptr = NULL;
+ TALLOC_CTX *mem_ctx;
parmnum = map_parameter(pszParmName);
return lp_do_parameter_parametric(snum, pszParmName, pszParmValue, 0);
}
DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName));
- return (True);
+ return true;
}
if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
/* we might point at a service, the default service or a global */
if (snum < 0) {
parm_ptr = def_ptr;
+ mem_ctx = talloc_autofree_context();
} else {
if (parm_table[parmnum].class == P_GLOBAL) {
DEBUG(0,
("Global parameter %s found in service section!\n",
pszParmName));
- return (True);
+ return true;
}
parm_ptr =
((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
&sDefault);
+ mem_ctx = ServicePtrs[snum];
}
if (snum >= 0) {
/* if it is a special case then go ahead */
if (parm_table[parmnum].special) {
parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
- return (True);
+ return true;
}
/* now switch on the type of variable it is */
switch (parm_table[parmnum].type)
{
- case P_BOOL:
- set_boolean(parm_ptr, pszParmValue);
+ case P_BOOL: {
+ BOOL b;
+ if (!set_boolean(pszParmValue, &b)) {
+ DEBUG(0,("lp_do_parameter(%s): value is not boolean!\n", pszParmValue));
+ return False;
+ }
+ *(int *)parm_ptr = b;
+ }
break;
case P_INTEGER:
*(int *)parm_ptr = atoi(pszParmValue);
break;
+ case P_OCTAL:
+ *(int *)parm_ptr = strtol(pszParmValue, NULL, 8);
+ break;
+
+ case P_BYTES:
+ {
+ uint64_t val;
+ if (conv_str_size(pszParmValue, &val)) {
+ if (val <= INT_MAX) {
+ *(int *)parm_ptr = (int)val;
+ break;
+ }
+ }
+
+ DEBUG(0,("lp_do_parameter(%s): value is not "
+ "a valid size specifier!\n", pszParmValue));
+ return False;
+ }
+
case P_LIST:
- *(const char ***)parm_ptr = str_list_make(talloc_autofree_context(),
+ *(const char ***)parm_ptr = str_list_make(mem_ctx,
pszParmValue, NULL);
break;
case P_STRING:
- string_set(parm_ptr, pszParmValue);
+ string_set(mem_ctx, parm_ptr, pszParmValue);
break;
case P_USTRING:
- string_set(parm_ptr, pszParmValue);
+ string_set(mem_ctx, parm_ptr, pszParmValue);
strupper(*(char **)parm_ptr);
break;
break;
}
- return (True);
+ if (parm_table[parmnum].flags & FLAG_DEFAULT) {
+ parm_table[parmnum].flags &= ~FLAG_DEFAULT;
+ /* we have to also unset FLAG_DEFAULT on aliases */
+ for (i=parmnum-1;i>=0 && parm_table[i].ptr == parm_table[parmnum].ptr;i--) {
+ parm_table[i].flags &= ~FLAG_DEFAULT;
+ }
+ for (i=parmnum+1;i<NUMPARAMETERS && parm_table[i].ptr == parm_table[parmnum].ptr;i++) {
+ parm_table[i].flags &= ~FLAG_DEFAULT;
+ }
+ }
+
+ return true;
}
/***************************************************************************
static BOOL do_parameter(const char *pszParmName, const char *pszParmValue, void *userdata)
{
- return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
- pszParmName, pszParmValue));
+ return lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
+ pszParmName, pszParmValue);
}
/*
break;
case P_BOOL:
- fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
+ fprintf(f, "%s", BOOLSTR((BOOL)*(int *)ptr));
break;
case P_INTEGER:
+ case P_BYTES:
fprintf(f, "%d", *(int *)ptr);
break;
+ case P_OCTAL:
+ fprintf(f, "0%o", *(int *)ptr);
+ break;
+
case P_LIST:
if ((char ***)ptr && *(char ***)ptr) {
char **list = *(char ***)ptr;
{
switch (type) {
case P_BOOL:
- return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
+ return (*((int *)ptr1) == *((int *)ptr2));
case P_INTEGER:
+ case P_OCTAL:
+ case P_BYTES:
case P_ENUM:
return (*((int *)ptr1) == *((int *)ptr2));
case P_SEP:
break;
}
- return (False);
+ return false;
}
/***************************************************************************
/* check for multiple global sections */
if (bInGlobalSection) {
DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
- return (True);
+ return true;
}
/* if we have a current service, tidy it up before moving on */
if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
< 0) {
DEBUG(0, ("Failed to add a new service\n"));
- return (False);
+ return false;
}
}
- return (bRetval);
+ return bRetval;
}
*(char **)parm_table[i].ptr);
case P_BOOL:
return parm_table[i].def.bvalue ==
- *(BOOL *)parm_table[i].ptr;
+ *(int *)parm_table[i].ptr;
case P_INTEGER:
+ case P_OCTAL:
+ case P_BYTES:
case P_ENUM:
return parm_table[i].def.ivalue ==
*(int *)parm_table[i].ptr;
Display the contents of the global structure.
***************************************************************************/
-static void dump_globals(FILE *f)
+static void dump_globals(FILE *f, BOOL show_defaults)
{
int i;
struct param_opt *data;
if (parm_table[i].class == P_GLOBAL &&
parm_table[i].ptr &&
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
- if (defaults_saved && is_default(i))
+ if (!show_defaults && (parm_table[i].flags & FLAG_DEFAULT))
continue;
fprintf(f, "\t%s = ", parm_table[i].label);
print_parameter(&parm_table[i], parm_table[i].ptr, f);
}
}
+BOOL lp_dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
+{
+ service * pService = ServicePtrs[snum];
+ struct parm_struct *parm;
+ void *ptr;
+
+ parm = lp_parm_struct(parm_name);
+ if (!parm) {
+ return False;
+ }
+
+ if (isGlobal)
+ ptr = parm->ptr;
+ else
+ ptr = ((char *)pService) +
+ PTR_DIFF(parm->ptr, &sDefault);
+
+ print_parameter(parm,
+ ptr, f);
+ fprintf(f, "\n");
+ return True;
+}
/***************************************************************************
Return info about the next service in a service. snum==-1 gives the globals.
Return TRUE if the passed service number is within range.
***************************************************************************/
-BOOL lp_snum_ok(int iService)
+bool lp_snum_ok(int iService)
{
return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
}
return;
}
-/***************************************************************************
- Announce ourselves as a print server.
-***************************************************************************/
-
-void update_server_announce_as_printserver(void)
-{
- default_server_announce |= SV_TYPE_PRINTQ_SERVER;
-}
-
/***************************************************************************
Have we loaded a services file yet?
***************************************************************************/
BOOL lp_loaded(void)
{
- return (bLoaded);
+ return bLoaded;
}
/***************************************************************************
continue;
if (!snumused || !snumused(smb, i)) {
- ServicePtrs[i]->valid = False;
free_service(ServicePtrs[i]);
+ ServicePtrs[i] = NULL;
}
}
}
void lp_killservice(int iServiceIn)
{
if (VALID(iServiceIn)) {
- ServicePtrs[iServiceIn]->valid = False;
free_service(ServicePtrs[iServiceIn]);
- }
-}
-
-/*******************************************************************
- Set the server type we will announce as via nmbd.
-********************************************************************/
-
-static void set_server_role(void)
-{
- server_role = ROLE_STANDALONE;
-
- switch (lp_security()) {
- case SEC_SHARE:
- if (lp_domain_logons())
- DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
- break;
- case SEC_SERVER:
- case SEC_DOMAIN:
- case SEC_ADS:
- if (lp_domain_logons()) {
- if (Globals.bDomainMaster) /* auto or yes */
- server_role = ROLE_DOMAIN_PDC;
- else
- server_role = ROLE_DOMAIN_BDC;
- break;
- }
- server_role = ROLE_DOMAIN_MEMBER;
- break;
- case SEC_USER:
- if (lp_domain_logons()) {
-
- if (Globals.bDomainMaster) /* auto or yes */
- server_role = ROLE_DOMAIN_PDC;
- else
- server_role = ROLE_DOMAIN_BDC;
- }
- break;
- default:
- DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
- break;
- }
-
- DEBUG(10, ("set_server_role: role = "));
-
- switch(server_role) {
- case ROLE_STANDALONE:
- DEBUGADD(10, ("ROLE_STANDALONE\n"));
- break;
- case ROLE_DOMAIN_MEMBER:
- DEBUGADD(10, ("ROLE_DOMAIN_MEMBER\n"));
- break;
- case ROLE_DOMAIN_BDC:
- DEBUGADD(10, ("ROLE_DOMAIN_BDC\n"));
- break;
- case ROLE_DOMAIN_PDC:
- DEBUGADD(10, ("ROLE_DOMAIN_PDC\n"));
- break;
+ ServicePtrs[iServiceIn] = NULL;
}
}
False on failure.
***************************************************************************/
-BOOL lp_load(void)
+bool lp_load(void)
{
- pstring n2;
- BOOL bRetval;
+ char *n2;
+ bool bRetval;
struct param_opt *data;
- bRetval = False;
+ bRetval = false;
- bInGlobalSection = True;
+ bInGlobalSection = true;
if (Globals.param_opt != NULL) {
struct param_opt *next;
for (data=Globals.param_opt; data; data=next) {
next = data->next;
if (data->flags & FLAG_CMDLINE) continue;
- free(data->key);
- free(data->value);
DLIST_REMOVE(Globals.param_opt, data);
- free(data);
+ talloc_free(data);
}
}
init_globals();
- pstrcpy(n2, lp_configfile());
- standard_sub_basic(n2,sizeof(n2));
+ n2 = standard_sub_basic(lp_configfile());
DEBUG(2, ("lp_load: refreshing parameters from %s\n", n2));
add_to_file_list(lp_configfile(), n2);
lp_add_hidden("IPC$", "IPC");
lp_add_hidden("ADMIN$", "DISK");
- set_server_role();
- set_default_server_announce_type();
+ bLoaded = true;
- bLoaded = True;
-
- if (Globals.bWINSsupport) {
+ if (!Globals.szWINSservers && Globals.bWINSsupport) {
lp_do_parameter(-1, "wins server", "127.0.0.1");
}
init_iconv();
- return (bRetval);
+ return bRetval;
}
/***************************************************************************
int lp_numservices(void)
{
- return (iNumServices);
+ return iNumServices;
}
/***************************************************************************
if (show_defaults)
defaults_saved = False;
- dump_globals(f);
+ dump_globals(f, show_defaults);
dump_a_service(&sDefault, f);
Display the contents of one service in human-readable form.
***************************************************************************/
-void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
+void lp_dump_one(FILE *f, bool show_defaults, int snum)
{
if (VALID(snum)) {
if (ServicePtrs[snum]->szService[0] == '\0')
int lp_servicenumber(const char *pszServiceName)
{
int iService;
- fstring serviceName;
+ char *serviceName;
for (iService = iNumServices - 1; iService >= 0; iService--) {
* The substitution here is used to support %U is
* service names
*/
- fstrcpy(serviceName, ServicePtrs[iService]->szService);
- standard_sub_basic(serviceName,sizeof(serviceName));
+ serviceName = standard_sub_basic(ServicePtrs[iService]->szService);
if (strequal(serviceName, pszServiceName))
break;
}
if (iService < 0)
DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
- return (iService);
+ return iService;
}
-/*******************************************************************
- A useful volume label function.
-********************************************************************/
-const char *volume_label(int snum)
+int lp_find_valid_service(const char *pszServiceName)
{
- const char *ret = lp_volume(snum);
- if (!*ret)
- return lp_servicename(snum);
- return (ret);
-}
-
-
-/*******************************************************************
- Set the server type we will announce as via nmbd.
-********************************************************************/
+ int iService;
-static void set_default_server_announce_type(void)
-{
- default_server_announce = 0;
- default_server_announce |= SV_TYPE_WORKSTATION;
- default_server_announce |= SV_TYPE_SERVER;
- default_server_announce |= SV_TYPE_SERVER_UNIX;
+ iService = lp_servicenumber(pszServiceName);
- switch (lp_announce_as()) {
- case ANNOUNCE_AS_NT_SERVER:
- default_server_announce |= SV_TYPE_SERVER_NT;
- /* fall through... */
- case ANNOUNCE_AS_NT_WORKSTATION:
- default_server_announce |= SV_TYPE_NT;
- break;
- case ANNOUNCE_AS_WIN95:
- default_server_announce |= SV_TYPE_WIN95_PLUS;
- break;
- case ANNOUNCE_AS_WFW:
- default_server_announce |= SV_TYPE_WFW;
- break;
- default:
- break;
+ if (iService >= 0 && !lp_snum_ok(iService)) {
+ DEBUG(0,("lp_find_valid_service: Invalid snum %d for '%s'\n",iService, pszServiceName));
+ iService = -1;
}
- switch (lp_server_role()) {
- case ROLE_DOMAIN_MEMBER:
- default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
- break;
- case ROLE_DOMAIN_PDC:
- default_server_announce |= SV_TYPE_DOMAIN_CTRL;
- break;
- case ROLE_DOMAIN_BDC:
- default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
- break;
- case ROLE_STANDALONE:
- default:
- break;
+ if (iService == -1) {
+ DEBUG(3,("lp_find_valid_service: failed to find service '%s'\n", pszServiceName));
}
- if (lp_time_server())
- default_server_announce |= SV_TYPE_TIME_SOURCE;
- if (lp_host_msdfs())
- default_server_announce |= SV_TYPE_DFS_SERVER;
-
- /* TODO: only announce us as print server when we are a print server */
- default_server_announce |= SV_TYPE_PRINTQ_SERVER;
+ return iService;
}
-/***********************************************************
- returns role of Samba server
-************************************************************/
-
-int lp_server_role(void)
+/*******************************************************************
+ A useful volume label function.
+********************************************************************/
+const char *volume_label(int snum)
{
- return server_role;
+ const char *ret = lp_volume(snum);
+ if (!*ret)
+ return lp_servicename(snum);
+ return ret;
}
-/***********************************************************
- If we are PDC then prefer us as DMB
-************************************************************/
-
-BOOL lp_domain_master(void)
-{
- if (Globals.bDomainMaster == Auto)
- return (lp_server_role() == ROLE_DOMAIN_PDC);
-
- return Globals.bDomainMaster;
-}
/***********************************************************
- If we are DMB then prefer us as LMB
+ If we are PDC then prefer us as DMB
************************************************************/
-BOOL lp_preferred_master(void)
+bool lp_domain_logons(void)
{
- if (Globals.bPreferredMaster == Auto)
- return (lp_local_master() && lp_domain_master());
-
- return Globals.bPreferredMaster;
+ return (lp_server_role() == ROLE_DOMAIN_CONTROLLER);
}
/*******************************************************************
void lp_remove_service(int snum)
{
- ServicePtrs[snum]->valid = False;
+ ServicePtrs[snum] = NULL;
}
/*******************************************************************
}
}
-
-/*******************************************************************
- Get the default server type we will announce as via nmbd.
-********************************************************************/
-int lp_default_server_announce(void)
-{
- return default_server_announce;
-}
-
const char *lp_printername(int snum)
{
const char *ret = _lp_printername(snum);