2 Unix SMB/CIFS implementation.
3 Parameter loading functions
4 Copyright (C) Karl Auer 1993-1998
6 Largely re-written by Andrew Tridgell, September 1994
8 Copyright (C) Simo Sorce 2001
9 Copyright (C) Alexander Bokovoy 2002
10 Copyright (C) Stefan (metze) Metzmacher 2002
11 Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003.
12 Copyright (C) James Myers 2003 <myersjj@samba.org>
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32 * This module provides suitable callback functions for the params
33 * module. It builds the internal table of service details which is
34 * then used by the rest of the server.
38 * 1) add it to the global or service structure definition
39 * 2) add it to the parm_table
40 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
41 * 4) If it's a global then initialise it in init_globals. If a local
42 * (ie. service) parameter then initialise it in the sDefault structure
46 * The configuration file is processed sequentially for speed. It is NOT
47 * accessed randomly as happens in 'real' Windows. For this reason, there
48 * is a fair bit of sequence-dependent code here - ie., code which assumes
49 * that certain things happen before others. In particular, the code which
50 * happens at the boundary between sections is delicately poised, so be
57 BOOL in_client = False; /* Not in the client by default */
58 static BOOL bLoaded = False;
61 #define GLOBAL_NAME "global"
65 #define PRINTERS_NAME "printers"
69 #define HOMES_NAME "homes"
72 /* some helpful bits */
73 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
74 #define VALID(i) ServicePtrs[i]->valid
76 static BOOL do_parameter(const char *, const char *);
78 static BOOL defaults_saved = False;
81 struct param_opt *prev, *next;
88 * This structure describes global (ie., server-wide) parameters.
95 char *display_charset;
100 char *szDefaultService;
102 char *szServerString;
103 char *szAutoServices;
104 char *szPasswdProgram;
108 char *szSMBPasswdFile;
112 char **szPassdbBackend;
113 char **szPreloadModules;
114 char *szPasswordServer;
115 char *szSocketOptions;
122 char **szWINSservers;
124 char *szRemoteAnnounce;
125 char *szRemoteBrowseSync;
126 char *szSocketAddress;
127 char *szAnnounceVersion; /* This is initialised in init_globals */
130 char **szNetbiosAliases;
131 char *szNetbiosScope;
132 char *szDomainOtherSIDs;
133 char *szNameResolveOrder;
135 char *szAddUserScript;
136 char *szAddMachineScript;
138 char *szWINSPartners;
139 char **dcerpc_ep_servers;
140 char **server_services;
143 char *szNonUnixAccountRange;
144 char *szTemplateHomedir;
145 char *szTemplateShell;
146 char *szWinbindSeparator;
147 BOOL bWinbindEnumUsers;
148 BOOL bWinbindEnumGroups;
149 BOOL bWinbindUseDefaultDomain;
150 char *szIDMapBackend;
151 char *szGuestaccount;
161 BOOL paranoid_server_security;
163 BOOL bDisableSpoolss;
165 int enhanced_browsing;
172 int announce_as; /* This is initialised in init_globals */
173 int machine_password_timeout;
174 int winbind_cache_time;
177 char *szLdapMachineSuffix;
178 char *szLdapUserSuffix;
179 #ifdef WITH_LDAP_SAMCONFIG
183 char *socket_options;
189 int ldap_passwd_sync;
194 BOOL bPreferredMaster;
197 BOOL bEncryptPasswords;
200 BOOL bObeyPamRestrictions;
202 BOOL bLargeReadwrite;
206 BOOL bBindInterfacesOnly;
207 BOOL bPamPasswordChange;
208 BOOL bUnixPasswdSync;
210 BOOL bNTStatusSupport;
211 BOOL bAllowTrustedDomains;
217 BOOL bClientLanManAuth;
218 BOOL bClientNTLMv2Auth;
220 BOOL bHideLocalUsers;
223 BOOL bHostnameLookups;
224 BOOL bUnixExtensions;
225 BOOL bDisableNetbios;
227 int restrict_anonymous;
228 int name_cache_timeout;
229 struct param_opt *param_opt;
233 static global Globals;
236 * This structure describes a single service.
245 char **szInvalidUsers;
250 char *szPrintcommand;
253 char *szLppausecommand;
254 char *szLpresumecommand;
255 char *szQueuepausecommand;
256 char *szQueueresumecommand;
288 struct param_opt *param_opt;
290 char dummy[3]; /* for alignment */
295 /* This is a default service used to prime a services structure */
296 static service sDefault = {
298 False, /* not autoloaded */
299 NULL, /* szService */
301 NULL, /* szUsername */
302 NULL, /* szInvalidUsers */
303 NULL, /* szValidUsers */
304 NULL, /* szAdminUsers */
306 NULL, /* szInclude */
307 NULL, /* szPrintcommand */
308 NULL, /* szLpqcommand */
309 NULL, /* szLprmcommand */
310 NULL, /* szLppausecommand */
311 NULL, /* szLpresumecommand */
312 NULL, /* szQueuepausecommand */
313 NULL, /* szQueueresumecommand */
314 NULL, /* szPrintername */
315 NULL, /* szHostsallow */
316 NULL, /* szHostsdeny */
320 NULL, /* szMSDfsProxy */
321 NULL, /* ntvfs_handler */
322 0, /* iMinPrintSpace */
323 1000, /* iMaxPrintJobs */
324 0, /* iMaxConnections */
325 DEFAULT_PRINTING, /* iPrinting */
327 True, /* bAvailable */
328 True, /* bBrowseable */
329 True, /* bRead_only */
330 False, /* bPrint_ok */
331 False, /* bMap_system */
332 False, /* bMap_hidden */
333 True, /* bMap_archive */
335 True, /* bStrictLocking */
336 True, /* bPosixLocking */
338 True, /* bLevel2OpLocks */
339 False, /* bOnlyUser */
340 False, /* bGuest_only */
341 False, /* bGuest_ok */
343 False, /* bMSDfsRoot */
344 True, /* bShareModes */
345 NULL, /* Parametric options */
350 /* local variables */
351 static service **ServicePtrs = NULL;
352 static int iNumServices = 0;
353 static int iServiceIndex = 0;
354 static BOOL bInGlobalSection = True;
355 static BOOL bGlobalOnly = False;
356 static int server_role;
357 static int default_server_announce;
359 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
361 /* prototypes for the special type handlers */
362 static BOOL handle_include(const char *pszParmValue, char **ptr);
363 static BOOL handle_copy(const char *pszParmValue, char **ptr);
364 static BOOL handle_winbind_uid(const char *pszParmValue, char **ptr);
365 static BOOL handle_winbind_gid(const char *pszParmValue, char **ptr);
366 static BOOL handle_non_unix_account_range(const char *pszParmValue, char **ptr);
368 static BOOL handle_ldap_machine_suffix ( const char *pszParmValue, char **ptr );
369 static BOOL handle_ldap_user_suffix ( const char *pszParmValue, char **ptr );
370 static BOOL handle_ldap_suffix ( const char *pszParmValue, char **ptr );
372 static void set_server_role(void);
373 static void set_default_server_announce_type(void);
375 static const struct enum_list enum_protocol[] = {
376 {PROTOCOL_NT1, "NT1"},
377 {PROTOCOL_LANMAN2, "LANMAN2"},
378 {PROTOCOL_LANMAN1, "LANMAN1"},
379 {PROTOCOL_CORE, "CORE"},
380 {PROTOCOL_COREPLUS, "COREPLUS"},
381 {PROTOCOL_COREPLUS, "CORE+"},
385 static const struct enum_list enum_security[] = {
386 {SEC_SHARE, "SHARE"},
388 {SEC_SERVER, "SERVER"},
389 {SEC_DOMAIN, "DOMAIN"},
396 static const struct enum_list enum_printing[] = {
397 {PRINT_SYSV, "sysv"},
399 {PRINT_HPUX, "hpux"},
403 {PRINT_LPRNG, "lprng"},
404 {PRINT_SOFTQ, "softq"},
405 {PRINT_CUPS, "cups"},
407 {PRINT_LPROS2, "os2"},
409 {PRINT_TEST, "test"},
411 #endif /* DEVELOPER */
415 static const struct enum_list enum_ldap_ssl[] = {
416 #ifdef WITH_LDAP_SAMCONFIG
417 {LDAP_SSL_ON, "Yes"},
418 {LDAP_SSL_ON, "yes"},
422 {LDAP_SSL_OFF, "no"},
423 {LDAP_SSL_OFF, "No"},
424 {LDAP_SSL_OFF, "off"},
425 {LDAP_SSL_OFF, "Off"},
426 {LDAP_SSL_START_TLS, "start tls"},
427 {LDAP_SSL_START_TLS, "Start_tls"},
431 static const struct enum_list enum_ldap_passwd_sync[] = {
432 {LDAP_PASSWD_SYNC_ON, "Yes"},
433 {LDAP_PASSWD_SYNC_ON, "yes"},
434 {LDAP_PASSWD_SYNC_ON, "on"},
435 {LDAP_PASSWD_SYNC_ON, "On"},
436 {LDAP_PASSWD_SYNC_OFF, "no"},
437 {LDAP_PASSWD_SYNC_OFF, "No"},
438 {LDAP_PASSWD_SYNC_OFF, "off"},
439 {LDAP_PASSWD_SYNC_OFF, "Off"},
440 #ifdef LDAP_EXOP_X_MODIFY_PASSWD
441 {LDAP_PASSWD_SYNC_ONLY, "Only"},
442 {LDAP_PASSWD_SYNC_ONLY, "only"},
443 #endif /* LDAP_EXOP_X_MODIFY_PASSWD */
447 /* Types of machine we can announce as. */
448 #define ANNOUNCE_AS_NT_SERVER 1
449 #define ANNOUNCE_AS_WIN95 2
450 #define ANNOUNCE_AS_WFW 3
451 #define ANNOUNCE_AS_NT_WORKSTATION 4
453 static const struct enum_list enum_announce_as[] = {
454 {ANNOUNCE_AS_NT_SERVER, "NT"},
455 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
456 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
457 {ANNOUNCE_AS_WIN95, "win95"},
458 {ANNOUNCE_AS_WFW, "WfW"},
462 static const struct enum_list enum_case[] = {
463 {CASE_LOWER, "lower"},
464 {CASE_UPPER, "upper"},
468 static const struct enum_list enum_bool_auto[] = {
479 /* Client-side offline caching policy types */
480 #define CSC_POLICY_MANUAL 0
481 #define CSC_POLICY_DOCUMENTS 1
482 #define CSC_POLICY_PROGRAMS 2
483 #define CSC_POLICY_DISABLE 3
485 static const struct enum_list enum_csc_policy[] = {
486 {CSC_POLICY_MANUAL, "manual"},
487 {CSC_POLICY_DOCUMENTS, "documents"},
488 {CSC_POLICY_PROGRAMS, "programs"},
489 {CSC_POLICY_DISABLE, "disable"},
493 /* SMB signing types. */
494 static const struct enum_list enum_smb_signing_vals[] = {
495 {SMB_SIGNING_OFF, "No"},
496 {SMB_SIGNING_OFF, "False"},
497 {SMB_SIGNING_OFF, "0"},
498 {SMB_SIGNING_OFF, "Off"},
499 {SMB_SIGNING_OFF, "disabled"},
500 {SMB_SIGNING_SUPPORTED, "Yes"},
501 {SMB_SIGNING_SUPPORTED, "True"},
502 {SMB_SIGNING_SUPPORTED, "1"},
503 {SMB_SIGNING_SUPPORTED, "On"},
504 {SMB_SIGNING_SUPPORTED, "enabled"},
505 {SMB_SIGNING_SUPPORTED, "auto"},
506 {SMB_SIGNING_REQUIRED, "required"},
507 {SMB_SIGNING_REQUIRED, "mandatory"},
508 {SMB_SIGNING_REQUIRED, "force"},
509 {SMB_SIGNING_REQUIRED, "forced"},
510 {SMB_SIGNING_REQUIRED, "enforced"},
515 Do you want session setups at user level security with a invalid
516 password to be rejected or allowed in as guest? WinNT rejects them
517 but it can be a pain as it means "net view" needs to use a password
519 You have 3 choices in the setting of map_to_guest:
521 "Never" means session setups with an invalid password
522 are rejected. This is the default.
524 "Bad User" means session setups with an invalid password
525 are rejected, unless the username does not exist, in which case it
526 is treated as a guest login
528 "Bad Password" means session setups with an invalid password
529 are treated as a guest login
531 Note that map_to_guest only has an effect in user or server
535 static const struct enum_list enum_map_to_guest[] = {
536 {NEVER_MAP_TO_GUEST, "Never"},
537 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
538 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
542 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
544 * Note: We have a flag called FLAG_DEVELOPER but is not used at this time, it
545 * is implied in current control logic. This may change at some later time. A
546 * flag value of 0 means - show as development option only.
548 * The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
549 * screen in SWAT. This is used to exclude parameters as well as to squash all
550 * parameters that have been duplicated by pseudonyms.
552 static struct parm_struct parm_table[] = {
553 {"Base Options", P_SEP, P_SEPARATOR},
555 {"dos charset", P_STRING, P_GLOBAL, &Globals.dos_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
556 {"unix charset", P_STRING, P_GLOBAL, &Globals.unix_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
557 {"display charset", P_STRING, P_GLOBAL, &Globals.display_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
558 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
559 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
560 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_HIDE},
561 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkgroup, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
562 {"realm", P_USTRING, P_GLOBAL, &Globals.szRealm, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
563 {"ADS server", P_STRING, P_GLOBAL, &Globals.szADSserver, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
564 {"netbios name", P_USTRING, P_GLOBAL, &Globals.szNetbiosName, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
565 {"netbios aliases", P_LIST, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
566 {"netbios scope", P_USTRING, P_GLOBAL, &Globals.szNetbiosScope, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
567 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
568 {"interfaces", P_LIST, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
569 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
570 {"ntvfs handler", P_STRING, P_LOCAL, &sDefault.ntvfs_handler, NULL, NULL, FLAG_ADVANCED},
571 {"dcerpc endpoint servers", P_LIST, P_GLOBAL, &Globals.dcerpc_ep_servers, NULL, NULL, FLAG_ADVANCED},
572 {"server services", P_LIST, P_GLOBAL, &Globals.server_services, NULL, NULL, FLAG_ADVANCED},
574 {"Security Options", P_SEP, P_SEPARATOR},
576 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
577 {"auth methods", P_LIST, P_GLOBAL, &Globals.AuthMethods, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
578 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
579 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
580 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
581 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
582 {"idmap backend", P_STRING, P_GLOBAL, &Globals.szIDMapBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
583 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
584 {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
585 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
586 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
587 {"sam database", P_STRING, P_GLOBAL, &Globals.szSAM_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
588 {"spoolss database", P_STRING, P_GLOBAL, &Globals.szSPOOLSS_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
589 {"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
590 {"passdb backend", P_LIST, P_GLOBAL, &Globals.szPassdbBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
591 {"non unix account range", P_STRING, P_GLOBAL, &Globals.szNonUnixAccountRange, handle_non_unix_account_range, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
592 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
593 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
594 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE | FLAG_DEVELOPER},
595 {"guest account", P_STRING, P_GLOBAL, &Globals.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
597 {"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
598 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
599 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
600 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
601 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
602 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
603 {"restrict anonymous", P_INTEGER, P_GLOBAL, &Globals.restrict_anonymous, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
604 {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
605 {"ntlm auth", P_BOOL, P_GLOBAL, &Globals.bNTLMAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
606 {"client NTLMv2 auth", P_BOOL, P_GLOBAL, &Globals.bClientNTLMv2Auth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
607 {"client lanman auth", P_BOOL, P_GLOBAL, &Globals.bClientLanManAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
609 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
610 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE},
611 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE},
613 {"invalid users", P_LIST, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
614 {"valid users", P_LIST, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
615 {"admin users", P_LIST, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
617 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE},
619 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
621 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
623 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
624 {"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
625 {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
626 {"preload modules", P_LIST, P_GLOBAL, &Globals.szPreloadModules, NULL, NULL, FLAG_BASIC | FLAG_GLOBAL},
628 {"Logging Options", P_SEP, P_SEPARATOR},
630 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
631 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_HIDE},
632 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
634 {"Protocol Options", P_SEP, P_SEPARATOR},
636 {"smb ports", P_LIST, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
637 {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_DEVELOPER},
638 {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
639 {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
640 {"unicode", P_BOOL, P_GLOBAL, &Globals.bUnicode, NULL, NULL, FLAG_DEVELOPER},
641 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, FLAG_DEVELOPER},
642 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, FLAG_DEVELOPER},
643 {"disable netbios", P_BOOL, P_GLOBAL, &Globals.bDisableNetbios, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
645 {"nt status support", P_BOOL, P_GLOBAL, &Globals.bNTStatusSupport, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
647 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, FLAG_DEVELOPER},
648 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, FLAG_DEVELOPER},
649 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
650 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
652 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
653 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
654 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
655 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
656 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
657 {"unix extensions", P_BOOL, P_GLOBAL, &Globals.bUnixExtensions, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
658 {"use spnego", P_BOOL, P_GLOBAL, &Globals.bUseSpnego, NULL, NULL, FLAG_DEVELOPER},
659 {"server signing", P_ENUM, P_GLOBAL, &Globals.server_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED},
660 {"client signing", P_ENUM, P_GLOBAL, &Globals.client_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED},
661 {"rpc big endian", P_BOOL, P_GLOBAL, &Globals.bRpcBigEndian, NULL, NULL, FLAG_DEVELOPER},
663 {"Tuning Options", P_SEP, P_SEPARATOR},
665 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_DEVELOPER},
666 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
667 {"paranoid server security", P_BOOL, P_GLOBAL, &Globals.paranoid_server_security, NULL, NULL, FLAG_DEVELOPER},
668 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
670 {"socket options", P_STRING, P_GLOBAL, &Globals.socket_options, NULL, NULL, FLAG_DEVELOPER},
671 {"use mmap", P_BOOL, P_GLOBAL, &Globals.bUseMmap, NULL, NULL, FLAG_DEVELOPER},
672 {"hostname lookups", P_BOOL, P_GLOBAL, &Globals.bHostnameLookups, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
674 {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
676 {"Printing Options", P_SEP, P_SEPARATOR},
678 {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_PRINT},
679 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
680 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT | FLAG_DEVELOPER},
681 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE},
682 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
683 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE},
684 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
685 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
686 {"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
687 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
688 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
689 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
690 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
691 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
692 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
694 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
695 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_HIDE},
697 {"Filename Handling", P_SEP, P_SEPARATOR},
699 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
700 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
701 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
702 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
704 {"Domain Options", P_SEP, P_SEPARATOR},
706 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
708 {"Logon Options", P_SEP, P_SEPARATOR},
710 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
711 {"add machine script", P_STRING, P_GLOBAL, &Globals.szAddMachineScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
713 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
714 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
715 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
716 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
717 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
719 {"Browse Options", P_SEP, P_SEPARATOR},
721 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
722 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_DEVELOPER},
723 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
724 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
725 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
726 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
727 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
728 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
729 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE},
730 {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL, FLAG_DEVELOPER | FLAG_ADVANCED},
732 {"WINS Options", P_SEP, P_SEPARATOR},
733 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
734 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
736 {"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
737 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
738 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
739 {"wins partners", P_STRING, P_GLOBAL, &Globals.szWINSPartners, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
741 {"Locking Options", P_SEP, P_SEPARATOR},
743 {"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_SHARE | FLAG_GLOBAL},
744 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
745 {"lock spin count", P_INTEGER, P_GLOBAL, &Globals.iLockSpinCount, NULL, NULL, FLAG_GLOBAL},
746 {"lock spin time", P_INTEGER, P_GLOBAL, &Globals.iLockSpinTime, NULL, NULL, FLAG_GLOBAL},
748 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
749 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
750 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
751 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
752 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
754 {"Ldap Options", P_SEP, P_SEPARATOR},
756 #ifdef WITH_LDAP_SAMCONFIG
757 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
758 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
760 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, handle_ldap_suffix, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
761 {"ldap machine suffix", P_STRING, P_GLOBAL, &Globals.szLdapMachineSuffix, handle_ldap_machine_suffix, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
762 {"ldap user suffix", P_STRING, P_GLOBAL, &Globals.szLdapUserSuffix, handle_ldap_user_suffix, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
763 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
764 {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
765 {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED | FLAG_DEVELOPER},
766 {"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED | FLAG_DEVELOPER},
767 {"ldap trust ids", P_BOOL, P_GLOBAL, &Globals.ldap_trust_ids, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
769 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
771 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
772 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
773 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
774 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_HIDE},
775 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
776 {"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
778 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
779 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DEVELOPER},
780 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
781 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
782 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, FLAG_DEVELOPER},
783 {"time offset", P_INTEGER, P_GLOBAL, &Globals.time_offset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
784 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
786 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
787 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
789 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
790 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE },
791 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
793 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
794 {"hide local users", P_BOOL, P_GLOBAL, &Globals.bHideLocalUsers, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
796 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
797 {"msdfs proxy", P_STRING, P_LOCAL, &sDefault.szMSDfsProxy, NULL, NULL, FLAG_SHARE},
798 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
799 {"Winbind options", P_SEP, P_SEPARATOR},
801 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_uid, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
802 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_gid, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
803 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
804 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
805 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
806 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
807 {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
808 {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
809 {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
811 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
814 /***************************************************************************
815 Initialise the sDefault parameter structure for the printer values.
816 ***************************************************************************/
818 static void init_printer_values(void)
820 /* choose defaults depending on the type of printing */
821 switch (sDefault.iPrinting) {
826 string_set(&sDefault.szLpqcommand, "lpq -P'%p'");
827 string_set(&sDefault.szLprmcommand, "lprm -P'%p' %j");
828 string_set(&sDefault.szPrintcommand,
834 string_set(&sDefault.szLpqcommand, "lpq -P'%p'");
835 string_set(&sDefault.szLprmcommand, "lprm -P'%p' %j");
836 string_set(&sDefault.szPrintcommand,
838 string_set(&sDefault.szQueuepausecommand,
840 string_set(&sDefault.szQueueresumecommand,
842 string_set(&sDefault.szLppausecommand,
844 string_set(&sDefault.szLpresumecommand,
845 "lpc release '%p' %j");
850 string_set(&sDefault.szLpqcommand, "");
851 string_set(&sDefault.szLprmcommand, "");
852 string_set(&sDefault.szPrintcommand, "");
853 string_set(&sDefault.szLppausecommand, "");
854 string_set(&sDefault.szLpresumecommand, "");
855 string_set(&sDefault.szQueuepausecommand, "");
856 string_set(&sDefault.szQueueresumecommand, "");
858 string_set(&Globals.szPrintcapname, "cups");
860 string_set(&sDefault.szLpqcommand,
861 "/usr/bin/lpstat -o '%p'");
862 string_set(&sDefault.szLprmcommand,
863 "/usr/bin/cancel '%p-%j'");
864 string_set(&sDefault.szPrintcommand,
865 "/usr/bin/lp -d '%p' %s; rm %s");
866 string_set(&sDefault.szLppausecommand,
867 "lp -i '%p-%j' -H hold");
868 string_set(&sDefault.szLpresumecommand,
869 "lp -i '%p-%j' -H resume");
870 string_set(&sDefault.szQueuepausecommand,
871 "/usr/bin/disable '%p'");
872 string_set(&sDefault.szQueueresumecommand,
873 "/usr/bin/enable '%p'");
874 string_set(&Globals.szPrintcapname, "lpstat");
875 #endif /* HAVE_CUPS */
880 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
881 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
882 string_set(&sDefault.szPrintcommand,
883 "lp -c -d%p %s; rm %s");
884 string_set(&sDefault.szQueuepausecommand,
886 string_set(&sDefault.szQueueresumecommand,
889 string_set(&sDefault.szLppausecommand,
890 "lp -i %p-%j -H hold");
891 string_set(&sDefault.szLpresumecommand,
892 "lp -i %p-%j -H resume");
897 string_set(&sDefault.szLpqcommand, "lpq -P%p");
898 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
899 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
903 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
904 string_set(&sDefault.szLprmcommand,
906 string_set(&sDefault.szPrintcommand,
907 "lp -d%p -s %s; rm %s");
908 string_set(&sDefault.szLppausecommand,
910 string_set(&sDefault.szLpresumecommand,
916 string_set(&sDefault.szPrintcommand, "vlp print %p %s");
917 string_set(&sDefault.szLpqcommand, "vlp lpq %p");
918 string_set(&sDefault.szLprmcommand, "vlp lprm %p %j");
919 string_set(&sDefault.szLppausecommand, "vlp lppause %p %j");
920 string_set(&sDefault.szLpresumecommand, "vlp lpresum %p %j");
921 string_set(&sDefault.szQueuepausecommand, "vlp queuepause %p");
922 string_set(&sDefault.szQueueresumecommand, "vlp queueresume %p");
924 #endif /* DEVELOPER */
930 /***************************************************************************
931 Initialise the global parameter structure.
932 ***************************************************************************/
933 static void init_globals(void)
938 DEBUG(3, ("Initialising global parameters\n"));
940 for (i = 0; parm_table[i].label; i++) {
941 if ((parm_table[i].type == P_STRING ||
942 parm_table[i].type == P_USTRING) &&
944 !(parm_table[i].flags & FLAG_CMDLINE)) {
945 string_set(parm_table[i].ptr, "");
949 /* options that can be set on the command line must be initialised via
950 the slower do_parameter() to ensure that FLAG_CMDLINE is obeyed */
951 do_parameter("socket options", DEFAULT_SOCKET_OPTIONS);
952 do_parameter("workgroup", DEFAULT_WORKGROUP);
953 do_parameter("netbios name", get_myname());
954 do_parameter("max protocol", "NT1");
955 do_parameter("name resolve order", "lmhosts wins host bcast");
957 init_printer_values();
959 string_set(&sDefault.fstype, FSTYPE_STRING);
960 string_set(&sDefault.ntvfs_handler, "default");
962 Globals.dcerpc_ep_servers = str_list_make("epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss", NULL);
964 Globals.server_services = str_list_make("smb rpc", NULL);
966 Globals.AuthMethods = str_list_make("guest sam_ignoredomain", NULL);
968 string_set(&Globals.szSMBPasswdFile, dyn_SMB_PASSWD_FILE);
969 string_set(&Globals.szPrivateDir, dyn_PRIVATE_DIR);
970 asprintf(&Globals.szSAM_URL, "tdb://%s/sam.ldb", dyn_PRIVATE_DIR);
971 asprintf(&Globals.szSPOOLSS_URL, "tdb://%s/spoolss.ldb", dyn_PRIVATE_DIR);
973 string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
975 /* using UTF8 by default allows us to support all chars */
976 string_set(&Globals.unix_charset, "UTF8");
978 /* Use codepage 850 as a default for the dos character set */
979 string_set(&Globals.dos_charset, "CP850");
982 * Allow the default PASSWD_CHAT to be overridden in local.h.
984 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
986 string_set(&Globals.szPasswdProgram, "");
987 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
988 string_set(&Globals.szPidDir, dyn_PIDDIR);
989 string_set(&Globals.szLockDir, dyn_LOCKDIR);
990 string_set(&Globals.szSocketAddress, "0.0.0.0");
991 pstrcpy(s, "Samba ");
992 pstrcat(s, SAMBA_VERSION_STRING);
993 string_set(&Globals.szServerString, s);
994 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
995 DEFAULT_MINOR_VERSION);
996 string_set(&Globals.szAnnounceVersion, s);
998 string_set(&Globals.szLogonDrive, "");
999 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1000 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1001 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1003 string_set(&Globals.szPasswordServer, "*");
1005 Globals.bLoadPrinters = True;
1006 Globals.mangled_stack = 50;
1007 Globals.max_mux = 50; /* This is *needed* for profile support. */
1008 Globals.max_xmit = 4356; /* the value w2k3 chooses */
1009 Globals.lpqcachetime = 10;
1010 Globals.bDisableSpoolss = False;
1011 Globals.pwordlevel = 0;
1012 Globals.unamelevel = 0;
1013 Globals.bLargeReadwrite = True;
1014 Globals.minprotocol = PROTOCOL_CORE;
1015 Globals.security = SEC_USER;
1016 Globals.paranoid_server_security = True;
1017 Globals.bEncryptPasswords = True;
1018 Globals.bUpdateEncrypt = False;
1019 Globals.bReadRaw = True;
1020 Globals.bWriteRaw = True;
1021 Globals.bNullPasswords = False;
1022 Globals.bObeyPamRestrictions = False;
1023 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1024 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1025 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1026 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1027 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1028 Globals.lm_interval = 60;
1029 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1031 Globals.bTimeServer = False;
1032 Globals.bBindInterfacesOnly = False;
1033 Globals.bUnixPasswdSync = False;
1034 Globals.bPamPasswordChange = False;
1035 Globals.bUnicode = True; /* Do unicode on the wire by default */
1036 Globals.bNTStatusSupport = True; /* Use NT status by default. */
1037 Globals.restrict_anonymous = 0;
1038 Globals.bClientLanManAuth = True; /* Do use the LanMan hash if it is available */
1039 Globals.bLanmanAuth = True; /* Do use the LanMan hash if it is available */
1040 Globals.bNTLMAuth = True; /* Do use NTLMv1 if it is available (otherwise NTLMv2) */
1042 Globals.enhanced_browsing = True;
1043 Globals.iLockSpinCount = 3; /* Try 2 times. */
1044 Globals.iLockSpinTime = 10; /* usec. */
1045 #ifdef MMAP_BLACKLIST
1046 Globals.bUseMmap = False;
1048 Globals.bUseMmap = True;
1050 Globals.bUnixExtensions = False;
1052 /* hostname lookups can be very expensive and are broken on
1053 a large number of sites (tridge) */
1054 Globals.bHostnameLookups = False;
1056 #ifdef WITH_LDAP_SAMCONFIG
1057 string_set(&Globals.szLdapServer, "localhost");
1058 Globals.ldap_port = 636;
1059 Globals.szPassdbBackend = str_list_make("ldapsam guest", NULL);
1061 Globals.szPassdbBackend = str_list_make("smbpasswd guest", NULL);
1062 #endif /* WITH_LDAP_SAMCONFIG */
1064 string_set(&Globals.szLdapSuffix, "");
1065 string_set(&Globals.szLdapMachineSuffix, "");
1066 string_set(&Globals.szLdapUserSuffix, "");
1068 string_set(&Globals.szLdapFilter, "(&(uid=%u)(objectclass=sambaAccount))");
1069 string_set(&Globals.szLdapAdminDn, "");
1070 Globals.ldap_ssl = LDAP_SSL_ON;
1071 Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
1073 /* these parameters are set to defaults that are more appropriate
1074 for the increasing samba install base:
1076 as a member of the workgroup, that will possibly become a
1077 _local_ master browser (lm = True). this is opposed to a forced
1078 local master browser startup (pm = True).
1080 doesn't provide WINS server service by default (wsupp = False),
1081 and doesn't provide domain master browser services by default, either.
1085 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1086 Globals.os_level = 20;
1087 Globals.bLocalMaster = True;
1088 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1089 Globals.bDomainLogons = False;
1090 Globals.bWINSsupport = False;
1091 Globals.bWINSproxy = False;
1093 Globals.bDNSproxy = True;
1095 Globals.bAllowTrustedDomains = True;
1097 string_set(&Globals.szTemplateShell, "/bin/false");
1098 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1099 string_set(&Globals.szWinbindSeparator, "\\");
1101 Globals.winbind_cache_time = 15;
1102 Globals.bWinbindEnumUsers = True;
1103 Globals.bWinbindEnumGroups = True;
1104 Globals.bWinbindUseDefaultDomain = False;
1106 string_set(&Globals.szIDMapBackend, "tdb");
1108 Globals.name_cache_timeout = 660; /* In seconds */
1110 Globals.bUseSpnego = True;
1112 Globals.client_signing = SMB_SIGNING_SUPPORTED;
1113 Globals.server_signing = SMB_SIGNING_SUPPORTED;
1115 Globals.smb_ports = str_list_make(SMB_PORTS, NULL);
1118 static TALLOC_CTX *lp_talloc;
1120 /******************************************************************* a
1121 Free up temporary memory - called from the main loop.
1122 ********************************************************************/
1124 void lp_talloc_free(void)
1128 talloc_destroy(lp_talloc);
1132 /*******************************************************************
1133 Convenience routine to grab string parameters into temporary memory
1134 and run standard_sub_basic on them. The buffers can be written to by
1135 callers without affecting the source string.
1136 ********************************************************************/
1138 static const char *lp_string(const char *s)
1140 #if 0 /* until REWRITE done to make thread-safe */
1141 size_t len = s ? strlen(s) : 0;
1145 /* The follow debug is useful for tracking down memory problems
1146 especially if you have an inner loop that is calling a lp_*()
1147 function that returns a string. Perhaps this debug should be
1148 present all the time? */
1151 DEBUG(10, ("lp_string(%s)\n", s));
1154 #if 0 /* until REWRITE done to make thread-safe */
1156 lp_talloc = talloc_init("lp_talloc");
1158 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1166 StrnCpy(ret, s, len);
1168 if (trim_string(ret, "\"", "\"")) {
1169 if (strchr(ret,'"') != NULL)
1170 StrnCpy(ret, s, len);
1173 standard_sub_basic(ret,len+100);
1180 In this section all the functions that are used to access the
1181 parameters from the rest of the program are defined
1184 #define FN_GLOBAL_STRING(fn_name,ptr) \
1185 const char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1186 #define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
1187 const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
1188 #define FN_GLOBAL_LIST(fn_name,ptr) \
1189 const char **fn_name(void) {return(*(const char ***)(ptr));}
1190 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1191 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1192 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1193 char fn_name(void) {return(*(char *)(ptr));}
1194 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1195 int fn_name(void) {return(*(int *)(ptr));}
1197 #define FN_LOCAL_STRING(fn_name,val) \
1198 const char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1199 #define FN_LOCAL_CONST_STRING(fn_name,val) \
1200 const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1201 #define FN_LOCAL_LIST(fn_name,val) \
1202 const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1203 #define FN_LOCAL_BOOL(fn_name,val) \
1204 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1205 #define FN_LOCAL_CHAR(fn_name,val) \
1206 char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1207 #define FN_LOCAL_INTEGER(fn_name,val) \
1208 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1210 FN_GLOBAL_LIST(lp_smb_ports, &Globals.smb_ports)
1211 FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
1212 FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
1213 FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
1214 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1215 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1216 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1217 FN_GLOBAL_STRING(lp_sam_url, &Globals.szSAM_URL)
1218 FN_GLOBAL_STRING(lp_spoolss_url, &Globals.szSPOOLSS_URL)
1219 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
1220 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1221 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1222 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1223 FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
1224 FN_GLOBAL_LIST(lp_dcerpc_endpoint_servers, &Globals.dcerpc_ep_servers)
1225 FN_GLOBAL_LIST(lp_server_services, &Globals.server_services)
1226 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1227 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1228 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1229 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1230 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1231 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1232 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1233 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1234 FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
1235 FN_GLOBAL_STRING(lp_ads_server, &Globals.szADSserver)
1236 FN_GLOBAL_STRING(lp_socket_options, &Globals.socket_options)
1237 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkgroup)
1238 FN_GLOBAL_STRING(lp_netbios_name, &Globals.szNetbiosName)
1239 FN_GLOBAL_STRING(lp_netbios_scope, &Globals.szNetbiosScope)
1240 FN_GLOBAL_CONST_STRING(lp_logon_script, &Globals.szLogonScript)
1241 FN_GLOBAL_CONST_STRING(lp_logon_path, &Globals.szLogonPath)
1242 FN_GLOBAL_CONST_STRING(lp_logon_drive, &Globals.szLogonDrive)
1243 FN_GLOBAL_CONST_STRING(lp_logon_home, &Globals.szLogonHome)
1244 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1245 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1246 FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
1247 FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
1248 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1249 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1250 FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
1251 FN_GLOBAL_LIST(lp_passdb_backend, &Globals.szPassdbBackend)
1252 FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules)
1253 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1254 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1256 FN_GLOBAL_CONST_STRING(lp_guestaccount, &Globals.szGuestaccount)
1258 FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
1260 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1261 FN_GLOBAL_STRING(lp_wins_partners, &Globals.szWINSPartners)
1262 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1263 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1264 FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1265 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1266 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1267 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
1268 FN_GLOBAL_STRING(lp_idmap_backend, &Globals.szIDMapBackend)
1270 #ifdef WITH_LDAP_SAMCONFIG
1271 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer)
1272 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1274 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1275 FN_GLOBAL_STRING(lp_ldap_machine_suffix, &Globals.szLdapMachineSuffix)
1276 FN_GLOBAL_STRING(lp_ldap_user_suffix, &Globals.szLdapUserSuffix)
1277 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter)
1278 FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
1279 FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
1280 FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
1281 FN_GLOBAL_BOOL(lp_ldap_trust_ids, &Globals.ldap_trust_ids)
1283 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
1284 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1285 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1286 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1287 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1288 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1289 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1290 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1291 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1292 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1293 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1294 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1295 FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
1296 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1297 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1298 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1299 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1300 FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
1301 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1302 FN_GLOBAL_BOOL(lp_unicode, &Globals.bUnicode)
1303 FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
1304 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1305 FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
1306 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1307 FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
1308 FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
1309 FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
1310 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1311 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1312 FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
1313 FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
1314 FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
1315 FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
1316 FN_GLOBAL_BOOL(lp_rpc_big_endian, &Globals.bRpcBigEndian)
1317 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1318 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1319 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1320 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1321 FN_GLOBAL_INTEGER(lp_time_offset, &Globals.time_offset)
1322 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1323 FN_GLOBAL_INTEGER(lp_max_xmit, &Globals.max_xmit)
1324 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1325 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1326 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1327 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1328 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1329 FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
1330 FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
1331 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1332 FN_GLOBAL_INTEGER(lp_disable_spoolss, &Globals.bDisableSpoolss)
1333 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1334 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1335 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1336 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1337 FN_GLOBAL_INTEGER(lp_lock_spin_count, &Globals.iLockSpinCount)
1338 FN_GLOBAL_INTEGER(lp_lock_sleep_time, &Globals.iLockSpinTime)
1339 FN_LOCAL_STRING(lp_servicename, szService)
1340 FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
1341 FN_LOCAL_STRING(lp_pathname, szPath)
1342 FN_LOCAL_STRING(lp_username, szUsername)
1343 FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
1344 FN_LOCAL_LIST(lp_valid_users, szValidUsers)
1345 FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
1346 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1347 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1348 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1349 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1350 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1351 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1352 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1353 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1354 FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
1355 FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
1356 FN_LOCAL_STRING(lp_comment, comment)
1357 FN_LOCAL_STRING(lp_fstype, fstype)
1358 FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
1359 static FN_LOCAL_STRING(lp_volume, volume)
1360 FN_LOCAL_STRING(lp_ntvfs_handler, ntvfs_handler)
1361 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1362 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1363 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1364 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1365 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1366 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1367 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1368 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1369 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1370 FN_LOCAL_BOOL(lp_locking, bLocking)
1371 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1372 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1373 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1374 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1375 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1376 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1377 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1378 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1379 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1380 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1381 FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
1382 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1383 FN_GLOBAL_BOOL(lp_hide_local_users, &Globals.bHideLocalUsers)
1384 FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
1385 FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
1386 FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
1388 /* local prototypes */
1390 static int map_parameter(const char *pszParmName);
1391 static BOOL set_boolean(BOOL *pb, const char *pszParmValue);
1392 static int getservicebyname(const char *pszServiceName,
1393 service * pserviceDest);
1394 static void copy_service(service * pserviceDest,
1395 service * pserviceSource, BOOL *pcopymapDest);
1396 static BOOL service_ok(int iService);
1397 static BOOL do_section(const char *pszSectionName);
1398 static void init_copymap(service * pservice);
1400 /* This is a helper function for parametrical options support. */
1401 /* It returns a pointer to parametrical option value if it exists or NULL otherwise */
1402 /* Actual parametrical functions are quite simple */
1403 static const char *get_parametrics(int lookup_service, const char *type, const char *option)
1406 struct param_opt *data;
1408 if (lookup_service >= iNumServices) return NULL;
1410 data = (lookup_service < 0) ?
1411 Globals.param_opt : ServicePtrs[lookup_service]->param_opt;
1413 asprintf(&vfskey, "%s:%s", type, option);
1417 if (strcmp(data->key, vfskey) == 0) {
1424 if (lookup_service >= 0) {
1425 /* Try to fetch the same option but from globals */
1426 /* but only if we are not already working with Globals */
1427 data = Globals.param_opt;
1429 if (strcmp(data->key, vfskey) == 0) {
1443 /*******************************************************************
1444 convenience routine to return int parameters.
1445 ********************************************************************/
1446 static int lp_int(const char *s)
1450 DEBUG(0,("lp_int(%s): is called with NULL!\n",s));
1457 /*******************************************************************
1458 convenience routine to return unsigned long parameters.
1459 ********************************************************************/
1460 static int lp_ulong(const char *s)
1464 DEBUG(0,("lp_int(%s): is called with NULL!\n",s));
1468 return strtoul(s, NULL, 10);
1471 /*******************************************************************
1472 convenience routine to return boolean parameters.
1473 ********************************************************************/
1474 static BOOL lp_bool(const char *s)
1479 DEBUG(0,("lp_bool(%s): is called with NULL!\n",s));
1483 if (!set_boolean(&ret,s)) {
1484 DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
1491 /*******************************************************************
1492 convenience routine to return enum parameters.
1493 ********************************************************************/
1494 static int lp_enum(const char *s,const struct enum_list *_enum)
1499 DEBUG(0,("lp_enum(%s,enum): is called with NULL!\n",s));
1503 for (i=0; _enum[i].name; i++) {
1504 if (strcasecmp(_enum[i].name,s)==0)
1505 return _enum[i].value;
1508 DEBUG(0,("lp_enum(%s,enum): value is not in enum_list!\n",s));
1512 /* Return parametric option from a given service. Type is a part of option before ':' */
1513 /* Parametric option has following syntax: 'Type: option = value' */
1514 /* Returned value is allocated in 'lp_talloc' context */
1516 const char *lp_parm_string(int lookup_service, const char *type, const char *option)
1518 const char *value = get_parametrics(lookup_service, type, option);
1521 return lp_string(value);
1526 /* Return parametric option from a given service. Type is a part of option before ':' */
1527 /* Parametric option has following syntax: 'Type: option = value' */
1528 /* Returned value is allocated in 'lp_talloc' context */
1530 char **lp_parm_string_list(int lookup_service, const char *type, const char *option,
1531 const char *separator)
1533 const char *value = get_parametrics(lookup_service, type, option);
1536 return str_list_make(value, separator);
1541 /* Return parametric option from a given service. Type is a part of option before ':' */
1542 /* Parametric option has following syntax: 'Type: option = value' */
1544 int lp_parm_int(int lookup_service, const char *type, const char *option)
1546 const char *value = get_parametrics(lookup_service, type, option);
1549 return lp_int(value);
1554 /* Return parametric option from a given service. Type is a part of option before ':' */
1555 /* Parametric option has following syntax: 'Type: option = value' */
1557 unsigned long lp_parm_ulong(int lookup_service, const char *type, const char *option)
1559 const char *value = get_parametrics(lookup_service, type, option);
1562 return lp_ulong(value);
1567 /* Return parametric option from a given service. Type is a part of option before ':' */
1568 /* Parametric option has following syntax: 'Type: option = value' */
1570 BOOL lp_parm_bool(int lookup_service, const char *type, const char *option, BOOL default_v)
1572 const char *value = get_parametrics(lookup_service, type, option);
1575 return lp_bool(value);
1580 /* Return parametric option from a given service. Type is a part of option before ':' */
1581 /* Parametric option has following syntax: 'Type: option = value' */
1583 int lp_parm_enum(int lookup_service, const char *type, const char *option,
1584 const struct enum_list *_enum)
1586 const char *value = get_parametrics(lookup_service, type, option);
1589 return lp_enum(value, _enum);
1595 /***************************************************************************
1596 Initialise a service to the defaults.
1597 ***************************************************************************/
1599 static void init_service(service * pservice)
1601 memset((char *)pservice, '\0', sizeof(service));
1602 copy_service(pservice, &sDefault, NULL);
1605 /***************************************************************************
1606 Free the dynamically allocated parts of a service struct.
1607 ***************************************************************************/
1609 static void free_service(service *pservice)
1612 struct param_opt *data, *pdata;
1616 if (pservice->szService)
1617 DEBUG(5, ("free_service: Freeing service %s\n",
1618 pservice->szService));
1620 string_free(&pservice->szService);
1621 SAFE_FREE(pservice->copymap);
1623 for (i = 0; parm_table[i].label; i++) {
1624 if ((parm_table[i].type == P_STRING ||
1625 parm_table[i].type == P_USTRING) &&
1626 parm_table[i].class == P_LOCAL)
1627 string_free((char **)
1628 (((char *)pservice) +
1629 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1630 else if (parm_table[i].type == P_LIST &&
1631 parm_table[i].class == P_LOCAL)
1632 str_list_free((char ***)
1633 (((char *)pservice) +
1634 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1637 DEBUG(5,("Freeing parametrics:\n"));
1638 data = pservice->param_opt;
1640 DEBUG(5,("[%s = %s]\n", data->key, data->value));
1641 string_free(&data->key);
1642 string_free(&data->value);
1648 ZERO_STRUCTP(pservice);
1651 /***************************************************************************
1652 Add a new service to the services array initialising it with the given
1654 ***************************************************************************/
1656 static int add_a_service(const service *pservice, const char *name)
1660 int num_to_alloc = iNumServices + 1;
1661 struct param_opt *data, *pdata;
1663 tservice = *pservice;
1665 /* it might already exist */
1667 i = getservicebyname(name, NULL);
1669 /* Clean all parametric options for service */
1670 /* They will be added during parsing again */
1671 data = ServicePtrs[i]->param_opt;
1673 string_free(&data->key);
1674 string_free(&data->value);
1679 ServicePtrs[i]->param_opt = NULL;
1684 /* find an invalid one */
1685 for (i = 0; i < iNumServices; i++)
1686 if (!ServicePtrs[i]->valid)
1689 /* if not, then create one */
1690 if (i == iNumServices) {
1693 tsp = (service **) Realloc(ServicePtrs,
1698 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
1703 ServicePtrs[iNumServices] =
1704 (service *) malloc(sizeof(service));
1706 if (!ServicePtrs[iNumServices]) {
1707 DEBUG(0,("add_a_service: out of memory!\n"));
1713 free_service(ServicePtrs[i]);
1715 ServicePtrs[i]->valid = True;
1717 init_service(ServicePtrs[i]);
1718 copy_service(ServicePtrs[i], &tservice, NULL);
1720 string_set(&ServicePtrs[i]->szService, name);
1724 /***************************************************************************
1725 Add a new home service, with the specified home directory, defaults coming
1727 ***************************************************************************/
1729 BOOL lp_add_home(const char *pszHomename, int iDefaultService,
1730 const char *user, const char *pszHomedir)
1735 i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
1740 if (!(*(ServicePtrs[iDefaultService]->szPath))
1741 || strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(-1))) {
1742 pstrcpy(newHomedir, pszHomedir);
1744 pstrcpy(newHomedir, lp_pathname(iDefaultService));
1745 string_sub(newHomedir,"%H", pszHomedir, sizeof(newHomedir));
1748 string_set(&ServicePtrs[i]->szPath, newHomedir);
1750 if (!(*(ServicePtrs[i]->comment))) {
1752 slprintf(comment, sizeof(comment) - 1,
1753 "Home directory of %s", user);
1754 string_set(&ServicePtrs[i]->comment, comment);
1756 ServicePtrs[i]->bAvailable = sDefault.bAvailable;
1757 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1759 DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename,
1765 /***************************************************************************
1766 Add a new service, based on an old one.
1767 ***************************************************************************/
1769 int lp_add_service(const char *pszService, int iDefaultService)
1771 return (add_a_service(ServicePtrs[iDefaultService], pszService));
1774 /***************************************************************************
1775 Add the IPC service.
1776 ***************************************************************************/
1778 static BOOL lp_add_ipc(const char *ipc_name, BOOL guest_ok)
1781 int i = add_a_service(&sDefault, ipc_name);
1786 slprintf(comment, sizeof(comment) - 1,
1787 "IPC Service (%s)", Globals.szServerString);
1789 string_set(&ServicePtrs[i]->szPath, tmpdir());
1790 string_set(&ServicePtrs[i]->szUsername, "");
1791 string_set(&ServicePtrs[i]->comment, comment);
1792 string_set(&ServicePtrs[i]->fstype, "IPC");
1793 ServicePtrs[i]->iMaxConnections = 0;
1794 ServicePtrs[i]->bAvailable = True;
1795 ServicePtrs[i]->bRead_only = True;
1796 ServicePtrs[i]->bGuest_only = False;
1797 ServicePtrs[i]->bGuest_ok = guest_ok;
1798 ServicePtrs[i]->bPrint_ok = False;
1799 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1801 DEBUG(3, ("adding IPC service\n"));
1806 /***************************************************************************
1807 Add a new printer service, with defaults coming from service iFrom.
1808 ***************************************************************************/
1810 BOOL lp_add_printer(const char *pszPrintername, int iDefaultService)
1812 const char *comment = "From Printcap";
1813 int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
1818 /* note that we do NOT default the availability flag to True - */
1819 /* we take it from the default service passed. This allows all */
1820 /* dynamic printers to be disabled by disabling the [printers] */
1821 /* entry (if/when the 'available' keyword is implemented!). */
1823 /* the printer name is set to the service name. */
1824 string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
1825 string_set(&ServicePtrs[i]->comment, comment);
1826 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1827 /* Printers cannot be read_only. */
1828 ServicePtrs[i]->bRead_only = False;
1829 /* No share modes on printer services. */
1830 ServicePtrs[i]->bShareModes = False;
1831 /* No oplocks on printer services. */
1832 ServicePtrs[i]->bOpLocks = False;
1833 /* Printer services must be printable. */
1834 ServicePtrs[i]->bPrint_ok = True;
1836 DEBUG(3, ("adding printer service %s\n", pszPrintername));
1838 update_server_announce_as_printserver();
1843 /***************************************************************************
1844 Map a parameter's string representation to something we can use.
1845 Returns False if the parameter string is not recognised, else TRUE.
1846 ***************************************************************************/
1848 static int map_parameter(const char *pszParmName)
1852 if (*pszParmName == '-')
1855 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1856 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1859 /* Warn only if it isn't parametric option */
1860 if (strchr(pszParmName, ':') == NULL)
1861 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
1862 /* We do return 'fail' for parametric options as well because they are
1863 stored in different storage
1868 /***************************************************************************
1869 Set a boolean variable from the text value stored in the passed string.
1870 Returns True in success, False if the passed string does not correctly
1871 represent a boolean.
1872 ***************************************************************************/
1874 static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
1879 if (strwicmp(pszParmValue, "yes") == 0 ||
1880 strwicmp(pszParmValue, "true") == 0 ||
1881 strwicmp(pszParmValue, "1") == 0)
1883 else if (strwicmp(pszParmValue, "no") == 0 ||
1884 strwicmp(pszParmValue, "False") == 0 ||
1885 strwicmp(pszParmValue, "0") == 0)
1889 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1896 /***************************************************************************
1897 Find a service by name. Otherwise works like get_service.
1898 ***************************************************************************/
1900 static int getservicebyname(const char *pszServiceName, service * pserviceDest)
1904 for (iService = iNumServices - 1; iService >= 0; iService--)
1905 if (VALID(iService) &&
1906 strwicmp(ServicePtrs[iService]->szService, pszServiceName) == 0) {
1907 if (pserviceDest != NULL)
1908 copy_service(pserviceDest, ServicePtrs[iService], NULL);
1915 /***************************************************************************
1916 Copy a service structure to another.
1917 If pcopymapDest is NULL then copy all fields
1918 ***************************************************************************/
1920 static void copy_service(service * pserviceDest, service * pserviceSource, BOOL *pcopymapDest)
1923 BOOL bcopyall = (pcopymapDest == NULL);
1924 struct param_opt *data, *pdata, *paramo;
1927 for (i = 0; parm_table[i].label; i++)
1928 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
1929 (bcopyall || pcopymapDest[i])) {
1930 void *def_ptr = parm_table[i].ptr;
1932 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
1935 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
1938 switch (parm_table[i].type) {
1941 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
1947 *(int *)dest_ptr = *(int *)src_ptr;
1951 *(char *)dest_ptr = *(char *)src_ptr;
1955 string_set(dest_ptr,
1960 string_set(dest_ptr,
1962 strupper(*(char **)dest_ptr);
1965 str_list_copy((char ***)dest_ptr, *(const char ***)src_ptr);
1973 init_copymap(pserviceDest);
1974 if (pserviceSource->copymap)
1975 memcpy((void *)pserviceDest->copymap,
1976 (void *)pserviceSource->copymap,
1977 sizeof(BOOL) * NUMPARAMETERS);
1980 data = pserviceSource->param_opt;
1983 pdata = pserviceDest->param_opt;
1984 /* Traverse destination */
1986 /* If we already have same option, override it */
1987 if (strcmp(pdata->key, data->key) == 0) {
1988 string_free(&pdata->value);
1989 pdata->value = strdup(data->value);
1993 pdata = pdata->next;
1996 paramo = smb_xmalloc(sizeof(*paramo));
1997 paramo->key = strdup(data->key);
1998 paramo->value = strdup(data->value);
1999 DLIST_ADD(pserviceDest->param_opt, paramo);
2005 /***************************************************************************
2006 Check a service for consistency. Return False if the service is in any way
2007 incomplete or faulty, else True.
2008 ***************************************************************************/
2010 static BOOL service_ok(int iService)
2015 if (ServicePtrs[iService]->szService[0] == '\0') {
2016 DEBUG(0, ("The following message indicates an internal error:\n"));
2017 DEBUG(0, ("No service name in service entry.\n"));
2021 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2022 /* I can't see why you'd want a non-printable printer service... */
2023 if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
2024 if (!ServicePtrs[iService]->bPrint_ok) {
2025 DEBUG(0, ("WARNING: [%s] service MUST be printable!\n",
2026 ServicePtrs[iService]->szService));
2027 ServicePtrs[iService]->bPrint_ok = True;
2029 /* [printers] service must also be non-browsable. */
2030 if (ServicePtrs[iService]->bBrowseable)
2031 ServicePtrs[iService]->bBrowseable = False;
2034 if (ServicePtrs[iService]->szPath[0] == '\0' &&
2035 strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0) {
2036 DEBUG(0, ("No path in service %s - using %s\n",
2037 ServicePtrs[iService]->szService, tmpdir()));
2038 string_set(&ServicePtrs[iService]->szPath, tmpdir());
2041 /* If a service is flagged unavailable, log the fact at level 0. */
2042 if (!ServicePtrs[iService]->bAvailable)
2043 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2044 ServicePtrs[iService]->szService));
2049 static struct file_lists {
2050 struct file_lists *next;
2054 } *file_lists = NULL;
2056 /*******************************************************************
2057 Keep a linked list of all config files so we know when one has changed
2058 it's date and needs to be reloaded.
2059 ********************************************************************/
2061 static void add_to_file_list(const char *fname, const char *subfname)
2063 struct file_lists *f = file_lists;
2066 if (f->name && !strcmp(f->name, fname))
2072 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2075 f->next = file_lists;
2076 f->name = strdup(fname);
2081 f->subfname = strdup(subfname);
2087 f->modtime = file_modtime(subfname);
2089 time_t t = file_modtime(subfname);
2095 /*******************************************************************
2096 Check if a config file has changed date.
2097 ********************************************************************/
2099 BOOL lp_file_list_changed(void)
2101 struct file_lists *f = file_lists;
2102 DEBUG(6, ("lp_file_list_changed()\n"));
2108 pstrcpy(n2, f->name);
2109 standard_sub_basic(n2,sizeof(n2));
2111 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2112 f->name, n2, ctime(&f->modtime)));
2114 mod_time = file_modtime(n2);
2116 if (mod_time && ((f->modtime != mod_time) || (f->subfname == NULL) || (strcmp(n2, f->subfname) != 0))) {
2118 ("file %s modified: %s\n", n2,
2120 f->modtime = mod_time;
2121 SAFE_FREE(f->subfname);
2122 f->subfname = strdup(n2);
2130 /***************************************************************************
2131 Handle the include operation.
2132 ***************************************************************************/
2134 static BOOL handle_include(const char *pszParmValue, char **ptr)
2137 pstrcpy(fname, pszParmValue);
2139 standard_sub_basic(fname,sizeof(fname));
2141 add_to_file_list(pszParmValue, fname);
2143 string_set(ptr, fname);
2145 if (file_exist(fname, NULL))
2146 return (pm_process(fname, do_section, do_parameter));
2148 DEBUG(2, ("Can't find include file %s\n", fname));
2153 /***************************************************************************
2154 Handle the interpretation of the copy parameter.
2155 ***************************************************************************/
2157 static BOOL handle_copy(const char *pszParmValue, char **ptr)
2161 service serviceTemp;
2163 string_set(ptr, pszParmValue);
2165 init_service(&serviceTemp);
2169 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2171 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0) {
2172 if (iTemp == iServiceIndex) {
2173 DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue));
2175 copy_service(ServicePtrs[iServiceIndex],
2177 ServicePtrs[iServiceIndex]->copymap);
2181 DEBUG(0, ("Unable to copy service - source not found: %s\n", pszParmValue));
2185 free_service(&serviceTemp);
2189 /***************************************************************************
2190 Handle winbind/non unix account uid and gid allocation parameters. The format of these
2195 winbind uid = 1000-1999
2196 winbind gid = 700-899
2198 We only do simple parsing checks here. The strings are parsed into useful
2199 structures in the winbind daemon code.
2201 ***************************************************************************/
2203 /* Some lp_ routines to return winbind [ug]id information */
2205 static uid_t winbind_uid_low, winbind_uid_high;
2206 static gid_t winbind_gid_low, winbind_gid_high;
2207 static uint32_t non_unix_account_low, non_unix_account_high;
2209 BOOL lp_winbind_uid(uid_t *low, uid_t *high)
2211 if (winbind_uid_low == 0 || winbind_uid_high == 0)
2215 *low = winbind_uid_low;
2218 *high = winbind_uid_high;
2223 BOOL lp_winbind_gid(gid_t *low, gid_t *high)
2225 if (winbind_gid_low == 0 || winbind_gid_high == 0)
2229 *low = winbind_gid_low;
2232 *high = winbind_gid_high;
2237 BOOL lp_non_unix_account_range(uint32_t *low, uint32_t *high)
2239 if (non_unix_account_low == 0 || non_unix_account_high == 0)
2243 *low = non_unix_account_low;
2246 *high = non_unix_account_high;
2251 /* Do some simple checks on "winbind [ug]id" parameter values */
2253 static BOOL handle_winbind_uid(const char *pszParmValue, char **ptr)
2257 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2262 string_set(ptr, pszParmValue);
2264 winbind_uid_low = low;
2265 winbind_uid_high = high;
2270 static BOOL handle_winbind_gid(const char *pszParmValue, char **ptr)
2274 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2279 string_set(ptr, pszParmValue);
2281 winbind_gid_low = low;
2282 winbind_gid_high = high;
2287 /***************************************************************************
2288 Do some simple checks on "non unix account range" parameter values.
2289 ***************************************************************************/
2291 static BOOL handle_non_unix_account_range(const char *pszParmValue, char **ptr)
2295 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2300 string_set(ptr, pszParmValue);
2302 non_unix_account_low = low;
2303 non_unix_account_high = high;
2308 /***************************************************************************
2309 Handle the ldap machine suffix option.
2310 ***************************************************************************/
2312 static BOOL handle_ldap_machine_suffix( const char *pszParmValue, char **ptr)
2316 pstrcpy(suffix, pszParmValue);
2318 if (! *Globals.szLdapSuffix ) {
2319 string_set( ptr, suffix );
2323 if (! strstr(suffix, Globals.szLdapSuffix) ) {
2324 if ( *pszParmValue )
2325 pstrcat(suffix, ",");
2326 pstrcat(suffix, Globals.szLdapSuffix);
2328 string_set( ptr, suffix );
2332 /***************************************************************************
2333 Handle the ldap user suffix option.
2334 ***************************************************************************/
2336 static BOOL handle_ldap_user_suffix( const char *pszParmValue, char **ptr)
2340 pstrcpy(suffix, pszParmValue);
2342 if (! *Globals.szLdapSuffix ) {
2343 string_set( ptr, suffix );
2347 if (! strstr(suffix, Globals.szLdapSuffix) ) {
2348 if ( *pszParmValue )
2349 pstrcat(suffix, ",");
2350 pstrcat(suffix, Globals.szLdapSuffix);
2352 string_set( ptr, suffix );
2356 /***************************************************************************
2357 Handle setting ldap suffix and determines whether ldap machine suffix needs
2359 ***************************************************************************/
2361 static BOOL handle_ldap_suffix( const char *pszParmValue, char **ptr)
2364 pstring user_suffix;
2365 pstring machine_suffix;
2367 pstrcpy(suffix, pszParmValue);
2369 if (! *Globals.szLdapMachineSuffix )
2370 string_set(&Globals.szLdapMachineSuffix, suffix);
2371 if (! *Globals.szLdapUserSuffix )
2372 string_set(&Globals.szLdapUserSuffix, suffix);
2374 if (! strstr(Globals.szLdapMachineSuffix, suffix)) {
2375 pstrcpy(machine_suffix, Globals.szLdapMachineSuffix);
2376 if ( *Globals.szLdapMachineSuffix )
2377 pstrcat(machine_suffix, ",");
2378 pstrcat(machine_suffix, suffix);
2379 string_set(&Globals.szLdapMachineSuffix, machine_suffix);
2382 if (! strstr(Globals.szLdapUserSuffix, suffix)) {
2383 pstrcpy(user_suffix, Globals.szLdapUserSuffix);
2384 if ( *Globals.szLdapUserSuffix )
2385 pstrcat(user_suffix, ",");
2386 pstrcat(user_suffix, suffix);
2387 string_set(&Globals.szLdapUserSuffix, user_suffix);
2390 string_set(ptr, suffix);
2395 /***************************************************************************
2396 Initialise a copymap.
2397 ***************************************************************************/
2399 static void init_copymap(service * pservice)
2402 SAFE_FREE(pservice->copymap);
2403 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2404 if (!pservice->copymap)
2406 ("Couldn't allocate copymap!! (size %d)\n",
2407 (int)NUMPARAMETERS));
2409 for (i = 0; i < NUMPARAMETERS; i++)
2410 pservice->copymap[i] = True;
2413 /***************************************************************************
2414 Return the local pointer to a parameter given the service number and the
2415 pointer into the default structure.
2416 ***************************************************************************/
2418 void *lp_local_ptr(int snum, void *ptr)
2420 return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
2424 /***************************************************************************
2425 Process a parametric option
2426 ***************************************************************************/
2427 static BOOL lp_do_parameter_parametric(int snum, const char *pszParmName, const char *pszParmValue, int flags)
2429 struct param_opt *paramo, *data;
2432 while (isspace(*pszParmName)) {
2436 name = strdup(pszParmName);
2437 if (!name) return False;
2442 data = Globals.param_opt;
2444 data = ServicePtrs[snum]->param_opt;
2447 /* Traverse destination */
2448 for (paramo=data; paramo; paramo=paramo->next) {
2449 /* If we already have the option set, override it unless
2450 it was a command line option and the new one isn't */
2451 if (strcmp(paramo->key, name) == 0) {
2452 if ((paramo->flags & FLAG_CMDLINE) &&
2453 !(flags & FLAG_CMDLINE)) {
2457 free(paramo->value);
2458 paramo->value = strdup(pszParmValue);
2459 paramo->flags = flags;
2465 paramo = smb_xmalloc(sizeof(*paramo));
2466 paramo->key = strdup(name);
2467 paramo->value = strdup(pszParmValue);
2468 paramo->flags = flags;
2470 DLIST_ADD(Globals.param_opt, paramo);
2472 DLIST_ADD(ServicePtrs[snum]->param_opt, paramo);
2480 /***************************************************************************
2481 Process a parameter for a particular service number. If snum < 0
2482 then assume we are in the globals.
2483 ***************************************************************************/
2484 BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
2487 void *parm_ptr = NULL; /* where we are going to store the result */
2488 void *def_ptr = NULL;
2490 parmnum = map_parameter(pszParmName);
2493 if (strchr(pszParmName, ':')) {
2494 return lp_do_parameter_parametric(snum, pszParmName, pszParmValue, 0);
2496 DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2500 if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
2501 DEBUG(1, ("WARNING: The \"%s\" option is deprecated\n",
2505 /* if the flag has been set on the command line, then don't allow override,
2506 but don't report an error */
2507 if (parm_table[parmnum].flags & FLAG_CMDLINE) {
2511 def_ptr = parm_table[parmnum].ptr;
2513 /* we might point at a service, the default service or a global */
2517 if (parm_table[parmnum].class == P_GLOBAL) {
2519 ("Global parameter %s found in service section!\n",
2524 ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
2529 if (!ServicePtrs[snum]->copymap)
2530 init_copymap(ServicePtrs[snum]);
2532 /* this handles the aliases - set the copymap for other entries with
2533 the same data pointer */
2534 for (i = 0; parm_table[i].label; i++)
2535 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2536 ServicePtrs[snum]->copymap[i] = False;
2539 /* if it is a special case then go ahead */
2540 if (parm_table[parmnum].special) {
2541 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2545 /* now switch on the type of variable it is */
2546 switch (parm_table[parmnum].type)
2549 set_boolean(parm_ptr, pszParmValue);
2553 set_boolean(parm_ptr, pszParmValue);
2554 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2558 *(int *)parm_ptr = atoi(pszParmValue);
2562 *(char *)parm_ptr = *pszParmValue;
2566 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2570 *(char ***)parm_ptr = str_list_make(pszParmValue, NULL);
2574 string_set(parm_ptr, pszParmValue);
2578 string_set(parm_ptr, pszParmValue);
2579 strupper(*(char **)parm_ptr);
2583 for (i = 0; parm_table[parmnum].enum_list[i].name; i++) {
2586 parm_table[parmnum].enum_list[i].name)) {
2588 parm_table[parmnum].
2601 /***************************************************************************
2602 Process a parameter.
2603 ***************************************************************************/
2605 static BOOL do_parameter(const char *pszParmName, const char *pszParmValue)
2607 if (!bInGlobalSection && bGlobalOnly)
2610 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2612 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2613 pszParmName, pszParmValue));
2618 set a parameter from the commandline - this is called from command line parameter
2619 parsing code. It sets the parameter then marks the parameter as unable to be modified
2620 by smb.conf processing
2622 BOOL lp_set_cmdline(const char *pszParmName, const char *pszParmValue)
2624 int parmnum = map_parameter(pszParmName);
2626 if (parmnum < 0 && strchr(pszParmName, ':')) {
2627 /* set a parametric option */
2628 return lp_do_parameter_parametric(-1, pszParmName, pszParmValue, FLAG_CMDLINE);
2631 /* reset the CMDLINE flag in case this has been called before */
2632 parm_table[parmnum].flags &= ~FLAG_CMDLINE;
2634 if (!lp_do_parameter(-2, pszParmName, pszParmValue)) {
2638 parm_table[parmnum].flags |= FLAG_CMDLINE;
2642 /***************************************************************************
2643 Print a parameter of the specified type.
2644 ***************************************************************************/
2646 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
2652 for (i = 0; p->enum_list[i].name; i++) {
2653 if (*(int *)ptr == p->enum_list[i].value) {
2655 p->enum_list[i].name);
2662 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2666 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2670 fprintf(f, "%d", *(int *)ptr);
2674 fprintf(f, "%c", *(char *)ptr);
2678 fprintf(f, "%s", octal_string(*(int *)ptr));
2682 if ((char ***)ptr && *(char ***)ptr) {
2683 char **list = *(char ***)ptr;
2685 for (; *list; list++)
2686 fprintf(f, "%s%s", *list,
2687 ((*(list+1))?", ":""));
2693 if (*(char **)ptr) {
2694 fprintf(f, "%s", *(char **)ptr);
2702 /***************************************************************************
2703 Check if two parameters are equal.
2704 ***************************************************************************/
2706 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2711 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2716 return (*((int *)ptr1) == *((int *)ptr2));
2719 return (*((char *)ptr1) == *((char *)ptr2));
2722 return str_list_compare(*(char ***)ptr1, *(char ***)ptr2);
2727 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2732 return (p1 == p2 || strequal(p1, p2));
2740 /***************************************************************************
2741 Process a new section (service). At this stage all sections are services.
2742 Later we'll have special sections that permit server parameters to be set.
2743 Returns True on success, False on failure.
2744 ***************************************************************************/
2746 static BOOL do_section(const char *pszSectionName)
2749 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2750 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2753 /* if we've just struck a global section, note the fact. */
2754 bInGlobalSection = isglobal;
2756 /* check for multiple global sections */
2757 if (bInGlobalSection) {
2758 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
2762 if (!bInGlobalSection && bGlobalOnly)
2765 /* if we have a current service, tidy it up before moving on */
2768 if (iServiceIndex >= 0)
2769 bRetval = service_ok(iServiceIndex);
2771 /* if all is still well, move to the next record in the services array */
2773 /* We put this here to avoid an odd message order if messages are */
2774 /* issued by the post-processing of a previous section. */
2775 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
2777 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
2779 DEBUG(0, ("Failed to add a new service\n"));
2788 /***************************************************************************
2789 Determine if a partcular base parameter is currentl set to the default value.
2790 ***************************************************************************/
2792 static BOOL is_default(int i)
2794 if (!defaults_saved)
2796 switch (parm_table[i].type) {
2798 return str_list_compare (parm_table[i].def.lvalue,
2799 *(char ***)parm_table[i].ptr);
2802 return strequal(parm_table[i].def.svalue,
2803 *(char **)parm_table[i].ptr);
2806 return parm_table[i].def.bvalue ==
2807 *(BOOL *)parm_table[i].ptr;
2809 return parm_table[i].def.cvalue ==
2810 *(char *)parm_table[i].ptr;
2814 return parm_table[i].def.ivalue ==
2815 *(int *)parm_table[i].ptr;
2822 /***************************************************************************
2823 Display the contents of the global structure.
2824 ***************************************************************************/
2826 static void dump_globals(FILE *f)
2829 struct param_opt *data;
2831 fprintf(f, "# Global parameters\n[global]\n");
2833 for (i = 0; parm_table[i].label; i++)
2834 if (parm_table[i].class == P_GLOBAL &&
2835 parm_table[i].ptr &&
2836 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
2837 if (defaults_saved && is_default(i))
2839 fprintf(f, "\t%s = ", parm_table[i].label);
2840 print_parameter(&parm_table[i], parm_table[i].ptr, f);
2843 if (Globals.param_opt != NULL) {
2844 data = Globals.param_opt;
2846 fprintf(f, "\t%s = %s\n", data->key, data->value);
2853 /***************************************************************************
2854 Return True if a local parameter is currently set to the global default.
2855 ***************************************************************************/
2857 BOOL lp_is_default(int snum, struct parm_struct *parm)
2859 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
2861 return equal_parameter(parm->type,
2862 ((char *)ServicePtrs[snum]) + pdiff,
2863 ((char *)&sDefault) + pdiff);
2866 /***************************************************************************
2867 Display the contents of a single services record.
2868 ***************************************************************************/
2870 static void dump_a_service(service * pService, FILE * f)
2873 struct param_opt *data;
2875 if (pService != &sDefault)
2876 fprintf(f, "\n[%s]\n", pService->szService);
2878 for (i = 0; parm_table[i].label; i++)
2879 if (parm_table[i].class == P_LOCAL &&
2880 parm_table[i].ptr &&
2881 (*parm_table[i].label != '-') &&
2882 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
2883 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
2885 if (pService == &sDefault) {
2886 if (defaults_saved && is_default(i))
2889 if (equal_parameter(parm_table[i].type,
2890 ((char *)pService) +
2892 ((char *)&sDefault) +
2897 fprintf(f, "\t%s = ", parm_table[i].label);
2898 print_parameter(&parm_table[i],
2899 ((char *)pService) + pdiff, f);
2902 if (pService->param_opt != NULL) {
2903 data = pService->param_opt;
2905 fprintf(f, "\t%s = %s\n", data->key, data->value);
2912 /***************************************************************************
2913 Return info about the next service in a service. snum==-1 gives the globals.
2914 Return NULL when out of parameters.
2915 ***************************************************************************/
2917 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
2920 /* do the globals */
2921 for (; parm_table[*i].label; (*i)++) {
2922 if (parm_table[*i].class == P_SEPARATOR)
2923 return &parm_table[(*i)++];
2925 if (!parm_table[*i].ptr
2926 || (*parm_table[*i].label == '-'))
2930 && (parm_table[*i].ptr ==
2931 parm_table[(*i) - 1].ptr))
2934 return &parm_table[(*i)++];
2937 service *pService = ServicePtrs[snum];
2939 for (; parm_table[*i].label; (*i)++) {
2940 if (parm_table[*i].class == P_SEPARATOR)
2941 return &parm_table[(*i)++];
2943 if (parm_table[*i].class == P_LOCAL &&
2944 parm_table[*i].ptr &&
2945 (*parm_table[*i].label != '-') &&
2947 (parm_table[*i].ptr !=
2948 parm_table[(*i) - 1].ptr)))
2951 PTR_DIFF(parm_table[*i].ptr,
2954 if (allparameters ||
2955 !equal_parameter(parm_table[*i].type,
2956 ((char *)pService) +
2958 ((char *)&sDefault) +
2961 return &parm_table[(*i)++];
2972 /***************************************************************************
2973 Display the contents of a single copy structure.
2974 ***************************************************************************/
2975 static void dump_copy_map(BOOL *pcopymap)
2981 printf("\n\tNon-Copied parameters:\n");
2983 for (i = 0; parm_table[i].label; i++)
2984 if (parm_table[i].class == P_LOCAL &&
2985 parm_table[i].ptr && !pcopymap[i] &&
2986 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2988 printf("\t\t%s\n", parm_table[i].label);
2993 /***************************************************************************
2994 Return TRUE if the passed service number is within range.
2995 ***************************************************************************/
2997 BOOL lp_snum_ok(int iService)
2999 return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
3002 /***************************************************************************
3003 Auto-load some home services.
3004 ***************************************************************************/
3006 static void lp_add_auto_services(const char *str)
3011 /***************************************************************************
3012 Auto-load one printer.
3013 ***************************************************************************/
3015 void lp_add_one_printer(char *name, char *comment)
3017 int printers = lp_servicenumber(PRINTERS_NAME);
3020 if (lp_servicenumber(name) < 0) {
3021 lp_add_printer(name, printers);
3022 if ((i = lp_servicenumber(name)) >= 0) {
3023 string_set(&ServicePtrs[i]->comment, comment);
3024 ServicePtrs[i]->autoloaded = True;
3029 /***************************************************************************
3030 Announce ourselves as a print server.
3031 ***************************************************************************/
3033 void update_server_announce_as_printserver(void)
3035 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3038 /***************************************************************************
3039 Have we loaded a services file yet?
3040 ***************************************************************************/
3042 BOOL lp_loaded(void)
3047 /***************************************************************************
3048 Unload unused services.
3049 ***************************************************************************/
3051 void lp_killunused(struct smbsrv_connection *smb, BOOL (*snumused) (struct smbsrv_connection *, int))
3054 for (i = 0; i < iNumServices; i++) {
3058 if (!snumused || !snumused(smb, i)) {
3059 ServicePtrs[i]->valid = False;
3060 free_service(ServicePtrs[i]);
3065 /***************************************************************************
3067 ***************************************************************************/
3069 void lp_killservice(int iServiceIn)
3071 if (VALID(iServiceIn)) {
3072 ServicePtrs[iServiceIn]->valid = False;
3073 free_service(ServicePtrs[iServiceIn]);
3077 /***************************************************************************
3078 Save the curent values of all global and sDefault parameters into the
3079 defaults union. This allows swat and testparm to show only the
3080 changed (ie. non-default) parameters.
3081 ***************************************************************************/
3083 static void lp_save_defaults(void)
3086 for (i = 0; parm_table[i].label; i++) {
3087 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3089 switch (parm_table[i].type) {
3091 str_list_copy(&(parm_table[i].def.lvalue),
3092 *(const char ***)parm_table[i].ptr);
3096 if (parm_table[i].ptr) {
3097 parm_table[i].def.svalue = strdup(*(char **)parm_table[i].ptr);
3099 parm_table[i].def.svalue = NULL;
3104 parm_table[i].def.bvalue =
3105 *(BOOL *)parm_table[i].ptr;
3108 parm_table[i].def.cvalue =
3109 *(char *)parm_table[i].ptr;
3114 parm_table[i].def.ivalue =
3115 *(int *)parm_table[i].ptr;
3121 defaults_saved = True;
3124 /*******************************************************************
3125 Set the server type we will announce as via nmbd.
3126 ********************************************************************/
3128 static void set_server_role(void)
3130 server_role = ROLE_STANDALONE;
3132 switch (lp_security()) {
3134 if (lp_domain_logons())
3135 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
3140 if (lp_domain_logons()) {
3141 server_role = ROLE_DOMAIN_PDC;
3144 server_role = ROLE_DOMAIN_MEMBER;
3147 if (lp_domain_logons()) {
3149 if (Globals.bDomainMaster) /* auto or yes */
3150 server_role = ROLE_DOMAIN_PDC;
3152 server_role = ROLE_DOMAIN_BDC;
3156 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
3160 DEBUG(10, ("set_server_role: role = "));
3162 switch(server_role) {
3163 case ROLE_STANDALONE:
3164 DEBUGADD(10, ("ROLE_STANDALONE\n"));
3166 case ROLE_DOMAIN_MEMBER:
3167 DEBUGADD(10, ("ROLE_DOMAIN_MEMBER\n"));
3169 case ROLE_DOMAIN_BDC:
3170 DEBUGADD(10, ("ROLE_DOMAIN_BDC\n"));
3172 case ROLE_DOMAIN_PDC:
3173 DEBUGADD(10, ("ROLE_DOMAIN_PDC\n"));
3178 /***************************************************************************
3179 Load the services array from the services file. Return True on success,
3181 ***************************************************************************/
3183 BOOL lp_load(const char *pszFname, BOOL global_only, BOOL save_defaults,
3188 struct param_opt *data;
3190 pstrcpy(n2, pszFname);
3191 standard_sub_basic(n2,sizeof(n2));
3193 add_to_file_list(pszFname, n2);
3197 DEBUG(2, ("lp_load: refreshing parameters from %s\n", pszFname));
3199 bInGlobalSection = True;
3200 bGlobalOnly = global_only;
3209 if (Globals.param_opt != NULL) {
3210 struct param_opt *next;
3211 for (data=Globals.param_opt; data; data=next) {
3213 if (data->flags & FLAG_CMDLINE) continue;
3216 DLIST_REMOVE(Globals.param_opt, data);
3221 /* We get sections first, so have to start 'behind' to make up */
3223 bRetval = pm_process(n2, do_section, do_parameter);
3225 /* finish up the last section */
3226 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3228 if (iServiceIndex >= 0)
3229 bRetval = service_ok(iServiceIndex);
3231 lp_add_auto_services(lp_auto_services());
3234 /* When 'restrict anonymous = 2' guest connections to ipc$
3236 lp_add_ipc("IPC$", (lp_restrict_anonymous() < 2));
3237 lp_add_ipc("ADMIN$", False);
3241 set_default_server_announce_type();
3245 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3246 /* if bWINSsupport is true and we are in the client */
3247 if (in_client && Globals.bWINSsupport) {
3248 lp_do_parameter(-1, "wins server", "127.0.0.1");
3256 /***************************************************************************
3257 Reset the max number of services.
3258 ***************************************************************************/
3260 void lp_resetnumservices(void)
3265 /***************************************************************************
3266 Return the max number of services.
3267 ***************************************************************************/
3269 int lp_numservices(void)
3271 return (iNumServices);
3274 /***************************************************************************
3275 Display the contents of the services array in human-readable form.
3276 ***************************************************************************/
3278 void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
3283 defaults_saved = False;
3287 dump_a_service(&sDefault, f);
3289 for (iService = 0; iService < maxtoprint; iService++)
3290 lp_dump_one(f, show_defaults, iService);
3293 /***************************************************************************
3294 Display the contents of one service in human-readable form.
3295 ***************************************************************************/
3297 void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
3300 if (ServicePtrs[snum]->szService[0] == '\0')
3302 dump_a_service(ServicePtrs[snum], f);
3306 /***************************************************************************
3307 Return the number of the service with the given name, or -1 if it doesn't
3308 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3309 getservicebyname()! This works ONLY if all services have been loaded, and
3310 does not copy the found service.
3311 ***************************************************************************/
3313 int lp_servicenumber(const char *pszServiceName)
3316 fstring serviceName;
3319 for (iService = iNumServices - 1; iService >= 0; iService--) {
3320 if (VALID(iService) && ServicePtrs[iService]->szService) {
3322 * The substitution here is used to support %U is
3325 fstrcpy(serviceName, ServicePtrs[iService]->szService);
3326 standard_sub_basic(serviceName,sizeof(serviceName));
3327 if (strequal(serviceName, pszServiceName))
3333 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
3338 /*******************************************************************
3339 A useful volume label function.
3340 ********************************************************************/
3341 const char *volume_label(int snum)
3343 const char *ret = lp_volume(snum);
3345 return lp_servicename(snum);
3350 /*******************************************************************
3351 Set the server type we will announce as via nmbd.
3352 ********************************************************************/
3354 static void set_default_server_announce_type(void)
3356 default_server_announce = 0;
3357 default_server_announce |= SV_TYPE_WORKSTATION;
3358 default_server_announce |= SV_TYPE_SERVER;
3359 default_server_announce |= SV_TYPE_SERVER_UNIX;
3361 switch (lp_announce_as()) {
3362 case ANNOUNCE_AS_NT_SERVER:
3363 default_server_announce |= SV_TYPE_SERVER_NT;
3364 /* fall through... */
3365 case ANNOUNCE_AS_NT_WORKSTATION:
3366 default_server_announce |= SV_TYPE_NT;
3368 case ANNOUNCE_AS_WIN95:
3369 default_server_announce |= SV_TYPE_WIN95_PLUS;
3371 case ANNOUNCE_AS_WFW:
3372 default_server_announce |= SV_TYPE_WFW;
3378 switch (lp_server_role()) {
3379 case ROLE_DOMAIN_MEMBER:
3380 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3382 case ROLE_DOMAIN_PDC:
3383 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3385 case ROLE_DOMAIN_BDC:
3386 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3388 case ROLE_STANDALONE:
3392 if (lp_time_server())
3393 default_server_announce |= SV_TYPE_TIME_SOURCE;
3395 if (lp_host_msdfs())
3396 default_server_announce |= SV_TYPE_DFS_SERVER;
3399 /***********************************************************
3400 returns role of Samba server
3401 ************************************************************/
3403 int lp_server_role(void)
3408 /***********************************************************
3409 If we are PDC then prefer us as DMB
3410 ************************************************************/
3412 BOOL lp_domain_master(void)
3414 if (Globals.bDomainMaster == Auto)
3415 return (lp_server_role() == ROLE_DOMAIN_PDC);
3417 return Globals.bDomainMaster;
3420 /***********************************************************
3421 If we are DMB then prefer us as LMB
3422 ************************************************************/
3424 BOOL lp_preferred_master(void)
3426 if (Globals.bPreferredMaster == Auto)
3427 return (lp_local_master() && lp_domain_master());
3429 return Globals.bPreferredMaster;
3432 /*******************************************************************
3434 ********************************************************************/
3436 void lp_remove_service(int snum)
3438 ServicePtrs[snum]->valid = False;
3441 /*******************************************************************
3443 ********************************************************************/
3445 void lp_copy_service(int snum, const char *new_name)
3447 const char *oldname = lp_servicename(snum);
3448 do_section(new_name);
3450 snum = lp_servicenumber(new_name);
3452 lp_do_parameter(snum, "copy", oldname);
3457 /*******************************************************************
3458 Get the default server type we will announce as via nmbd.
3459 ********************************************************************/
3461 int lp_default_server_announce(void)
3463 return default_server_announce;
3466 /*******************************************************************
3467 Split the announce version into major and minor numbers.
3468 ********************************************************************/
3470 int lp_major_announce_version(void)
3472 static BOOL got_major = False;
3473 static int major_version = DEFAULT_MAJOR_VERSION;
3478 return major_version;
3481 if ((vers = lp_announce_version()) == NULL)
3482 return major_version;
3484 if ((p = strchr_m(vers, '.')) == 0)
3485 return major_version;
3488 major_version = atoi(vers);
3489 return major_version;
3492 int lp_minor_announce_version(void)
3494 static BOOL got_minor = False;
3495 static int minor_version = DEFAULT_MINOR_VERSION;
3500 return minor_version;
3503 if ((vers = lp_announce_version()) == NULL)
3504 return minor_version;
3506 if ((p = strchr_m(vers, '.')) == 0)
3507 return minor_version;
3510 minor_version = atoi(p);
3511 return minor_version;
3514 const char *lp_printername(int snum)
3516 const char *ret = _lp_printername(snum);
3517 if (ret == NULL || (ret != NULL && *ret == '\0'))
3518 ret = lp_const_servicename(snum);
3524 /*******************************************************************
3525 Return the max print jobs per queue.
3526 ********************************************************************/
3528 int lp_maxprintjobs(int snum)
3530 int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
3531 if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
3532 maxjobs = PRINT_MAX_JOBID - 1;