2 Unix SMB/Netbios implementation.
4 Parameter loading functions
5 Copyright (C) Karl Auer 1993-1998
7 Largely re-written by Andrew Tridgell, September 1994
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 * This module provides suitable callback functions for the params
28 * module. It builds the internal table of service details which is
29 * then used by the rest of the server.
33 * 1) add it to the global or service structure definition
34 * 2) add it to the parm_table
35 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
36 * 4) If it's a global then initialise it in init_globals. If a local
37 * (ie. service) parameter then initialise it in the sDefault structure
41 * The configuration file is processed sequentially for speed. It is NOT
42 * accessed randomly as happens in 'real' Windows. For this reason, there
43 * is a fair bit of sequence-dependent code here - ie., code which assumes
44 * that certain things happen before others. In particular, the code which
45 * happens at the boundary between sections is delicately poised, so be
52 /* Set default coding system for KANJI if none specified in Makefile. */
54 * We treat KANJI specially due to historical precedent (it was the
55 * first non-english codepage added to Samba). With the new dynamic
56 * codepage support this is not needed anymore.
58 * The define 'KANJI' is being overloaded to mean 'use kanji codepage
59 * by default' and also 'this is the filename-to-disk conversion
60 * method to use'. This really should be removed and all control
61 * over this left in the smb.conf parameters 'client codepage'
62 * and 'coding system'.
68 BOOL in_client
= False
; /* Not in the client by default */
71 extern int DEBUGLEVEL_CLASS
[DBGC_LAST
];
72 extern pstring user_socket_options
;
73 extern pstring global_myname
;
74 pstring global_scope
= "";
78 #define GLOBAL_NAME "global"
82 #define PRINTERS_NAME "printers"
86 #define HOMES_NAME "homes"
89 /* some helpful bits */
90 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
91 #define VALID(i) ServicePtrs[i]->valid
93 int keepalive
= DEFAULT_KEEPALIVE
;
94 BOOL use_getwd_cache
= True
;
96 extern int extra_time_offset
;
98 static BOOL defaults_saved
= False
;
101 * This structure describes global (ie., server-wide) parameters.
105 char *szPrintcapname
;
106 char *szEnumPortsCommand
;
107 char *szAddPrinterCommand
;
108 char *szDeletePrinterCommand
;
109 char *szOs2DriverMap
;
113 char *szDefaultService
;
117 char *szServerString
;
118 char *szAutoServices
;
119 char *szPasswdProgram
;
124 char *szTDBPasswdFile
;
126 char *szSMBPasswdFile
;
128 char *szPasswordServer
;
129 char *szSocketOptions
;
132 char *szDomainAdminGroup
;
133 char *szDomainGuestGroup
;
134 char *szDomainHostsallow
;
135 char *szDomainHostsdeny
;
137 #ifdef USING_GROUPNAME_MAP
138 char *szGroupnameMap
;
139 #endif /* USING_GROUPNAME_MAP */
140 char *szCharacterSet
;
147 char *szCodingSystem
;
149 char *szRemoteAnnounce
;
150 char *szRemoteBrowseSync
;
151 char *szSocketAddress
;
152 char *szNISHomeMapName
;
153 char *szAnnounceVersion
; /* This is initialised in init_globals */
154 char *szNetbiosAliases
;
155 char *szDomainOtherSIDs
;
156 char *szNameResolveOrder
;
158 char *szAddUserScript
;
159 char *szDelUserScript
;
169 char *szTemplateHomedir
;
170 char *szTemplateShell
;
171 char *szWinbindSeparator
;
172 BOOL bWinbindEnumUsers
;
173 BOOL bWinbindEnumGroups
;
174 BOOL bWinbindUseDefaultDomain
;
175 char *szAddShareCommand
;
176 char *szChangeShareCommand
;
177 char *szDeleteShareCommand
;
178 char *szManglingMethod
;
193 int iMaxSmbdProcesses
;
194 BOOL bDisableSpoolss
;
198 int enhanced_browsing
;
205 int client_code_page
;
206 int announce_as
; /* This is initialised in init_globals */
207 int machine_password_timeout
;
208 int change_notify_timeout
;
211 int min_passwd_length
;
212 int oplock_break_wait_time
;
213 int winbind_cache_time
;
223 #endif /* WITH_LDAP */
227 char *sslHostsRequire
;
228 char *sslHostsResign
;
232 char *sslServerPrivKey
;
234 char *sslClientPrivKey
;
237 char *sslEntropyFile
;
240 BOOL sslReqClientCert
;
241 BOOL sslReqServerCert
;
242 BOOL sslCompatibility
;
243 #endif /* WITH_SSL */
244 BOOL bMsAddPrinterWizard
;
249 BOOL bPreferredMaster
;
252 BOOL bEncryptPasswords
;
256 BOOL bObeyPamRestrictions
;
259 BOOL bLargeReadwrite
;
262 BOOL bReadPrediction
;
269 BOOL bBindInterfacesOnly
;
270 BOOL bPamPasswordChange
;
271 BOOL bUnixPasswdSync
;
272 BOOL bPasswdChatDebug
;
276 BOOL bNTStatusSupport
;
279 BOOL bAllowTrustedDomains
;
280 BOOL bRestrictAnonymous
;
282 BOOL bDebugHiresTimestamp
;
286 BOOL bHideLocalUsers
;
288 BOOL bUnixExtensions
;
289 int name_cache_timeout
;
293 static global Globals
;
298 * This structure describes a single service.
307 char *szGuestaccount
;
308 char *szInvalidUsers
;
316 char *szRootPostExec
;
317 char *szPrintcommand
;
320 char *szLppausecommand
;
321 char *szLpresumecommand
;
322 char *szQueuepausecommand
;
323 char *szQueueresumecommand
;
325 char *szPrinterDriver
;
326 char *szPrinterDriverLocation
;
336 char *szVetoOplockFiles
;
345 char *szVfsObjectFile
;
351 int iCreate_force_mode
;
353 int iSecurity_force_mode
;
356 int iDir_Security_mask
;
357 int iDir_Security_force_mode
;
361 int iOplockContentionLimit
;
366 BOOL bRootpreexecClose
;
369 BOOL bShortCasePreserve
;
373 BOOL bHideUnReadable
;
396 BOOL bStrictAllocate
;
400 BOOL bDeleteReadonly
;
402 BOOL bDeleteVetoFiles
;
405 BOOL bDosFiletimeResolution
;
406 BOOL bFakeDirCreateTimes
;
411 BOOL bUseClientDriver
;
412 BOOL bDefaultDevmode
;
414 BOOL bForceUnknownAclUser
;
420 char dummy
[3]; /* for alignment */
425 /* This is a default service used to prime a services structure */
426 static service sDefault
= {
428 False
, /* not autoloaded */
429 NULL
, /* szService */
431 NULL
, /* szUsername */
432 NULL
, /* szGuestAccount - this is set in init_globals() */
433 NULL
, /* szInvalidUsers */
434 NULL
, /* szValidUsers */
435 NULL
, /* szAdminUsers */
437 NULL
, /* szInclude */
438 NULL
, /* szPreExec */
439 NULL
, /* szPostExec */
440 NULL
, /* szRootPreExec */
441 NULL
, /* szRootPostExec */
442 NULL
, /* szPrintcommand */
443 NULL
, /* szLpqcommand */
444 NULL
, /* szLprmcommand */
445 NULL
, /* szLppausecommand */
446 NULL
, /* szLpresumecommand */
447 NULL
, /* szQueuepausecommand */
448 NULL
, /* szQueueresumecommand */
449 NULL
, /* szPrintername */
450 NULL
, /* szPrinterDriver - this is set in init_globals() */
451 NULL
, /* szPrinterDriverLocation */
452 NULL
, /* szDriverFile */
453 NULL
, /* szDontdescend */
454 NULL
, /* szHostsallow */
455 NULL
, /* szHostsdeny */
456 NULL
, /* szMagicScript */
457 NULL
, /* szMagicOutput */
458 NULL
, /* szMangledMap */
459 NULL
, /* szVetoFiles */
460 NULL
, /* szHideFiles */
461 NULL
, /* szVetoOplockFiles */
463 NULL
, /* force user */
464 NULL
, /* force group */
466 NULL
, /* writelist */
467 NULL
, /* printer admin */
470 NULL
, /* vfs object */
471 NULL
, /* vfs options */
472 0, /* iMinPrintSpace */
473 1000, /* iMaxPrintJobs */
474 0, /* iWriteCacheSize */
475 0744, /* iCreate_mask */
476 0000, /* iCreate_force_mode */
477 0777, /* iSecurity_mask */
478 0, /* iSecurity_force_mode */
479 0755, /* iDir_mask */
480 0000, /* iDir_force_mode */
481 0777, /* iDir_Security_mask */
482 0, /* iDir_Security_force_mode */
483 0, /* iMaxConnections */
484 CASE_LOWER
, /* iDefaultCase */
485 DEFAULT_PRINTING
, /* iPrinting */
486 2, /* iOplockContentionLimit */
488 1024, /* iBlock_size */
489 False
, /* bAlternatePerm */
490 False
, /* bPreexecClose */
491 False
, /* bRootpreexecClose */
492 False
, /* case sensitive */
493 True
, /* case preserve */
494 True
, /* short case preserve */
495 False
, /* case mangle */
497 True
, /* bHideDotFiles */
498 False
, /* bHideUnReadable */
499 True
, /* bBrowseable */
500 True
, /* bAvailable */
501 True
, /* bRead_only */
502 True
, /* bNo_set_dir */
503 False
, /* bGuest_only */
504 False
, /* bGuest_ok */
505 False
, /* bPrint_ok */
506 False
, /* bPostscript */
507 False
, /* bMap_system */
508 False
, /* bMap_hidden */
509 True
, /* bMap_archive */
511 False
, /* bStrictLocking */
512 True
, /* bPosixLocking */
513 True
, /* bShareModes */
515 True
, /* bLevel2OpLocks */
516 False
, /* bOnlyUser */
517 True
, /* bMangledNames */
518 True
, /* bWidelinks */
519 True
, /* bSymlinks */
520 False
, /* bSyncAlways */
521 False
, /* bStrictAllocate */
522 False
, /* bStrictSync */
523 '~', /* magic char */
525 False
, /* bDeleteReadonly */
526 False
, /* bFakeOplocks */
527 False
, /* bDeleteVetoFiles */
528 False
, /* bDosFilemode */
529 False
, /* bDosFiletimes */
530 False
, /* bDosFiletimeResolution */
531 False
, /* bFakeDirCreateTimes */
532 True
, /* bBlockingLocks */
533 False
, /* bInheritPerms */
534 False
, /* bInheritACLS */
535 False
, /* bMSDfsRoot */
536 False
, /* bUseClientDriver */
537 False
, /* bDefaultDevmode */
538 True
, /* bNTAclSupport */
539 False
, /* bForceUnknownAclUser */
541 False
, /* bUseSendfile */
543 False
, /* bProfileAcls */
548 /* local variables */
549 static service
**ServicePtrs
= NULL
;
550 static int iNumServices
= 0;
551 static int iServiceIndex
= 0;
552 static BOOL bInGlobalSection
= True
;
553 static BOOL bGlobalOnly
= False
;
554 static int server_role
;
555 static int default_server_announce
;
557 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
559 /* prototypes for the special type handlers */
560 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
);
561 static BOOL
handle_include(char *pszParmValue
, char **ptr
);
562 static BOOL
handle_copy(char *pszParmValue
, char **ptr
);
563 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
);
564 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
);
565 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
);
566 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
);
567 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
);
568 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
);
569 static BOOL
handle_winbind_uid(char *pszParmValue
, char **ptr
);
570 static BOOL
handle_winbind_gid(char *pszParmValue
, char **ptr
);
571 static BOOL
handle_wins_server_list(char *pszParmValue
, char **ptr
);
572 static BOOL
handle_debug_list( char *pszParmValue
, char **ptr
);
574 static void set_server_role(void);
575 static void set_default_server_announce_type(void);
577 static struct enum_list enum_protocol
[] = {
578 {PROTOCOL_NT1
, "NT1"},
579 {PROTOCOL_LANMAN2
, "LANMAN2"},
580 {PROTOCOL_LANMAN1
, "LANMAN1"},
581 {PROTOCOL_CORE
, "CORE"},
582 {PROTOCOL_COREPLUS
, "COREPLUS"},
583 {PROTOCOL_COREPLUS
, "CORE+"},
587 static struct enum_list enum_security
[] = {
588 {SEC_SHARE
, "SHARE"},
590 {SEC_SERVER
, "SERVER"},
591 {SEC_DOMAIN
, "DOMAIN"},
595 static struct enum_list enum_printing
[] = {
596 {PRINT_SYSV
, "sysv"},
598 {PRINT_HPUX
, "hpux"},
602 {PRINT_LPRNG
, "lprng"},
603 {PRINT_SOFTQ
, "softq"},
604 {PRINT_CUPS
, "cups"},
606 {PRINT_LPROS2
, "os2"},
608 {PRINT_TEST
, "test"},
610 #endif /* DEVELOPER */
615 static struct enum_list enum_ldap_ssl
[] = {
616 {LDAP_SSL_ON
, "Yes"},
617 {LDAP_SSL_ON
, "yes"},
620 {LDAP_SSL_OFF
, "no"},
621 {LDAP_SSL_OFF
, "No"},
622 {LDAP_SSL_OFF
, "off"},
623 {LDAP_SSL_OFF
, "Off"},
624 {LDAP_SSL_START_TLS
, "start tls"},
625 {LDAP_SSL_START_TLS
, "start_tls"},
630 /* Types of machine we can announce as. */
631 #define ANNOUNCE_AS_NT_SERVER 1
632 #define ANNOUNCE_AS_WIN95 2
633 #define ANNOUNCE_AS_WFW 3
634 #define ANNOUNCE_AS_NT_WORKSTATION 4
636 static struct enum_list enum_announce_as
[] = {
637 {ANNOUNCE_AS_NT_SERVER
, "NT"},
638 {ANNOUNCE_AS_NT_SERVER
, "NT Server"},
639 {ANNOUNCE_AS_NT_WORKSTATION
, "NT Workstation"},
640 {ANNOUNCE_AS_WIN95
, "win95"},
641 {ANNOUNCE_AS_WFW
, "WfW"},
645 static struct enum_list enum_case
[] = {
646 {CASE_LOWER
, "lower"},
647 {CASE_UPPER
, "upper"},
651 static struct enum_list enum_bool_auto
[] = {
662 /* Client-side offline caching policy types */
663 #define CSC_POLICY_MANUAL 0
664 #define CSC_POLICY_DOCUMENTS 1
665 #define CSC_POLICY_PROGRAMS 2
666 #define CSC_POLICY_DISABLE 3
668 static struct enum_list enum_csc_policy
[] = {
669 {CSC_POLICY_MANUAL
, "manual"},
670 {CSC_POLICY_DOCUMENTS
, "documents"},
671 {CSC_POLICY_PROGRAMS
, "programs"},
672 {CSC_POLICY_DISABLE
, "disable"},
677 Do you want session setups at user level security with a invalid
678 password to be rejected or allowed in as guest? WinNT rejects them
679 but it can be a pain as it means "net view" needs to use a password
681 You have 3 choices in the setting of map_to_guest:
683 "Never" means session setups with an invalid password
684 are rejected. This is the default.
686 "Bad User" means session setups with an invalid password
687 are rejected, unless the username does not exist, in which case it
688 is treated as a guest login
690 "Bad Password" means session setups with an invalid password
691 are treated as a guest login
693 Note that map_to_guest only has an effect in user or server
697 static struct enum_list enum_map_to_guest
[] = {
698 {NEVER_MAP_TO_GUEST
, "Never"},
699 {MAP_TO_GUEST_ON_BAD_USER
, "Bad User"},
700 {MAP_TO_GUEST_ON_BAD_PASSWORD
, "Bad Password"},
705 static struct enum_list enum_ssl_version
[] = {
706 {SMB_SSL_V2
, "ssl2"},
707 {SMB_SSL_V3
, "ssl3"},
708 {SMB_SSL_V23
, "ssl2or3"},
709 {SMB_SSL_TLS1
, "tls1"},
714 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
715 static struct parm_struct parm_table
[] = {
716 {"Base Options", P_SEP
, P_SEPARATOR
},
718 {"coding system", P_STRING
, P_GLOBAL
, &Globals
.szCodingSystem
, handle_coding_system
, NULL
, 0},
719 {"client code page", P_INTEGER
, P_GLOBAL
, &Globals
.client_code_page
, handle_client_code_page
, NULL
, 0},
720 {"code page directory", P_STRING
, P_GLOBAL
, &Globals
.szCodePageDir
, NULL
, NULL
, 0},
721 {"comment", P_STRING
, P_LOCAL
, &sDefault
.comment
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
722 {"path", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
723 {"directory", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_DOS_STRING
},
724 {"workgroup", P_USTRING
, P_GLOBAL
, &Globals
.szWorkGroup
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
| FLAG_WIZARD
},
725 {"netbios name", P_UGSTRING
, P_GLOBAL
, global_myname
, handle_netbios_name
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
| FLAG_WIZARD
},
726 {"netbios aliases", P_STRING
, P_GLOBAL
, &Globals
.szNetbiosAliases
, NULL
, NULL
, FLAG_DOS_STRING
},
727 {"netbios scope", P_UGSTRING
, P_GLOBAL
, global_scope
, NULL
, NULL
, FLAG_DOS_STRING
},
728 {"server string", P_STRING
, P_GLOBAL
, &Globals
.szServerString
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
729 {"interfaces", P_STRING
, P_GLOBAL
, &Globals
.szInterfaces
, NULL
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
730 {"bind interfaces only", P_BOOL
, P_GLOBAL
, &Globals
.bBindInterfacesOnly
, NULL
, NULL
, FLAG_WIZARD
},
732 {"Security Options", P_SEP
, P_SEPARATOR
},
734 {"security", P_ENUM
, P_GLOBAL
, &Globals
.security
, NULL
, enum_security
, FLAG_BASIC
| FLAG_WIZARD
},
735 {"encrypt passwords", P_BOOL
, P_GLOBAL
, &Globals
.bEncryptPasswords
, NULL
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
736 {"update encrypted", P_BOOL
, P_GLOBAL
, &Globals
.bUpdateEncrypt
, NULL
, NULL
, FLAG_BASIC
},
737 {"allow trusted domains", P_BOOL
, P_GLOBAL
, &Globals
.bAllowTrustedDomains
, NULL
, NULL
, 0},
738 {"alternate permissions", P_BOOL
, P_LOCAL
, &sDefault
.bAlternatePerm
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_DEPRECATED
},
739 {"hosts equiv", P_STRING
, P_GLOBAL
, &Globals
.szHostsEquiv
, NULL
, NULL
, 0},
740 {"min passwd length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
741 {"min password length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
742 {"map to guest", P_ENUM
, P_GLOBAL
, &Globals
.map_to_guest
, NULL
, enum_map_to_guest
, 0},
743 {"null passwords", P_BOOL
, P_GLOBAL
, &Globals
.bNullPasswords
, NULL
, NULL
, 0},
744 {"obey pam restrictions", P_BOOL
, P_GLOBAL
, &Globals
.bObeyPamRestrictions
, NULL
, NULL
, 0},
745 {"password server", P_STRING
, P_GLOBAL
, &Globals
.szPasswordServer
, NULL
, NULL
, FLAG_WIZARD
},
747 {"tdb passwd file", P_STRING
, P_GLOBAL
, &Globals
.szTDBPasswdFile
, NULL
, NULL
, 0},
749 {"smb passwd file", P_STRING
, P_GLOBAL
, &Globals
.szSMBPasswdFile
, NULL
, NULL
, 0},
751 {"root directory", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
752 {"root dir", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
753 {"root", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
755 {"pam password change", P_BOOL
, P_GLOBAL
, &Globals
.bPamPasswordChange
, NULL
, NULL
, 0},
756 {"passwd program", P_STRING
, P_GLOBAL
, &Globals
.szPasswdProgram
, NULL
, NULL
, 0},
757 {"passwd chat", P_STRING
, P_GLOBAL
, &Globals
.szPasswdChat
, NULL
, NULL
, 0},
758 {"passwd chat debug", P_BOOL
, P_GLOBAL
, &Globals
.bPasswdChatDebug
, NULL
, NULL
, 0},
759 {"username map", P_STRING
, P_GLOBAL
, &Globals
.szUsernameMap
, NULL
, NULL
, 0},
760 {"password level", P_INTEGER
, P_GLOBAL
, &Globals
.pwordlevel
, NULL
, NULL
, 0},
761 {"username level", P_INTEGER
, P_GLOBAL
, &Globals
.unamelevel
, NULL
, NULL
, 0},
762 {"unix password sync", P_BOOL
, P_GLOBAL
, &Globals
.bUnixPasswdSync
, NULL
, NULL
, 0},
763 {"restrict anonymous", P_BOOL
, P_GLOBAL
, &Globals
.bRestrictAnonymous
, NULL
, NULL
, 0},
764 {"lanman auth", P_BOOL
, P_GLOBAL
, &Globals
.bLanmanAuth
, NULL
, NULL
, 0},
765 {"use rhosts", P_BOOL
, P_GLOBAL
, &Globals
.bUseRhosts
, NULL
, NULL
, 0},
767 {"username", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
768 {"user", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
769 {"users", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
771 {"guest account", P_STRING
, P_LOCAL
, &sDefault
.szGuestaccount
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_GLOBAL
},
772 {"invalid users", P_STRING
, P_LOCAL
, &sDefault
.szInvalidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
773 {"valid users", P_STRING
, P_LOCAL
, &sDefault
.szValidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
774 {"admin users", P_STRING
, P_LOCAL
, &sDefault
.szAdminUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
775 {"read list", P_STRING
, P_LOCAL
, &sDefault
.readlist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
776 {"write list", P_STRING
, P_LOCAL
, &sDefault
.writelist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
777 {"printer admin", P_STRING
, P_LOCAL
, &sDefault
.printer_admin
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_PRINT
},
778 {"force user", P_STRING
, P_LOCAL
, &sDefault
.force_user
, NULL
, NULL
, FLAG_SHARE
},
779 {"force group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, FLAG_SHARE
},
780 {"group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, 0},
782 {"read only", P_BOOL
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
},
783 {"write ok", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
784 {"writeable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
785 {"writable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
787 {"create mask", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
788 {"create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
},
789 {"force create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
790 {"security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
791 {"force security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
792 {"directory mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
793 {"directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
},
794 {"force directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
795 {"directory security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
796 {"force directory security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
797 {"force unknown acl user", P_OCTAL
, P_LOCAL
, &sDefault
.bForceUnknownAclUser
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
798 {"inherit permissions", P_BOOL
, P_LOCAL
, &sDefault
.bInheritPerms
, NULL
, NULL
, FLAG_SHARE
},
799 {"inherit acls", P_BOOL
, P_LOCAL
, &sDefault
.bInheritACLS
, NULL
, NULL
, FLAG_SHARE
},
800 {"guest only", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, FLAG_SHARE
},
801 {"only guest", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, 0},
803 {"guest ok", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
804 {"public", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, 0},
806 {"only user", P_BOOL
, P_LOCAL
, &sDefault
.bOnlyUser
, NULL
, NULL
, FLAG_SHARE
},
807 {"hosts allow", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
808 {"allow hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, 0},
809 {"hosts deny", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
810 {"deny hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, 0},
813 {"Secure Socket Layer Options", P_SEP
, P_SEPARATOR
},
814 {"ssl", P_BOOL
, P_GLOBAL
, &Globals
.sslEnabled
, NULL
, NULL
, 0},
816 {"ssl hosts", P_STRING
, P_GLOBAL
, &Globals
.sslHostsRequire
, NULL
, NULL
, 0},
817 {"ssl hosts resign", P_STRING
, P_GLOBAL
, &Globals
.sslHostsResign
, NULL
, NULL
, 0},
818 {"ssl CA certDir", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertDir
, NULL
, NULL
, 0},
819 {"ssl CA certFile", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertFile
, NULL
, NULL
, 0},
820 {"ssl server cert", P_STRING
, P_GLOBAL
, &Globals
.sslServerCert
, NULL
, NULL
, 0},
821 {"ssl server key", P_STRING
, P_GLOBAL
, &Globals
.sslServerPrivKey
, NULL
, NULL
, 0},
822 {"ssl client cert", P_STRING
, P_GLOBAL
, &Globals
.sslClientCert
, NULL
, NULL
, 0},
823 {"ssl client key", P_STRING
, P_GLOBAL
, &Globals
.sslClientPrivKey
, NULL
, NULL
, 0},
824 {"ssl egd socket", P_STRING
, P_GLOBAL
, &Globals
.sslEgdSocket
, NULL
, NULL
, 0},
825 {"ssl entropy file", P_STRING
, P_GLOBAL
, &Globals
.sslEntropyFile
, NULL
, NULL
, 0},
826 {"ssl entropy bytes", P_INTEGER
, P_GLOBAL
, &Globals
.sslEntropyBytes
, NULL
, NULL
, 0},
827 {"ssl require clientcert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqClientCert
, NULL
, NULL
, 0},
828 {"ssl require servercert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqServerCert
, NULL
, NULL
, 0},
829 {"ssl ciphers", P_STRING
, P_GLOBAL
, &Globals
.sslCiphers
, NULL
, NULL
, 0},
830 {"ssl version", P_ENUM
, P_GLOBAL
, &Globals
.sslVersion
, NULL
, enum_ssl_version
, 0},
831 {"ssl compatibility", P_BOOL
, P_GLOBAL
, &Globals
.sslCompatibility
, NULL
, NULL
, 0},
832 #endif /* WITH_SSL */
834 {"Logging Options", P_SEP
, P_SEPARATOR
},
836 {"admin log", P_BOOL
, P_GLOBAL
, &Globals
.bAdminLog
, NULL
, NULL
, 0},
837 {"log level", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL_CLASS
[DBGC_ALL
], handle_debug_list
, NULL
, 0},
838 {"debuglevel", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL_CLASS
[DBGC_ALL
], handle_debug_list
, NULL
, 0},
839 {"syslog", P_INTEGER
, P_GLOBAL
, &Globals
.syslog
, NULL
, NULL
, 0},
840 {"syslog only", P_BOOL
, P_GLOBAL
, &Globals
.bSyslogOnly
, NULL
, NULL
, 0},
841 {"log file", P_STRING
, P_GLOBAL
, &Globals
.szLogFile
, NULL
, NULL
, 0},
843 {"max log size", P_INTEGER
, P_GLOBAL
, &Globals
.max_log_size
, NULL
, NULL
, 0},
844 {"timestamp logs", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
845 {"debug timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
846 {"debug hires timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bDebugHiresTimestamp
, NULL
, NULL
, 0},
847 {"debug pid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugPid
, NULL
, NULL
, 0},
848 {"debug uid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugUid
, NULL
, NULL
, 0},
850 {"status", P_BOOL
, P_LOCAL
, &sDefault
.status
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DEPRECATED
},
852 {"Protocol Options", P_SEP
, P_SEPARATOR
},
854 {"protocol", P_ENUM
, P_GLOBAL
, &Globals
.maxprotocol
, NULL
, enum_protocol
, 0},
855 {"large readwrite", P_BOOL
, P_GLOBAL
, &Globals
.bLargeReadwrite
, NULL
, NULL
, 0},
856 {"max protocol", P_ENUM
, P_GLOBAL
, &Globals
.maxprotocol
, NULL
, enum_protocol
, 0},
857 {"min protocol", P_ENUM
, P_GLOBAL
, &Globals
.minprotocol
, NULL
, enum_protocol
, 0},
858 {"read bmpx", P_BOOL
, P_GLOBAL
, &Globals
.bReadbmpx
, NULL
, NULL
, 0},
859 {"read raw", P_BOOL
, P_GLOBAL
, &Globals
.bReadRaw
, NULL
, NULL
, 0},
860 {"write raw", P_BOOL
, P_GLOBAL
, &Globals
.bWriteRaw
, NULL
, NULL
, 0},
862 {"nt smb support", P_BOOL
, P_GLOBAL
, &Globals
.bNTSmbSupport
, NULL
, NULL
, 0},
863 {"nt pipe support", P_BOOL
, P_GLOBAL
, &Globals
.bNTPipeSupport
, NULL
, NULL
, 0},
864 {"nt acl support", P_BOOL
, P_LOCAL
, &sDefault
.bNTAclSupport
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
865 {"nt status support", P_BOOL
, P_GLOBAL
, &Globals
.bNTStatusSupport
, NULL
, NULL
, 0 },
866 {"profile acls", P_BOOL
, P_LOCAL
, &sDefault
.bProfileAcls
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
867 {"announce version", P_STRING
, P_GLOBAL
, &Globals
.szAnnounceVersion
, NULL
, NULL
, 0},
868 {"announce as", P_ENUM
, P_GLOBAL
, &Globals
.announce_as
, NULL
, enum_announce_as
, 0},
869 {"max mux", P_INTEGER
, P_GLOBAL
, &Globals
.max_mux
, NULL
, NULL
, 0},
870 {"max xmit", P_INTEGER
, P_GLOBAL
, &Globals
.max_xmit
, NULL
, NULL
, 0},
872 {"name resolve order", P_STRING
, P_GLOBAL
, &Globals
.szNameResolveOrder
, NULL
, NULL
, 0},
873 {"max packet", P_INTEGER
, P_GLOBAL
, &Globals
.max_packet
, NULL
, NULL
, 0},
874 {"packet size", P_INTEGER
, P_GLOBAL
, &Globals
.max_packet
, NULL
, NULL
, 0},
875 {"max ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_ttl
, NULL
, NULL
, 0},
876 {"max wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_wins_ttl
, NULL
, NULL
, 0},
877 {"min wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.min_wins_ttl
, NULL
, NULL
, 0},
878 {"time server", P_BOOL
, P_GLOBAL
, &Globals
.bTimeServer
, NULL
, NULL
, 0},
879 {"unix extensions", P_BOOL
, P_GLOBAL
, &Globals
.bUnixExtensions
, NULL
, NULL
, 0},
881 {"Tuning Options", P_SEP
, P_SEPARATOR
},
883 {"block size", P_INTEGER
, P_LOCAL
, &sDefault
.iBlock_size
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
884 {"change notify timeout", P_INTEGER
, P_GLOBAL
, &Globals
.change_notify_timeout
, NULL
, NULL
, 0},
885 {"deadtime", P_INTEGER
, P_GLOBAL
, &Globals
.deadtime
, NULL
, NULL
, 0},
886 {"getwd cache", P_BOOL
, P_GLOBAL
, &use_getwd_cache
, NULL
, NULL
, 0},
887 {"keepalive", P_INTEGER
, P_GLOBAL
, &keepalive
, NULL
, NULL
, 0},
889 {"lpq cache time", P_INTEGER
, P_GLOBAL
, &Globals
.lpqcachetime
, NULL
, NULL
, 0},
890 {"max smbd processes", P_INTEGER
, P_GLOBAL
, &Globals
.iMaxSmbdProcesses
, NULL
, NULL
, 0},
891 {"max connections", P_INTEGER
, P_LOCAL
, &sDefault
.iMaxConnections
, NULL
, NULL
, FLAG_SHARE
},
892 {"max disk size", P_INTEGER
, P_GLOBAL
, &Globals
.maxdisksize
, NULL
, NULL
, 0},
893 {"max open files", P_INTEGER
, P_GLOBAL
, &Globals
.max_open_files
, NULL
, NULL
, 0},
894 {"min print space", P_INTEGER
, P_LOCAL
, &sDefault
.iMinPrintSpace
, NULL
, NULL
, FLAG_PRINT
},
895 {"name cache timeout", P_INTEGER
, P_GLOBAL
, &Globals
.name_cache_timeout
, NULL
, NULL
, 0},
896 {"read size", P_INTEGER
, P_GLOBAL
, &Globals
.ReadSize
, NULL
, NULL
, 0},
898 {"socket options", P_GSTRING
, P_GLOBAL
, user_socket_options
, NULL
, NULL
, 0},
899 {"stat cache size", P_INTEGER
, P_GLOBAL
, &Globals
.stat_cache_size
, NULL
, NULL
, 0},
900 {"strict allocate", P_BOOL
, P_LOCAL
, &sDefault
.bStrictAllocate
, NULL
, NULL
, FLAG_SHARE
},
901 {"strict sync", P_BOOL
, P_LOCAL
, &sDefault
.bStrictSync
, NULL
, NULL
, FLAG_SHARE
},
902 {"sync always", P_BOOL
, P_LOCAL
, &sDefault
.bSyncAlways
, NULL
, NULL
, FLAG_SHARE
},
903 {"use mmap", P_BOOL
, P_GLOBAL
, &Globals
.bUseMmap
, NULL
, NULL
, 0},
905 {"use sendfile", P_BOOL
, P_LOCAL
, &sDefault
.bUseSendfile
, NULL
, NULL
, FLAG_SHARE
},
907 {"write cache size", P_INTEGER
, P_LOCAL
, &sDefault
.iWriteCacheSize
, NULL
, NULL
, FLAG_SHARE
},
909 {"Printing Options", P_SEP
, P_SEPARATOR
},
911 {"total print jobs", P_INTEGER
, P_GLOBAL
, &Globals
.iTotalPrintJobs
, NULL
, NULL
, FLAG_PRINT
},
912 {"max print jobs", P_INTEGER
, P_LOCAL
, &sDefault
.iMaxPrintJobs
, NULL
, NULL
, FLAG_PRINT
},
913 {"load printers", P_BOOL
, P_GLOBAL
, &Globals
.bLoadPrinters
, NULL
, NULL
, FLAG_PRINT
},
914 {"printcap name", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, FLAG_PRINT
},
915 {"printcap", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, 0},
916 {"printable", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, FLAG_PRINT
},
917 {"print ok", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, 0},
918 {"postscript", P_BOOL
, P_LOCAL
, &sDefault
.bPostscript
, NULL
, NULL
, FLAG_PRINT
| FLAG_DEPRECATED
},
919 {"printing", P_ENUM
, P_LOCAL
, &sDefault
.iPrinting
, NULL
, enum_printing
, FLAG_PRINT
| FLAG_GLOBAL
},
920 {"print command", P_STRING
, P_LOCAL
, &sDefault
.szPrintcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
921 {"disable spoolss", P_BOOL
, P_GLOBAL
, &Globals
.bDisableSpoolss
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
922 {"lpq command", P_STRING
, P_LOCAL
, &sDefault
.szLpqcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
923 {"lprm command", P_STRING
, P_LOCAL
, &sDefault
.szLprmcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
924 {"lppause command", P_STRING
, P_LOCAL
, &sDefault
.szLppausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
925 {"lpresume command", P_STRING
, P_LOCAL
, &sDefault
.szLpresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
926 {"queuepause command", P_STRING
, P_LOCAL
, &sDefault
.szQueuepausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
927 {"queueresume command", P_STRING
, P_LOCAL
, &sDefault
.szQueueresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
929 {"enumports command", P_STRING
, P_GLOBAL
, &Globals
.szEnumPortsCommand
, NULL
, NULL
, 0},
930 {"addprinter command", P_STRING
, P_GLOBAL
, &Globals
.szAddPrinterCommand
, NULL
, NULL
, 0},
931 {"deleteprinter command", P_STRING
, P_GLOBAL
, &Globals
.szDeletePrinterCommand
, NULL
, NULL
, 0},
932 {"show add printer wizard", P_BOOL
, P_GLOBAL
, &Globals
.bMsAddPrinterWizard
, NULL
, NULL
, 0},
933 {"os2 driver map", P_STRING
, P_GLOBAL
, &Globals
.szOs2DriverMap
, NULL
, NULL
, 0},
935 {"printer name", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, FLAG_PRINT
|FLAG_DOS_STRING
},
936 {"printer", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, FLAG_DOS_STRING
},
937 {"use client driver", P_BOOL
, P_LOCAL
, &sDefault
.bUseClientDriver
, NULL
, NULL
, FLAG_PRINT
},
938 {"default devmode", P_BOOL
, P_LOCAL
, &sDefault
.bDefaultDevmode
, NULL
, NULL
, FLAG_PRINT
},
939 {"printer driver", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriver
, NULL
, NULL
, FLAG_PRINT
| FLAG_DEPRECATED
},
940 {"printer driver file", P_STRING
, P_LOCAL
, &sDefault
.szDriverFile
, NULL
, NULL
, FLAG_PRINT
| FLAG_DEPRECATED
},
941 {"printer driver location", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriverLocation
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
| FLAG_DEPRECATED
},
943 {"Filename Handling", P_SEP
, P_SEPARATOR
},
944 {"strip dot", P_BOOL
, P_GLOBAL
, &Globals
.bStripDot
, NULL
, NULL
, FLAG_DEPRECATED
},
945 {"mangling method", P_STRING
, P_GLOBAL
, &Globals
.szManglingMethod
, NULL
, NULL
, 0},
947 {"character set", P_STRING
, P_GLOBAL
, &Globals
.szCharacterSet
, handle_character_set
, NULL
, 0},
948 {"mangled stack", P_INTEGER
, P_GLOBAL
, &Globals
.mangled_stack
, NULL
, NULL
, 0},
949 {"default case", P_ENUM
, P_LOCAL
, &sDefault
.iDefaultCase
, NULL
, enum_case
, FLAG_SHARE
},
950 {"case sensitive", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
951 {"casesignames", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, 0},
952 {"preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
953 {"short preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bShortCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
954 {"mangle case", P_BOOL
, P_LOCAL
, &sDefault
.bCaseMangle
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
955 {"mangling char", P_CHAR
, P_LOCAL
, &sDefault
.magic_char
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
956 {"hide dot files", P_BOOL
, P_LOCAL
, &sDefault
.bHideDotFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
957 {"hide unreadable", P_BOOL
, P_LOCAL
, &sDefault
.bHideUnReadable
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
958 {"delete veto files", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
959 {"veto files", P_STRING
, P_LOCAL
, &sDefault
.szVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
960 {"hide files", P_STRING
, P_LOCAL
, &sDefault
.szHideFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
961 {"veto oplock files", P_STRING
, P_LOCAL
, &sDefault
.szVetoOplockFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
962 {"map system", P_BOOL
, P_LOCAL
, &sDefault
.bMap_system
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
963 {"map hidden", P_BOOL
, P_LOCAL
, &sDefault
.bMap_hidden
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
964 {"map archive", P_BOOL
, P_LOCAL
, &sDefault
.bMap_archive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
965 {"mangled names", P_BOOL
, P_LOCAL
, &sDefault
.bMangledNames
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
966 {"mangled map", P_STRING
, P_LOCAL
, &sDefault
.szMangledMap
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
967 {"stat cache", P_BOOL
, P_GLOBAL
, &Globals
.bStatCache
, NULL
, NULL
, 0},
969 {"Domain Options", P_SEP
, P_SEPARATOR
},
971 {"domain admin group", P_STRING
, P_GLOBAL
, &Globals
.szDomainAdminGroup
, NULL
, NULL
, 0},
972 {"domain guest group", P_STRING
, P_GLOBAL
, &Globals
.szDomainGuestGroup
, NULL
, NULL
, 0},
973 #ifdef USING_GROUPNAME_MAP
975 {"groupname map", P_STRING
, P_GLOBAL
, &Globals
.szGroupnameMap
, NULL
, NULL
, 0},
976 #endif /* USING_GROUPNAME_MAP */
978 {"machine password timeout", P_INTEGER
, P_GLOBAL
, &Globals
.machine_password_timeout
, NULL
, NULL
, 0},
980 {"Logon Options", P_SEP
, P_SEPARATOR
},
982 {"add user script", P_STRING
, P_GLOBAL
, &Globals
.szAddUserScript
, NULL
, NULL
, 0},
983 {"delete user script", P_STRING
, P_GLOBAL
, &Globals
.szDelUserScript
, NULL
, NULL
, 0},
984 {"logon script", P_STRING
, P_GLOBAL
, &Globals
.szLogonScript
, NULL
, NULL
, FLAG_DOS_STRING
},
985 {"logon path", P_STRING
, P_GLOBAL
, &Globals
.szLogonPath
, NULL
, NULL
, FLAG_DOS_STRING
},
986 {"logon drive", P_STRING
, P_GLOBAL
, &Globals
.szLogonDrive
, NULL
, NULL
, 0},
987 {"logon home", P_STRING
, P_GLOBAL
, &Globals
.szLogonHome
, NULL
, NULL
, FLAG_DOS_STRING
},
988 {"domain logons", P_BOOL
, P_GLOBAL
, &Globals
.bDomainLogons
, NULL
, NULL
, 0},
990 {"Browse Options", P_SEP
, P_SEPARATOR
},
992 {"os level", P_INTEGER
, P_GLOBAL
, &Globals
.os_level
, NULL
, NULL
, FLAG_BASIC
},
993 {"lm announce", P_ENUM
, P_GLOBAL
, &Globals
.lm_announce
, NULL
, enum_bool_auto
, 0},
994 {"lm interval", P_INTEGER
, P_GLOBAL
, &Globals
.lm_interval
, NULL
, NULL
, 0},
995 {"preferred master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
996 {"prefered master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_HIDE
},
997 {"local master", P_BOOL
, P_GLOBAL
, &Globals
.bLocalMaster
, NULL
, NULL
, FLAG_BASIC
},
998 {"domain master", P_ENUM
, P_GLOBAL
, &Globals
.bDomainMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
999 {"browse list", P_BOOL
, P_GLOBAL
, &Globals
.bBrowseList
, NULL
, NULL
, 0},
1000 {"browseable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
1001 {"browsable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, 0},
1002 {"enhanced browsing", P_BOOL
, P_GLOBAL
, &Globals
.enhanced_browsing
, NULL
, NULL
},
1004 {"WINS Options", P_SEP
, P_SEPARATOR
},
1005 {"dns proxy", P_BOOL
, P_GLOBAL
, &Globals
.bDNSproxy
, NULL
, NULL
, 0},
1006 {"wins proxy", P_BOOL
, P_GLOBAL
, &Globals
.bWINSproxy
, NULL
, NULL
, 0},
1008 {"wins server", P_STRING
, P_GLOBAL
, &Globals
.szWINSserver
, handle_wins_server_list
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
1009 {"wins support", P_BOOL
, P_GLOBAL
, &Globals
.bWINSsupport
, NULL
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
1010 {"wins hook", P_STRING
, P_GLOBAL
, &Globals
.szWINSHook
, NULL
, NULL
, 0},
1012 {"Locking Options", P_SEP
, P_SEPARATOR
},
1014 {"blocking locks", P_BOOL
, P_LOCAL
, &sDefault
.bBlockingLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1015 {"csc policy", P_ENUM
, P_LOCAL
, &sDefault
.iCSCPolicy
, NULL
, enum_csc_policy
, FLAG_SHARE
| FLAG_GLOBAL
},
1016 {"fake oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bFakeOplocks
, NULL
, NULL
, FLAG_SHARE
},
1017 {"kernel oplocks", P_BOOL
, P_GLOBAL
, &Globals
.bKernelOplocks
, NULL
, NULL
, FLAG_GLOBAL
},
1018 {"locking", P_BOOL
, P_LOCAL
, &sDefault
.bLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1019 {"lock spin count", P_INTEGER
, P_GLOBAL
, &Globals
.iLockSpinCount
, NULL
, NULL
, FLAG_GLOBAL
},
1020 {"lock spin time", P_INTEGER
, P_GLOBAL
, &Globals
.iLockSpinTime
, NULL
, NULL
, FLAG_GLOBAL
},
1022 {"oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bOpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1023 {"level2 oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bLevel2OpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1024 {"oplock break wait time", P_INTEGER
, P_GLOBAL
, &Globals
.oplock_break_wait_time
, NULL
, NULL
, FLAG_GLOBAL
},
1025 {"oplock contention limit", P_INTEGER
, P_LOCAL
, &sDefault
.iOplockContentionLimit
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1026 {"posix locking", P_BOOL
, P_LOCAL
, &sDefault
.bPosixLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1027 {"strict locking", P_BOOL
, P_LOCAL
, &sDefault
.bStrictLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1028 {"share modes", P_BOOL
, P_LOCAL
, &sDefault
.bShareModes
, NULL
, NULL
, FLAG_SHARE
|FLAG_GLOBAL
},
1030 #ifdef WITH_LDAP_SAM
1031 {"Ldap Options", P_SEP
, P_SEPARATOR
},
1033 {"ldap server", P_STRING
, P_GLOBAL
, &Globals
.szLdapServer
, NULL
, NULL
, 0},
1034 {"ldap port", P_INTEGER
, P_GLOBAL
, &Globals
.ldap_port
, NULL
, NULL
, 0},
1035 {"ldap suffix", P_STRING
, P_GLOBAL
, &Globals
.szLdapSuffix
, NULL
, NULL
, 0},
1036 {"ldap filter", P_STRING
, P_GLOBAL
, &Globals
.szLdapFilter
, NULL
, NULL
, 0},
1037 {"ldap admin dn", P_STRING
, P_GLOBAL
, &Globals
.szLdapAdminDn
, NULL
, NULL
, 0},
1038 {"ldap ssl", P_ENUM
, P_GLOBAL
, &Globals
.ldap_ssl
, NULL
, enum_ldap_ssl
, 0},
1039 #endif /* WITH_LDAP_SAM */
1041 {"Miscellaneous Options", P_SEP
, P_SEPARATOR
},
1042 {"add share command", P_STRING
, P_GLOBAL
, &Globals
.szAddShareCommand
, NULL
, NULL
, 0},
1043 {"change share command", P_STRING
, P_GLOBAL
, &Globals
.szChangeShareCommand
, NULL
, NULL
, 0},
1044 {"delete share command", P_STRING
, P_GLOBAL
, &Globals
.szDeleteShareCommand
, NULL
, NULL
, 0},
1046 {"config file", P_STRING
, P_GLOBAL
, &Globals
.szConfigFile
, NULL
, NULL
, FLAG_HIDE
},
1047 {"preload", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, FLAG_DOS_STRING
},
1048 {"auto services", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, FLAG_DOS_STRING
},
1049 {"lock dir", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
1050 {"lock directory", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
1051 {"pid directory", P_STRING
, P_GLOBAL
, &Globals
.szPidDir
, NULL
, NULL
, 0},
1053 {"utmp directory", P_STRING
, P_GLOBAL
, &Globals
.szUtmpDir
, NULL
, NULL
, 0},
1054 {"wtmp directory", P_STRING
, P_GLOBAL
, &Globals
.szWtmpDir
, NULL
, NULL
, 0},
1055 {"utmp", P_BOOL
, P_GLOBAL
, &Globals
.bUtmp
, NULL
, NULL
, 0},
1058 {"default service", P_STRING
, P_GLOBAL
, &Globals
.szDefaultService
, NULL
, NULL
, FLAG_DOS_STRING
},
1059 {"default", P_STRING
, P_GLOBAL
, &Globals
.szDefaultService
, NULL
, NULL
, FLAG_DOS_STRING
},
1060 {"message command", P_STRING
, P_GLOBAL
, &Globals
.szMsgCommand
, NULL
, NULL
, 0},
1061 {"dfree command", P_STRING
, P_GLOBAL
, &Globals
.szDfree
, NULL
, NULL
, 0},
1062 {"valid chars", P_STRING
, P_GLOBAL
, &Globals
.szValidChars
, handle_valid_chars
, NULL
, 0},
1063 {"remote announce", P_STRING
, P_GLOBAL
, &Globals
.szRemoteAnnounce
, NULL
, NULL
, 0},
1064 {"remote browse sync", P_STRING
, P_GLOBAL
, &Globals
.szRemoteBrowseSync
, NULL
, NULL
, 0},
1065 {"socket address", P_STRING
, P_GLOBAL
, &Globals
.szSocketAddress
, NULL
, NULL
, 0},
1066 {"homedir map", P_STRING
, P_GLOBAL
, &Globals
.szNISHomeMapName
, NULL
, NULL
, 0},
1067 {"time offset", P_INTEGER
, P_GLOBAL
, &extra_time_offset
, NULL
, NULL
, 0},
1068 {"NIS homedir", P_BOOL
, P_GLOBAL
, &Globals
.bNISHomeMap
, NULL
, NULL
, 0},
1069 {"-valid", P_BOOL
, P_LOCAL
, &sDefault
.valid
, NULL
, NULL
, FLAG_HIDE
},
1071 {"copy", P_STRING
, P_LOCAL
, &sDefault
.szCopy
, handle_copy
, NULL
, FLAG_HIDE
},
1072 {"include", P_STRING
, P_LOCAL
, &sDefault
.szInclude
, handle_include
, NULL
, FLAG_HIDE
},
1073 {"exec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1074 {"preexec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, 0},
1076 {"preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bPreexecClose
, NULL
, NULL
, FLAG_SHARE
},
1077 {"postexec", P_STRING
, P_LOCAL
, &sDefault
.szPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1078 {"root preexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1079 {"root preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bRootpreexecClose
, NULL
, NULL
, FLAG_SHARE
},
1080 {"root postexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1081 {"available", P_BOOL
, P_LOCAL
, &sDefault
.bAvailable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
1082 {"volume", P_STRING
, P_LOCAL
, &sDefault
.volume
, NULL
, NULL
, FLAG_SHARE
| FLAG_DOS_STRING
},
1083 {"fstype", P_STRING
, P_LOCAL
, &sDefault
.fstype
, NULL
, NULL
, FLAG_SHARE
},
1084 {"set directory", P_BOOLREV
, P_LOCAL
, &sDefault
.bNo_set_dir
, NULL
, NULL
, FLAG_SHARE
},
1085 {"source environment", P_STRING
, P_GLOBAL
, &Globals
.szSourceEnv
, handle_source_env
, NULL
, 0},
1086 {"wide links", P_BOOL
, P_LOCAL
, &sDefault
.bWidelinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1087 {"follow symlinks", P_BOOL
, P_LOCAL
, &sDefault
.bSymlinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1088 {"dont descend", P_STRING
, P_LOCAL
, &sDefault
.szDontdescend
, NULL
, NULL
, FLAG_SHARE
},
1089 {"magic script", P_STRING
, P_LOCAL
, &sDefault
.szMagicScript
, NULL
, NULL
, FLAG_SHARE
},
1090 {"magic output", P_STRING
, P_LOCAL
, &sDefault
.szMagicOutput
, NULL
, NULL
, FLAG_SHARE
},
1091 {"delete readonly", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteReadonly
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1092 {"dos filemode", P_BOOL
, P_LOCAL
, &sDefault
.bDosFilemode
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1093 {"dos filetimes", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1094 {"dos filetime resolution", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimeResolution
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1096 {"fake directory create times", P_BOOL
, P_LOCAL
, &sDefault
.bFakeDirCreateTimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1097 {"panic action", P_STRING
, P_GLOBAL
, &Globals
.szPanicAction
, NULL
, NULL
, 0},
1098 {"hide local users", P_BOOL
, P_GLOBAL
, &Globals
.bHideLocalUsers
, NULL
,
1101 {"VFS module options", P_SEP
, P_SEPARATOR
},
1103 {"vfs object", P_STRING
, P_LOCAL
, &sDefault
.szVfsObjectFile
, handle_vfs_object
, NULL
, FLAG_SHARE
},
1104 {"vfs options", P_STRING
, P_LOCAL
, &sDefault
.szVfsOptions
, NULL
, NULL
, FLAG_SHARE
},
1107 {"MSDfs options", P_SEP
, P_SEPARATOR
},
1109 {"msdfs root", P_BOOL
, P_LOCAL
, &sDefault
.bMSDfsRoot
, NULL
, NULL
, FLAG_SHARE
},
1110 {"host msdfs", P_BOOL
, P_GLOBAL
, &Globals
.bHostMSDfs
, NULL
, NULL
, 0},
1113 {"Winbind options", P_SEP
, P_SEPARATOR
},
1115 {"winbind uid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindUID
, handle_winbind_uid
, NULL
, 0},
1116 {"winbind gid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindGID
, handle_winbind_gid
, NULL
, 0},
1117 {"template homedir", P_STRING
, P_GLOBAL
, &Globals
.szTemplateHomedir
, NULL
, NULL
, 0},
1118 {"template shell", P_STRING
, P_GLOBAL
, &Globals
.szTemplateShell
, NULL
, NULL
, 0},
1119 {"winbind separator", P_STRING
, P_GLOBAL
, &Globals
.szWinbindSeparator
, NULL
, NULL
, 0},
1120 {"winbind cache time", P_INTEGER
, P_GLOBAL
, &Globals
.winbind_cache_time
, NULL
, NULL
, 0},
1121 {"winbind enum users", P_BOOL
, P_GLOBAL
, &Globals
.bWinbindEnumUsers
, NULL
, NULL
, 0},
1122 {"winbind enum groups", P_BOOL
, P_GLOBAL
, &Globals
.bWinbindEnumGroups
, NULL
, NULL
, 0},
1123 {"winbind use default domain", P_BOOL
, P_GLOBAL
, &Globals
.bWinbindUseDefaultDomain
, NULL
, NULL
, 0},
1125 {NULL
, P_BOOL
, P_NONE
, NULL
, NULL
, NULL
, 0}
1129 /***************************************************************************
1130 Initialise the sDefault parameter structure for the printer values.
1131 ***************************************************************************/
1132 static void init_printer_values(void)
1134 string_set(&sDefault
.szPrinterDriver
, "");
1135 string_set(&sDefault
.szDriverFile
, DRIVERFILE
);
1137 /* choose defaults depending on the type of printing */
1138 switch (sDefault
.iPrinting
)
1144 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1145 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1146 string_set(&sDefault
.szPrintcommand
,
1152 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1153 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1154 string_set(&sDefault
.szPrintcommand
,
1156 string_set(&sDefault
.szQueuepausecommand
,
1158 string_set(&sDefault
.szQueueresumecommand
,
1160 string_set(&sDefault
.szLppausecommand
,
1162 string_set(&sDefault
.szLpresumecommand
,
1163 "lpc release %p %j");
1168 string_set(&sDefault
.szLpqcommand
, "");
1169 string_set(&sDefault
.szLprmcommand
, "");
1170 string_set(&sDefault
.szPrintcommand
, "");
1171 string_set(&sDefault
.szLppausecommand
, "");
1172 string_set(&sDefault
.szLpresumecommand
, "");
1173 string_set(&sDefault
.szQueuepausecommand
, "");
1174 string_set(&sDefault
.szQueueresumecommand
, "");
1176 string_set(&Globals
.szPrintcapname
, "cups");
1178 string_set(&sDefault
.szLpqcommand
,
1179 "/usr/bin/lpstat -o %p");
1180 string_set(&sDefault
.szLprmcommand
,
1181 "/usr/bin/cancel %p-%j");
1182 string_set(&sDefault
.szPrintcommand
,
1183 "/usr/bin/lp -d %p %s; rm %s");
1184 string_set(&sDefault
.szLppausecommand
,
1185 "lp -i %p-%j -H hold");
1186 string_set(&sDefault
.szLpresumecommand
,
1187 "lp -i %p-%j -H resume");
1188 string_set(&sDefault
.szQueuepausecommand
,
1189 "/usr/bin/disable %p");
1190 string_set(&sDefault
.szQueueresumecommand
,
1191 "/usr/bin/enable %p");
1192 string_set(&Globals
.szPrintcapname
, "lpstat");
1193 #endif /* HAVE_CUPS */
1198 string_set(&sDefault
.szLpqcommand
, "lpstat -o%p");
1199 string_set(&sDefault
.szLprmcommand
, "cancel %p-%j");
1200 string_set(&sDefault
.szPrintcommand
,
1201 "lp -c -d%p %s; rm %s");
1202 string_set(&sDefault
.szQueuepausecommand
,
1204 string_set(&sDefault
.szQueueresumecommand
,
1207 string_set(&sDefault
.szLppausecommand
,
1208 "lp -i %p-%j -H hold");
1209 string_set(&sDefault
.szLpresumecommand
,
1210 "lp -i %p-%j -H resume");
1215 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1216 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1217 string_set(&sDefault
.szPrintcommand
, "lp -r -P%p %s");
1221 string_set(&sDefault
.szLpqcommand
, "qstat -l -d%p");
1222 string_set(&sDefault
.szLprmcommand
,
1223 "qstat -s -j%j -c");
1224 string_set(&sDefault
.szPrintcommand
,
1225 "lp -d%p -s %s; rm %s");
1226 string_set(&sDefault
.szLppausecommand
,
1227 "qstat -s -j%j -h");
1228 string_set(&sDefault
.szLpresumecommand
,
1229 "qstat -s -j%j -r");
1234 string_set(&sDefault
.szPrintcommand
, "vlp print %p %s");
1235 string_set(&sDefault
.szLpqcommand
, "vlp lpq %p");
1236 string_set(&sDefault
.szLprmcommand
, "vlp lprm %p %j");
1237 string_set(&sDefault
.szLppausecommand
, "vlp lppause %p %j");
1238 string_set(&sDefault
.szLpresumecommand
, "vlp lpresum %p %j");
1239 string_set(&sDefault
.szQueuepausecommand
, "vlp queuepause %p");
1240 string_set(&sDefault
.szQueueresumecommand
, "vlp queueresume %p");
1242 #endif /* DEVELOPER */
1247 /***************************************************************************
1248 Initialise the global parameter structure.
1249 ***************************************************************************/
1250 static void init_globals(void)
1252 static BOOL done_init
= False
;
1258 memset((void *)&Globals
, '\0', sizeof(Globals
));
1260 for (i
= 0; parm_table
[i
].label
; i
++)
1261 if ((parm_table
[i
].type
== P_STRING
||
1262 parm_table
[i
].type
== P_USTRING
) &&
1264 string_set(parm_table
[i
].ptr
, "");
1266 string_set(&sDefault
.szGuestaccount
, GUEST_ACCOUNT
);
1267 string_set(&sDefault
.fstype
, FSTYPE_STRING
);
1269 init_printer_values();
1275 DEBUG(3, ("Initialising global parameters\n"));
1278 string_set(&Globals
.szTDBPasswdFile
, TDB_PASSWD_FILE
);
1280 string_set(&Globals
.szSMBPasswdFile
, SMB_PASSWD_FILE
);
1283 /* use the old 'hash' method by default */
1284 string_set(&Globals
.szManglingMethod
, "hash");
1287 * Allow the default PASSWD_CHAT to be overridden in local.h.
1289 string_set(&Globals
.szPasswdChat
, DEFAULT_PASSWD_CHAT
);
1290 string_set(&Globals
.szWorkGroup
, WORKGROUP
);
1291 string_set(&Globals
.szPasswdProgram
, PASSWD_PROGRAM
);
1292 string_set(&Globals
.szPrintcapname
, PRINTCAP_NAME
);
1293 string_set(&Globals
.szLockDir
, LOCKDIR
);
1294 string_set(&Globals
.szPidDir
, PIDDIR
);
1296 string_set(&Globals
.szUtmpDir
, "");
1297 string_set(&Globals
.szWtmpDir
, "");
1298 Globals
.bUtmp
= False
;
1300 string_set(&Globals
.szSocketAddress
, "0.0.0.0");
1301 pstrcpy(s
, "Samba ");
1302 pstrcat(s
, VERSION
);
1303 string_set(&Globals
.szServerString
, s
);
1304 slprintf(s
, sizeof(s
) - 1, "%d.%d", DEFAULT_MAJOR_VERSION
,
1305 DEFAULT_MINOR_VERSION
);
1306 string_set(&Globals
.szAnnounceVersion
, s
);
1308 pstrcpy(user_socket_options
, DEFAULT_SOCKET_OPTIONS
);
1310 string_set(&Globals
.szLogonDrive
, "");
1311 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1312 string_set(&Globals
.szLogonHome
, "\\\\%N\\%U");
1313 string_set(&Globals
.szLogonPath
, "\\\\%N\\%U\\profile");
1315 string_set(&Globals
.szNameResolveOrder
, "lmhosts host wins bcast");
1316 string_set(&Globals
.szCodePageDir
, CODEPAGEDIR
);
1318 Globals
.bLoadPrinters
= True
;
1319 Globals
.bUseRhosts
= False
;
1320 Globals
.max_packet
= 65535;
1321 Globals
.mangled_stack
= 50;
1322 Globals
.max_xmit
= 65535;
1323 Globals
.max_mux
= 50; /* This is *needed* for profile support. */
1324 Globals
.lpqcachetime
= 10;
1325 Globals
.bDisableSpoolss
= False
;
1326 Globals
.iMaxSmbdProcesses
= 0;/* no limit specified */
1327 Globals
.iTotalPrintJobs
= 0; /* no limit specified */
1328 Globals
.pwordlevel
= 0;
1329 Globals
.unamelevel
= 0;
1330 Globals
.deadtime
= 0;
1331 Globals
.bLargeReadwrite
= False
;
1332 Globals
.max_log_size
= 5000;
1333 Globals
.max_open_files
= MAX_OPEN_FILES
;
1334 Globals
.maxprotocol
= PROTOCOL_NT1
;
1335 Globals
.minprotocol
= PROTOCOL_CORE
;
1336 Globals
.security
= SEC_USER
;
1337 Globals
.bEncryptPasswords
= False
;
1338 Globals
.bUpdateEncrypt
= False
;
1339 Globals
.bReadRaw
= True
;
1340 Globals
.bWriteRaw
= True
;
1341 Globals
.bReadPrediction
= False
;
1342 Globals
.bReadbmpx
= False
;
1343 Globals
.bNullPasswords
= False
;
1344 Globals
.bObeyPamRestrictions
= False
;
1345 Globals
.bStripDot
= False
;
1347 Globals
.bSyslogOnly
= False
;
1348 Globals
.bAdminLog
= False
;
1349 Globals
.bTimestampLogs
= True
;
1350 Globals
.bDebugHiresTimestamp
= False
;
1351 Globals
.bDebugPid
= False
;
1352 Globals
.bDebugUid
= False
;
1353 Globals
.max_ttl
= 60 * 60 * 24 * 3; /* 3 days default. */
1354 Globals
.max_wins_ttl
= 60 * 60 * 24 * 6; /* 6 days default. */
1355 Globals
.min_wins_ttl
= 60 * 60 * 6; /* 6 hours default. */
1356 Globals
.machine_password_timeout
= 60 * 60 * 24 * 7; /* 7 days default. */
1357 Globals
.change_notify_timeout
= 60; /* 1 minute default. */
1358 Globals
.ReadSize
= 16 * 1024;
1359 Globals
.lm_announce
= 2; /* = Auto: send only if LM clients found */
1360 Globals
.lm_interval
= 60;
1361 Globals
.stat_cache_size
= 50; /* Number of stat translations we'll keep */
1362 Globals
.announce_as
= ANNOUNCE_AS_NT_SERVER
;
1363 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1364 Globals
.bNISHomeMap
= False
;
1365 #ifdef WITH_NISPLUS_HOME
1366 string_set(&Globals
.szNISHomeMapName
, "auto_home.org_dir");
1368 string_set(&Globals
.szNISHomeMapName
, "auto.home");
1371 Globals
.client_code_page
= DEFAULT_CLIENT_CODE_PAGE
;
1372 Globals
.bTimeServer
= False
;
1373 Globals
.bBindInterfacesOnly
= False
;
1374 Globals
.bUnixPasswdSync
= False
;
1375 Globals
.bPamPasswordChange
= False
;
1376 Globals
.bPasswdChatDebug
= False
;
1377 Globals
.bNTSmbSupport
= True
; /* Do NT SMB's by default. */
1378 Globals
.bNTPipeSupport
= True
; /* Do NT pipes by default. */
1379 Globals
.bStatCache
= True
; /* use stat cache by default */
1380 Globals
.bNTStatusSupport
= True
; /* Use NT status by default. */
1381 Globals
.bRestrictAnonymous
= False
;
1382 Globals
.bLanmanAuth
= True
; /* Do use the LanMan hash if it is available */
1383 Globals
.map_to_guest
= 0; /* By Default, "Never" */
1384 Globals
.min_passwd_length
= MINPASSWDLENGTH
; /* By Default, 5. */
1385 Globals
.oplock_break_wait_time
= 0; /* By Default, 0 msecs. */
1386 Globals
.enhanced_browsing
= True
;
1387 Globals
.iLockSpinCount
= 3; /* Try 2 times. */
1388 Globals
.iLockSpinTime
= 10; /* usec. */
1389 #ifdef MMAP_BLACKLIST
1390 Globals
.bUseMmap
= False
;
1392 Globals
.bUseMmap
= True
;
1394 Globals
.bUnixExtensions
= False
;
1397 Globals
.sslVersion
= SMB_SSL_V23
;
1398 string_set(&Globals
.sslHostsRequire
, "");
1399 string_set(&Globals
.sslHostsResign
, "");
1400 string_set(&Globals
.sslCaCertDir
, "");
1401 string_set(&Globals
.sslCaCertFile
, "");
1402 string_set(&Globals
.sslServerCert
, "");
1403 string_set(&Globals
.sslServerPrivKey
, "");
1404 string_set(&Globals
.sslClientCert
, "");
1405 string_set(&Globals
.sslClientPrivKey
, "");
1406 string_set(&Globals
.sslCiphers
, "");
1407 string_set(&Globals
.sslEgdSocket
, "");
1408 string_set(&Globals
.sslEntropyFile
, "");
1409 Globals
.sslEntropyBytes
= 256;
1410 Globals
.sslEnabled
= False
;
1411 Globals
.sslReqClientCert
= False
;
1412 Globals
.sslReqServerCert
= False
;
1413 Globals
.sslCompatibility
= False
;
1414 #endif /* WITH_SSL */
1416 #ifdef WITH_LDAP_SAM
1417 string_set(&Globals
.szLdapServer
, "localhost");
1418 string_set(&Globals
.szLdapSuffix
, "");
1419 string_set(&Globals
.szLdapFilter
, "(&(uid=%u)(objectclass=sambaAccount))");
1420 string_set(&Globals
.szLdapAdminDn
, "");
1421 Globals
.ldap_port
= 636;
1422 Globals
.ldap_ssl
= LDAP_SSL_ON
;
1423 #endif /* WITH_LDAP_SAM */
1424 /* these parameters are set to defaults that are more appropriate
1425 for the increasing samba install base:
1427 as a member of the workgroup, that will possibly become a
1428 _local_ master browser (lm = True). this is opposed to a forced
1429 local master browser startup (pm = True).
1431 doesn't provide WINS server service by default (wsupp = False),
1432 and doesn't provide domain master browser services by default, either.
1436 Globals
.bMsAddPrinterWizard
= True
;
1437 Globals
.bPreferredMaster
= Auto
; /* depending on bDomainMaster */
1438 Globals
.os_level
= 20;
1439 Globals
.bLocalMaster
= True
;
1440 Globals
.bDomainMaster
= Auto
; /* depending on bDomainLogons */
1441 Globals
.bDomainLogons
= False
;
1442 Globals
.bBrowseList
= True
;
1443 Globals
.bWINSsupport
= False
;
1444 Globals
.bWINSproxy
= False
;
1446 Globals
.bDNSproxy
= True
;
1448 /* this just means to use them if they exist */
1449 Globals
.bKernelOplocks
= True
;
1451 Globals
.bAllowTrustedDomains
= True
;
1453 string_set(&Globals
.szTemplateShell
, "/bin/false");
1454 string_set(&Globals
.szTemplateHomedir
, "/home/%D/%U");
1455 string_set(&Globals
.szWinbindSeparator
, "\\");
1456 Globals
.winbind_cache_time
= 15;
1458 Globals
.bWinbindEnumUsers
= True
;
1459 Globals
.bWinbindEnumGroups
= True
;
1460 Globals
.bWinbindUseDefaultDomain
= False
;
1462 Globals
.bHostMSDfs
= False
;
1464 Globals
.name_cache_timeout
= 660; /* In seconds */
1467 * This must be done last as it checks the value in
1471 interpret_coding_system(KANJI
);
1474 static TALLOC_CTX
*lp_talloc
;
1476 /******************************************************************* a
1477 free up temporary memory - called from the main loop
1478 ********************************************************************/
1479 void lp_talloc_free(void)
1483 talloc_destroy(lp_talloc
);
1487 /*******************************************************************
1488 convenience routine to grab string parameters into temporary memory
1489 and run standard_sub_basic on them. The buffers can be written to by
1490 callers without affecting the source string.
1491 ********************************************************************/
1492 static char *lp_string(const char *s
)
1494 size_t len
= s
? strlen(s
) : 0;
1498 lp_talloc
= talloc_init();
1500 ret
= (char *)talloc(lp_talloc
, len
+ 100); /* leave room for substitution */
1508 StrnCpy(ret
, s
, len
);
1510 trim_string(ret
, "\"", "\"");
1512 standard_sub_basic(ret
, len
+ 100);
1518 In this section all the functions that are used to access the
1519 parameters from the rest of the program are defined
1522 #define FN_GLOBAL_STRING(fn_name,ptr) \
1523 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1524 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1525 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1526 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1527 char fn_name(void) {return(*(char *)(ptr));}
1528 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1529 int fn_name(void) {return(*(int *)(ptr));}
1531 #define FN_LOCAL_STRING(fn_name,val) \
1532 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1533 #define FN_LOCAL_CONST_STRING(fn_name,val) \
1534 const char *fn_name(int i) {return(const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1535 #define FN_LOCAL_BOOL(fn_name,val) \
1536 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1537 #define FN_LOCAL_CHAR(fn_name,val) \
1538 char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1539 #define FN_LOCAL_INTEGER(fn_name,val) \
1540 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1542 FN_GLOBAL_STRING(lp_logfile
, &Globals
.szLogFile
)
1543 FN_GLOBAL_STRING(lp_configfile
, &Globals
.szConfigFile
)
1545 FN_GLOBAL_STRING(lp_tdb_passwd_file
, &Globals
.szTDBPasswdFile
)
1547 FN_GLOBAL_STRING(lp_smb_passwd_file
, &Globals
.szSMBPasswdFile
)
1549 FN_GLOBAL_STRING(lp_serverstring
, &Globals
.szServerString
)
1550 FN_GLOBAL_STRING(lp_printcapname
, &Globals
.szPrintcapname
)
1551 FN_GLOBAL_STRING(lp_enumports_cmd
, &Globals
.szEnumPortsCommand
)
1552 FN_GLOBAL_STRING(lp_addprinter_cmd
, &Globals
.szAddPrinterCommand
)
1553 FN_GLOBAL_STRING(lp_deleteprinter_cmd
, &Globals
.szDeletePrinterCommand
)
1554 FN_GLOBAL_STRING(lp_os2_driver_map
, &Globals
.szOs2DriverMap
)
1555 FN_GLOBAL_STRING(lp_lockdir
, &Globals
.szLockDir
)
1556 FN_GLOBAL_STRING(lp_piddir
, &Globals
.szPidDir
)
1558 FN_GLOBAL_STRING(lp_utmpdir
, &Globals
.szUtmpDir
)
1559 FN_GLOBAL_STRING(lp_wtmpdir
, &Globals
.szWtmpDir
)
1560 FN_GLOBAL_BOOL(lp_utmp
, &Globals
.bUtmp
)
1562 FN_GLOBAL_STRING(lp_rootdir
, &Globals
.szRootdir
)
1563 FN_GLOBAL_STRING(lp_source_environment
, &Globals
.szSourceEnv
)
1564 FN_GLOBAL_STRING(lp_defaultservice
, &Globals
.szDefaultService
)
1565 FN_GLOBAL_STRING(lp_msg_command
, &Globals
.szMsgCommand
)
1566 FN_GLOBAL_STRING(lp_dfree_command
, &Globals
.szDfree
)
1567 FN_GLOBAL_STRING(lp_hosts_equiv
, &Globals
.szHostsEquiv
)
1568 FN_GLOBAL_STRING(lp_auto_services
, &Globals
.szAutoServices
)
1569 FN_GLOBAL_STRING(lp_passwd_program
, &Globals
.szPasswdProgram
)
1570 FN_GLOBAL_STRING(lp_passwd_chat
, &Globals
.szPasswdChat
)
1571 FN_GLOBAL_STRING(lp_passwordserver
, &Globals
.szPasswordServer
)
1572 FN_GLOBAL_STRING(lp_name_resolve_order
, &Globals
.szNameResolveOrder
)
1573 FN_GLOBAL_STRING(lp_workgroup
, &Globals
.szWorkGroup
)
1574 FN_GLOBAL_STRING(lp_username_map
, &Globals
.szUsernameMap
)
1575 #ifdef USING_GROUPNAME_MAP
1576 FN_GLOBAL_STRING(lp_groupname_map
, &Globals
.szGroupnameMap
)
1577 #endif /* USING_GROUPNAME_MAP */
1578 FN_GLOBAL_STRING(lp_logon_script
, &Globals
.szLogonScript
)
1579 FN_GLOBAL_STRING(lp_logon_path
, &Globals
.szLogonPath
)
1580 FN_GLOBAL_STRING(lp_logon_drive
, &Globals
.szLogonDrive
)
1581 FN_GLOBAL_STRING(lp_logon_home
, &Globals
.szLogonHome
)
1582 FN_GLOBAL_STRING(lp_remote_announce
, &Globals
.szRemoteAnnounce
)
1583 FN_GLOBAL_STRING(lp_remote_browse_sync
, &Globals
.szRemoteBrowseSync
)
1584 FN_GLOBAL_STRING(lp_wins_server
, &Globals
.szWINSserver
)
1585 FN_GLOBAL_STRING(lp_interfaces
, &Globals
.szInterfaces
)
1586 FN_GLOBAL_STRING(lp_socket_address
, &Globals
.szSocketAddress
)
1587 FN_GLOBAL_STRING(lp_nis_home_map_name
, &Globals
.szNISHomeMapName
)
1588 static FN_GLOBAL_STRING(lp_announce_version
, &Globals
.szAnnounceVersion
)
1589 FN_GLOBAL_STRING(lp_netbios_aliases
, &Globals
.szNetbiosAliases
)
1590 FN_GLOBAL_STRING(lp_panic_action
, &Globals
.szPanicAction
)
1591 FN_GLOBAL_STRING(lp_adduser_script
, &Globals
.szAddUserScript
)
1592 FN_GLOBAL_STRING(lp_deluser_script
, &Globals
.szDelUserScript
)
1593 FN_GLOBAL_STRING(lp_wins_hook
, &Globals
.szWINSHook
)
1594 FN_GLOBAL_STRING(lp_domain_admin_group
, &Globals
.szDomainAdminGroup
)
1595 FN_GLOBAL_STRING(lp_domain_guest_group
, &Globals
.szDomainGuestGroup
)
1596 FN_GLOBAL_STRING(lp_template_homedir
, &Globals
.szTemplateHomedir
)
1597 FN_GLOBAL_STRING(lp_template_shell
, &Globals
.szTemplateShell
)
1598 FN_GLOBAL_STRING(lp_winbind_separator
, &Globals
.szWinbindSeparator
)
1599 FN_GLOBAL_BOOL(lp_winbind_enum_users
, &Globals
.bWinbindEnumUsers
)
1600 FN_GLOBAL_BOOL(lp_winbind_enum_groups
, &Globals
.bWinbindEnumGroups
)
1601 FN_GLOBAL_BOOL(lp_winbind_use_default_domain
, &Globals
.bWinbindUseDefaultDomain
)
1602 FN_GLOBAL_STRING(lp_codepagedir
,&Globals
.szCodePageDir
)
1603 #ifdef WITH_LDAP_SAM
1604 FN_GLOBAL_STRING(lp_ldap_server
, &Globals
.szLdapServer
)
1605 FN_GLOBAL_STRING(lp_ldap_suffix
, &Globals
.szLdapSuffix
)
1606 FN_GLOBAL_STRING(lp_ldap_filter
, &Globals
.szLdapFilter
)
1607 FN_GLOBAL_STRING(lp_ldap_admin_dn
, &Globals
.szLdapAdminDn
)
1608 FN_GLOBAL_INTEGER(lp_ldap_port
, &Globals
.ldap_port
)
1609 FN_GLOBAL_INTEGER(lp_ldap_ssl
, &Globals
.ldap_ssl
)
1610 #endif /* WITH_LDAP_SAM */
1611 FN_GLOBAL_STRING(lp_add_share_cmd
, &Globals
.szAddShareCommand
)
1612 FN_GLOBAL_STRING(lp_change_share_cmd
, &Globals
.szChangeShareCommand
)
1613 FN_GLOBAL_STRING(lp_delete_share_cmd
, &Globals
.szDeleteShareCommand
)
1614 FN_GLOBAL_STRING(lp_mangling_method
, &Globals
.szManglingMethod
)
1617 FN_GLOBAL_INTEGER(lp_ssl_version
, &Globals
.sslVersion
)
1618 FN_GLOBAL_STRING(lp_ssl_hosts
, &Globals
.sslHostsRequire
)
1619 FN_GLOBAL_STRING(lp_ssl_hosts_resign
, &Globals
.sslHostsResign
)
1620 FN_GLOBAL_STRING(lp_ssl_cacertdir
, &Globals
.sslCaCertDir
)
1621 FN_GLOBAL_STRING(lp_ssl_cacertfile
, &Globals
.sslCaCertFile
)
1622 FN_GLOBAL_STRING(lp_ssl_server_cert
, &Globals
.sslServerCert
)
1623 FN_GLOBAL_STRING(lp_ssl_server_privkey
, &Globals
.sslServerPrivKey
)
1624 FN_GLOBAL_STRING(lp_ssl_client_cert
, &Globals
.sslClientCert
)
1625 FN_GLOBAL_STRING(lp_ssl_client_privkey
, &Globals
.sslClientPrivKey
)
1626 FN_GLOBAL_STRING(lp_ssl_ciphers
, &Globals
.sslCiphers
)
1627 FN_GLOBAL_STRING(lp_ssl_egdsocket
, &Globals
.sslEgdSocket
)
1628 FN_GLOBAL_STRING(lp_ssl_entropyfile
, &Globals
.sslEntropyFile
)
1629 FN_GLOBAL_INTEGER(lp_ssl_entropybytes
, &Globals
.sslEntropyBytes
)
1630 FN_GLOBAL_BOOL(lp_ssl_enabled
, &Globals
.sslEnabled
)
1631 FN_GLOBAL_BOOL(lp_ssl_reqClientCert
, &Globals
.sslReqClientCert
)
1632 FN_GLOBAL_BOOL(lp_ssl_reqServerCert
, &Globals
.sslReqServerCert
)
1633 FN_GLOBAL_BOOL(lp_ssl_compatibility
, &Globals
.sslCompatibility
)
1634 #endif /* WITH_SSL */
1636 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard
, &Globals
.bMsAddPrinterWizard
)
1637 FN_GLOBAL_BOOL(lp_dns_proxy
, &Globals
.bDNSproxy
)
1638 FN_GLOBAL_BOOL(lp_wins_support
, &Globals
.bWINSsupport
)
1639 FN_GLOBAL_BOOL(lp_we_are_a_wins_server
, &Globals
.bWINSsupport
)
1640 FN_GLOBAL_BOOL(lp_wins_proxy
, &Globals
.bWINSproxy
)
1641 FN_GLOBAL_BOOL(lp_local_master
, &Globals
.bLocalMaster
)
1642 FN_GLOBAL_BOOL(lp_domain_logons
, &Globals
.bDomainLogons
)
1643 FN_GLOBAL_BOOL(lp_load_printers
, &Globals
.bLoadPrinters
)
1644 FN_GLOBAL_BOOL(lp_use_rhosts
, &Globals
.bUseRhosts
)
1645 FN_GLOBAL_BOOL(lp_readprediction
, &Globals
.bReadPrediction
)
1646 FN_GLOBAL_BOOL(lp_readbmpx
, &Globals
.bReadbmpx
)
1647 FN_GLOBAL_BOOL(lp_readraw
, &Globals
.bReadRaw
)
1648 FN_GLOBAL_BOOL(lp_large_readwrite
, &Globals
.bLargeReadwrite
)
1649 FN_GLOBAL_BOOL(lp_writeraw
, &Globals
.bWriteRaw
)
1650 FN_GLOBAL_BOOL(lp_null_passwords
, &Globals
.bNullPasswords
)
1651 FN_GLOBAL_BOOL(lp_obey_pam_restrictions
, &Globals
.bObeyPamRestrictions
)
1652 FN_GLOBAL_BOOL(lp_strip_dot
, &Globals
.bStripDot
)
1653 FN_GLOBAL_BOOL(lp_encrypted_passwords
, &Globals
.bEncryptPasswords
)
1654 FN_GLOBAL_BOOL(lp_update_encrypted
, &Globals
.bUpdateEncrypt
)
1655 FN_GLOBAL_BOOL(lp_syslog_only
, &Globals
.bSyslogOnly
)
1656 FN_GLOBAL_BOOL(lp_admin_log
, &Globals
.bAdminLog
)
1657 FN_GLOBAL_BOOL(lp_timestamp_logs
, &Globals
.bTimestampLogs
)
1658 FN_GLOBAL_BOOL(lp_debug_hires_timestamp
, &Globals
.bDebugHiresTimestamp
)
1659 FN_GLOBAL_BOOL(lp_debug_pid
, &Globals
.bDebugPid
)
1660 FN_GLOBAL_BOOL(lp_debug_uid
, &Globals
.bDebugUid
)
1661 FN_GLOBAL_BOOL(lp_browse_list
, &Globals
.bBrowseList
)
1662 FN_GLOBAL_BOOL(lp_nis_home_map
, &Globals
.bNISHomeMap
)
1663 static FN_GLOBAL_BOOL(lp_time_server
, &Globals
.bTimeServer
)
1664 FN_GLOBAL_BOOL(lp_bind_interfaces_only
, &Globals
.bBindInterfacesOnly
)
1665 FN_GLOBAL_BOOL(lp_pam_password_change
, &Globals
.bPamPasswordChange
)
1666 FN_GLOBAL_BOOL(lp_unix_password_sync
, &Globals
.bUnixPasswdSync
)
1667 FN_GLOBAL_BOOL(lp_passwd_chat_debug
, &Globals
.bPasswdChatDebug
)
1668 FN_GLOBAL_BOOL(lp_nt_smb_support
, &Globals
.bNTSmbSupport
)
1669 FN_GLOBAL_BOOL(lp_nt_pipe_support
, &Globals
.bNTPipeSupport
)
1670 FN_GLOBAL_BOOL(lp_nt_status_support
, &Globals
.bNTStatusSupport
)
1671 FN_GLOBAL_BOOL(lp_stat_cache
, &Globals
.bStatCache
)
1672 FN_GLOBAL_BOOL(lp_allow_trusted_domains
, &Globals
.bAllowTrustedDomains
)
1673 FN_GLOBAL_BOOL(lp_restrict_anonymous
, &Globals
.bRestrictAnonymous
)
1674 FN_GLOBAL_BOOL(lp_lanman_auth
, &Globals
.bLanmanAuth
)
1675 FN_GLOBAL_BOOL(lp_host_msdfs
, &Globals
.bHostMSDfs
)
1676 FN_GLOBAL_BOOL(lp_kernel_oplocks
, &Globals
.bKernelOplocks
)
1677 FN_GLOBAL_BOOL(lp_enhanced_browsing
, &Globals
.enhanced_browsing
)
1678 FN_GLOBAL_BOOL(lp_use_mmap
, &Globals
.bUseMmap
)
1679 FN_GLOBAL_BOOL(lp_unix_extensions
, &Globals
.bUnixExtensions
)
1680 FN_GLOBAL_INTEGER(lp_os_level
, &Globals
.os_level
)
1681 FN_GLOBAL_INTEGER(lp_max_ttl
, &Globals
.max_ttl
)
1682 FN_GLOBAL_INTEGER(lp_max_wins_ttl
, &Globals
.max_wins_ttl
)
1683 FN_GLOBAL_INTEGER(lp_min_wins_ttl
, &Globals
.min_wins_ttl
)
1684 FN_GLOBAL_INTEGER(lp_max_log_size
, &Globals
.max_log_size
)
1685 FN_GLOBAL_INTEGER(lp_max_open_files
, &Globals
.max_open_files
)
1686 FN_GLOBAL_INTEGER(lp_maxxmit
, &Globals
.max_xmit
)
1687 FN_GLOBAL_INTEGER(lp_maxmux
, &Globals
.max_mux
)
1688 FN_GLOBAL_INTEGER(lp_passwordlevel
, &Globals
.pwordlevel
)
1689 FN_GLOBAL_INTEGER(lp_usernamelevel
, &Globals
.unamelevel
)
1690 FN_GLOBAL_INTEGER(lp_readsize
, &Globals
.ReadSize
)
1691 FN_GLOBAL_INTEGER(lp_deadtime
, &Globals
.deadtime
)
1692 FN_GLOBAL_INTEGER(lp_maxprotocol
, &Globals
.maxprotocol
)
1693 FN_GLOBAL_INTEGER(lp_minprotocol
, &Globals
.minprotocol
)
1694 FN_GLOBAL_INTEGER(lp_security
, &Globals
.security
)
1695 FN_GLOBAL_INTEGER(lp_maxdisksize
, &Globals
.maxdisksize
)
1696 FN_GLOBAL_INTEGER(lp_lpqcachetime
, &Globals
.lpqcachetime
)
1697 FN_GLOBAL_INTEGER(lp_max_smbd_processes
, &Globals
.iMaxSmbdProcesses
)
1698 FN_GLOBAL_INTEGER(lp_disable_spoolss
, &Globals
.bDisableSpoolss
)
1699 FN_GLOBAL_INTEGER(lp_totalprintjobs
, &Globals
.iTotalPrintJobs
)
1700 FN_GLOBAL_INTEGER(lp_syslog
, &Globals
.syslog
)
1701 FN_GLOBAL_INTEGER(lp_client_code_page
, &Globals
.client_code_page
)
1702 static FN_GLOBAL_INTEGER(lp_announce_as
, &Globals
.announce_as
)
1703 FN_GLOBAL_INTEGER(lp_lm_announce
, &Globals
.lm_announce
)
1704 FN_GLOBAL_INTEGER(lp_lm_interval
, &Globals
.lm_interval
)
1705 FN_GLOBAL_INTEGER(lp_machine_password_timeout
, &Globals
.machine_password_timeout
)
1706 FN_GLOBAL_INTEGER(lp_change_notify_timeout
, &Globals
.change_notify_timeout
)
1707 FN_GLOBAL_INTEGER(lp_stat_cache_size
, &Globals
.stat_cache_size
)
1708 FN_GLOBAL_INTEGER(lp_map_to_guest
, &Globals
.map_to_guest
)
1709 FN_GLOBAL_INTEGER(lp_min_passwd_length
, &Globals
.min_passwd_length
)
1710 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time
, &Globals
.oplock_break_wait_time
)
1711 FN_GLOBAL_INTEGER(lp_lock_spin_count
, &Globals
.iLockSpinCount
)
1712 FN_GLOBAL_INTEGER(lp_lock_sleep_time
, &Globals
.iLockSpinTime
)
1713 FN_GLOBAL_INTEGER(lp_name_cache_timeout
, &Globals
.name_cache_timeout
)
1714 FN_LOCAL_STRING(lp_preexec
, szPreExec
)
1715 FN_LOCAL_STRING(lp_postexec
, szPostExec
)
1716 FN_LOCAL_STRING(lp_rootpreexec
, szRootPreExec
)
1717 FN_LOCAL_STRING(lp_rootpostexec
, szRootPostExec
)
1718 FN_LOCAL_STRING(lp_servicename
, szService
)
1719 FN_LOCAL_CONST_STRING(lp_const_servicename
, szService
)
1720 FN_LOCAL_STRING(lp_pathname
, szPath
)
1721 FN_LOCAL_STRING(lp_dontdescend
, szDontdescend
)
1722 FN_LOCAL_STRING(lp_username
, szUsername
)
1723 FN_LOCAL_STRING(lp_guestaccount
, szGuestaccount
)
1724 FN_LOCAL_STRING(lp_invalid_users
, szInvalidUsers
)
1725 FN_LOCAL_STRING(lp_valid_users
, szValidUsers
)
1726 FN_LOCAL_STRING(lp_admin_users
, szAdminUsers
)
1727 FN_LOCAL_STRING(lp_printcommand
, szPrintcommand
)
1728 FN_LOCAL_STRING(lp_lpqcommand
, szLpqcommand
)
1729 FN_LOCAL_STRING(lp_lprmcommand
, szLprmcommand
)
1730 FN_LOCAL_STRING(lp_lppausecommand
, szLppausecommand
)
1731 FN_LOCAL_STRING(lp_lpresumecommand
, szLpresumecommand
)
1732 FN_LOCAL_STRING(lp_queuepausecommand
, szQueuepausecommand
)
1733 FN_LOCAL_STRING(lp_queueresumecommand
, szQueueresumecommand
)
1734 static FN_LOCAL_STRING(_lp_printername
, szPrintername
)
1735 FN_LOCAL_STRING(lp_driverfile
, szDriverFile
)
1736 FN_LOCAL_STRING(lp_printerdriver
, szPrinterDriver
)
1737 FN_LOCAL_STRING(lp_hostsallow
, szHostsallow
)
1738 FN_LOCAL_STRING(lp_hostsdeny
, szHostsdeny
)
1739 FN_LOCAL_STRING(lp_magicscript
, szMagicScript
)
1740 FN_LOCAL_STRING(lp_magicoutput
, szMagicOutput
)
1741 FN_LOCAL_STRING(lp_comment
, comment
)
1742 FN_LOCAL_STRING(lp_force_user
, force_user
)
1743 FN_LOCAL_STRING(lp_force_group
, force_group
)
1744 FN_LOCAL_STRING(lp_readlist
, readlist
)
1745 FN_LOCAL_STRING(lp_writelist
, writelist
)
1746 FN_LOCAL_STRING(lp_printer_admin
, printer_admin
)
1747 FN_LOCAL_STRING(lp_fstype
, fstype
)
1748 FN_LOCAL_STRING(lp_vfsobj
, szVfsObjectFile
)
1749 FN_LOCAL_STRING(lp_vfs_options
, szVfsOptions
)
1750 static FN_LOCAL_STRING(lp_volume
, volume
)
1751 FN_LOCAL_STRING(lp_mangled_map
, szMangledMap
)
1752 FN_LOCAL_STRING(lp_veto_files
, szVetoFiles
)
1753 FN_LOCAL_STRING(lp_hide_files
, szHideFiles
)
1754 FN_LOCAL_STRING(lp_veto_oplocks
, szVetoOplockFiles
)
1755 FN_LOCAL_STRING(lp_driverlocation
, szPrinterDriverLocation
)
1756 FN_LOCAL_BOOL(lp_msdfs_root
, bMSDfsRoot
)
1757 FN_LOCAL_BOOL(lp_autoloaded
, autoloaded
)
1758 FN_LOCAL_BOOL(lp_preexec_close
, bPreexecClose
)
1759 FN_LOCAL_BOOL(lp_rootpreexec_close
, bRootpreexecClose
)
1760 FN_LOCAL_BOOL(lp_casesensitive
, bCaseSensitive
)
1761 FN_LOCAL_BOOL(lp_preservecase
, bCasePreserve
)
1762 FN_LOCAL_BOOL(lp_shortpreservecase
, bShortCasePreserve
)
1763 FN_LOCAL_BOOL(lp_casemangle
, bCaseMangle
)
1764 FN_LOCAL_BOOL(lp_status
, status
)
1765 FN_LOCAL_BOOL(lp_hide_dot_files
, bHideDotFiles
)
1766 FN_LOCAL_BOOL(lp_hideunreadable
, bHideUnReadable
)
1767 FN_LOCAL_BOOL(lp_browseable
, bBrowseable
)
1768 FN_LOCAL_BOOL(lp_readonly
, bRead_only
)
1769 FN_LOCAL_BOOL(lp_no_set_dir
, bNo_set_dir
)
1770 FN_LOCAL_BOOL(lp_guest_ok
, bGuest_ok
)
1771 FN_LOCAL_BOOL(lp_guest_only
, bGuest_only
)
1772 FN_LOCAL_BOOL(lp_print_ok
, bPrint_ok
)
1773 FN_LOCAL_BOOL(lp_postscript
, bPostscript
)
1774 FN_LOCAL_BOOL(lp_map_hidden
, bMap_hidden
)
1775 FN_LOCAL_BOOL(lp_map_archive
, bMap_archive
)
1776 FN_LOCAL_BOOL(lp_locking
, bLocking
)
1777 FN_LOCAL_BOOL(lp_strict_locking
, bStrictLocking
)
1778 FN_LOCAL_BOOL(lp_share_modes
, bShareModes
)
1779 FN_LOCAL_BOOL(lp_posix_locking
, bPosixLocking
)
1780 FN_LOCAL_BOOL(lp_oplocks
, bOpLocks
)
1781 FN_LOCAL_BOOL(lp_level2_oplocks
, bLevel2OpLocks
)
1782 FN_LOCAL_BOOL(lp_onlyuser
, bOnlyUser
)
1783 FN_LOCAL_BOOL(lp_manglednames
, bMangledNames
)
1784 FN_LOCAL_BOOL(lp_widelinks
, bWidelinks
)
1785 FN_LOCAL_BOOL(lp_symlinks
, bSymlinks
)
1786 FN_LOCAL_BOOL(lp_syncalways
, bSyncAlways
)
1787 FN_LOCAL_BOOL(lp_strict_allocate
, bStrictAllocate
)
1788 FN_LOCAL_BOOL(lp_strict_sync
, bStrictSync
)
1789 FN_LOCAL_BOOL(lp_map_system
, bMap_system
)
1790 FN_LOCAL_BOOL(lp_delete_readonly
, bDeleteReadonly
)
1791 FN_LOCAL_BOOL(lp_fake_oplocks
, bFakeOplocks
)
1792 FN_LOCAL_BOOL(lp_recursive_veto_delete
, bDeleteVetoFiles
)
1793 FN_LOCAL_BOOL(lp_dos_filemode
, bDosFilemode
)
1794 FN_LOCAL_BOOL(lp_dos_filetimes
, bDosFiletimes
)
1795 FN_LOCAL_BOOL(lp_dos_filetime_resolution
, bDosFiletimeResolution
)
1796 FN_LOCAL_BOOL(lp_fake_dir_create_times
, bFakeDirCreateTimes
)
1797 FN_LOCAL_BOOL(lp_blocking_locks
, bBlockingLocks
)
1798 FN_LOCAL_BOOL(lp_inherit_perms
, bInheritPerms
)
1799 FN_LOCAL_BOOL(lp_inherit_acls
, bInheritACLS
)
1800 FN_LOCAL_BOOL(lp_use_client_driver
, bUseClientDriver
)
1801 FN_LOCAL_BOOL(lp_default_devmode
, bDefaultDevmode
)
1802 FN_LOCAL_BOOL(lp_nt_acl_support
, bNTAclSupport
)
1803 FN_LOCAL_BOOL(lp_force_unknown_acl_user
, bForceUnknownAclUser
)
1804 #ifdef WITH_SENDFILE
1805 FN_LOCAL_BOOL(lp_use_sendfile
, bUseSendfile
)
1807 FN_LOCAL_BOOL(lp_profile_acls
, bProfileAcls
)
1808 FN_LOCAL_INTEGER(lp_create_mask
, iCreate_mask
)
1809 FN_LOCAL_INTEGER(lp_force_create_mode
, iCreate_force_mode
)
1810 FN_LOCAL_INTEGER(lp_security_mask
, iSecurity_mask
)
1811 FN_LOCAL_INTEGER(lp_force_security_mode
, iSecurity_force_mode
)
1812 FN_LOCAL_INTEGER(lp_dir_mask
, iDir_mask
)
1813 FN_LOCAL_INTEGER(lp_force_dir_mode
, iDir_force_mode
)
1814 FN_LOCAL_INTEGER(lp_dir_security_mask
, iDir_Security_mask
)
1815 FN_LOCAL_INTEGER(lp_force_dir_security_mode
, iDir_Security_force_mode
)
1816 FN_LOCAL_INTEGER(lp_max_connections
, iMaxConnections
)
1817 FN_LOCAL_INTEGER(lp_defaultcase
, iDefaultCase
)
1818 FN_LOCAL_INTEGER(lp_minprintspace
, iMinPrintSpace
)
1819 FN_LOCAL_INTEGER(lp_printing
, iPrinting
)
1820 FN_LOCAL_INTEGER(lp_oplock_contention_limit
, iOplockContentionLimit
)
1821 FN_LOCAL_INTEGER(lp_csc_policy
, iCSCPolicy
)
1822 FN_LOCAL_INTEGER(lp_write_cache_size
, iWriteCacheSize
)
1823 FN_LOCAL_INTEGER(lp_block_size
, iBlock_size
)
1824 FN_LOCAL_CHAR(lp_magicchar
, magic_char
)
1825 FN_GLOBAL_INTEGER(lp_winbind_cache_time
, &Globals
.winbind_cache_time
)
1826 FN_GLOBAL_BOOL(lp_hide_local_users
, &Globals
.bHideLocalUsers
)
1828 /* local prototypes */
1830 static int map_parameter(char *pszParmName
);
1831 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
);
1832 static int getservicebyname(char *pszServiceName
,
1833 service
* pserviceDest
);
1834 static void copy_service(service
* pserviceDest
,
1835 service
* pserviceSource
, BOOL
*pcopymapDest
);
1836 static BOOL
service_ok(int iService
);
1837 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
);
1838 static BOOL
do_section(char *pszSectionName
);
1839 static void init_copymap(service
* pservice
);
1842 /***************************************************************************
1843 initialise a service to the defaults
1844 ***************************************************************************/
1845 static void init_service(service
* pservice
)
1847 memset((char *)pservice
, '\0', sizeof(service
));
1848 copy_service(pservice
, &sDefault
, NULL
);
1852 /***************************************************************************
1853 free the dynamically allocated parts of a service struct
1854 ***************************************************************************/
1855 static void free_service(service
* pservice
)
1861 if (pservice
->szService
)
1863 ("free_service: Freeing service %s\n",
1864 pservice
->szService
));
1866 string_free(&pservice
->szService
);
1867 SAFE_FREE(pservice
->copymap
);
1869 for (i
= 0; parm_table
[i
].label
; i
++)
1870 if ((parm_table
[i
].type
== P_STRING
||
1871 parm_table
[i
].type
== P_USTRING
) &&
1872 parm_table
[i
].class == P_LOCAL
)
1873 string_free((char **)
1874 (((char *)pservice
) +
1875 PTR_DIFF(parm_table
[i
].ptr
, &sDefault
)));
1877 ZERO_STRUCTP(pservice
);
1880 /***************************************************************************
1881 add a new service to the services array initialising it with the given
1882 service. name must be in DOS codepage.
1883 ***************************************************************************/
1884 static int add_a_service(service
* pservice
, char *name
)
1888 int num_to_alloc
= iNumServices
+ 1;
1890 tservice
= *pservice
;
1892 /* it might already exist */
1896 i
= getservicebyname(name
, NULL
);
1901 /* find an invalid one */
1902 for (i
= 0; i
< iNumServices
; i
++)
1903 if (!ServicePtrs
[i
]->valid
)
1906 /* if not, then create one */
1907 if (i
== iNumServices
)
1912 service
**oldservices
= iNumServices
? malloc(sizeof(service
*) * iNumServices
) : NULL
;
1915 memcpy(oldservices
, ServicePtrs
, sizeof(service
*) * iNumServices
);
1918 tsp
= (service
**) Realloc(ServicePtrs
,
1923 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
1927 ServicePtrs
[iNumServices
] =
1928 (service
*) malloc(sizeof(service
));
1932 if (iNumServices
&& (memcmp(oldservices
, ServicePtrs
, sizeof(service
*) * iNumServices
) != 0)) {
1933 smb_panic("add_a_service: Realloc corrupted ptrs...\n");
1935 safe_free(oldservices
);
1938 if (!ServicePtrs
[iNumServices
])
1944 free_service(ServicePtrs
[i
]);
1946 ServicePtrs
[i
]->valid
= True
;
1948 init_service(ServicePtrs
[i
]);
1949 copy_service(ServicePtrs
[i
], &tservice
, NULL
);
1952 string_set(&ServicePtrs
[i
]->szService
, name
);
1957 /***************************************************************************
1958 add a new home service, with the specified home directory, defaults coming
1959 from service ifrom. homename must be in DOS codepage.
1960 ***************************************************************************/
1961 BOOL
lp_add_home(char *pszHomename
, int iDefaultService
, char *pszHomedir
)
1964 SMB_STRUCT_STAT buf
;
1966 /* if the user's home directory doesn't exist, then don't
1967 add it to the list of available shares */
1968 if (sys_stat(pszHomedir
, &buf
))
1971 i
= add_a_service(ServicePtrs
[iDefaultService
], pszHomename
);
1976 if (!(*(ServicePtrs
[i
]->szPath
))
1977 || strequal(ServicePtrs
[i
]->szPath
, lp_pathname(-1)))
1978 string_set(&ServicePtrs
[i
]->szPath
, pszHomedir
);
1979 if (!(*(ServicePtrs
[i
]->comment
)))
1982 slprintf(comment
, sizeof(comment
) - 1,
1983 "Home directory of %s", pszHomename
);
1984 string_set(&ServicePtrs
[i
]->comment
, comment
);
1986 ServicePtrs
[i
]->bAvailable
= sDefault
.bAvailable
;
1987 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
1990 ("adding home directory %s at %s\n", pszHomename
, pszHomedir
));
1995 /***************************************************************************
1996 add a new service, based on an old one. pszService must be in DOS codepage.
1997 ***************************************************************************/
1998 int lp_add_service(char *pszService
, int iDefaultService
)
2000 return (add_a_service(ServicePtrs
[iDefaultService
], pszService
));
2004 /***************************************************************************
2006 ***************************************************************************/
2007 static BOOL
lp_add_ipc(char *ipc_name
, BOOL guest_ok
)
2010 int i
= add_a_service(&sDefault
, ipc_name
);
2015 slprintf(comment
, sizeof(comment
) - 1,
2016 "IPC Service (%s)", Globals
.szServerString
);
2018 string_set(&ServicePtrs
[i
]->szPath
, tmpdir());
2019 string_set(&ServicePtrs
[i
]->szUsername
, "");
2020 string_set(&ServicePtrs
[i
]->comment
, comment
);
2021 string_set(&ServicePtrs
[i
]->fstype
, "IPC");
2022 ServicePtrs
[i
]->status
= False
;
2023 ServicePtrs
[i
]->iMaxConnections
= 0;
2024 ServicePtrs
[i
]->bAvailable
= True
;
2025 ServicePtrs
[i
]->bRead_only
= True
;
2026 ServicePtrs
[i
]->bGuest_only
= False
;
2027 ServicePtrs
[i
]->bGuest_ok
= guest_ok
;
2028 ServicePtrs
[i
]->bPrint_ok
= False
;
2029 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
2031 DEBUG(3, ("adding IPC service %s\n", ipc_name
));
2037 /***************************************************************************
2038 add a new printer service, with defaults coming from service iFrom.
2039 printername must be in DOS codepage.
2040 ***************************************************************************/
2041 BOOL
lp_add_printer(char *pszPrintername
, int iDefaultService
)
2043 char *comment
= "From Printcap";
2044 int i
= add_a_service(ServicePtrs
[iDefaultService
], pszPrintername
);
2049 /* note that we do NOT default the availability flag to True - */
2050 /* we take it from the default service passed. This allows all */
2051 /* dynamic printers to be disabled by disabling the [printers] */
2052 /* entry (if/when the 'available' keyword is implemented!). */
2054 /* the printer name is set to the service name. */
2055 string_set(&ServicePtrs
[i
]->szPrintername
, pszPrintername
);
2056 string_set(&ServicePtrs
[i
]->comment
, comment
);
2057 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
2058 /* Printers cannot be read_only. */
2059 ServicePtrs
[i
]->bRead_only
= False
;
2060 /* No oplocks on printer services. */
2061 ServicePtrs
[i
]->bOpLocks
= False
;
2062 /* Printer services must be printable. */
2063 ServicePtrs
[i
]->bPrint_ok
= True
;
2065 DEBUG(3, ("adding printer service %s\n", pszPrintername
));
2070 /***************************************************************************
2071 Map a parameter's string representation to something we can use.
2072 Returns False if the parameter string is not recognised, else TRUE.
2073 ***************************************************************************/
2074 static int map_parameter(char *pszParmName
)
2078 if (*pszParmName
== '-')
2081 for (iIndex
= 0; parm_table
[iIndex
].label
; iIndex
++)
2082 if (strwicmp(parm_table
[iIndex
].label
, pszParmName
) == 0)
2085 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName
));
2090 /***************************************************************************
2091 Set a boolean variable from the text value stored in the passed string.
2092 Returns True in success, False if the passed string does not correctly
2093 represent a boolean.
2094 ***************************************************************************/
2095 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
)
2100 if (strwicmp(pszParmValue
, "yes") == 0 ||
2101 strwicmp(pszParmValue
, "true") == 0 ||
2102 strwicmp(pszParmValue
, "1") == 0)
2105 if (strwicmp(pszParmValue
, "no") == 0 ||
2106 strwicmp(pszParmValue
, "False") == 0 ||
2107 strwicmp(pszParmValue
, "0") == 0)
2112 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
2119 /***************************************************************************
2120 Find a service by name. Otherwise works like get_service.
2121 ***************************************************************************/
2122 static int getservicebyname(char *pszServiceName
, service
* pserviceDest
)
2126 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
2127 if (VALID(iService
) &&
2128 strwicmp(ServicePtrs
[iService
]->szService
, pszServiceName
) == 0)
2130 if (pserviceDest
!= NULL
)
2131 copy_service(pserviceDest
, ServicePtrs
[iService
], NULL
);
2140 /***************************************************************************
2141 Copy a service structure to another
2143 If pcopymapDest is NULL then copy all fields
2144 ***************************************************************************/
2145 static void copy_service(service
* pserviceDest
,
2146 service
* pserviceSource
, BOOL
*pcopymapDest
)
2149 BOOL bcopyall
= (pcopymapDest
== NULL
);
2151 for (i
= 0; parm_table
[i
].label
; i
++)
2152 if (parm_table
[i
].ptr
&& parm_table
[i
].class == P_LOCAL
&&
2153 (bcopyall
|| pcopymapDest
[i
]))
2155 void *def_ptr
= parm_table
[i
].ptr
;
2157 ((char *)pserviceSource
) + PTR_DIFF(def_ptr
,
2160 ((char *)pserviceDest
) + PTR_DIFF(def_ptr
,
2163 switch (parm_table
[i
].type
)
2167 *(BOOL
*)dest_ptr
= *(BOOL
*)src_ptr
;
2173 *(int *)dest_ptr
= *(int *)src_ptr
;
2177 *(char *)dest_ptr
= *(char *)src_ptr
;
2181 string_set(dest_ptr
,
2186 string_set(dest_ptr
,
2188 strupper(*(char **)dest_ptr
);
2197 init_copymap(pserviceDest
);
2198 if (pserviceSource
->copymap
)
2199 memcpy((void *)pserviceDest
->copymap
,
2200 (void *)pserviceSource
->copymap
,
2201 sizeof(BOOL
) * NUMPARAMETERS
);
2205 /***************************************************************************
2206 Check a service for consistency. Return False if the service is in any way
2207 incomplete or faulty, else True.
2208 ***************************************************************************/
2209 static BOOL
service_ok(int iService
)
2214 if (ServicePtrs
[iService
]->szService
[0] == '\0')
2217 ("The following message indicates an internal error:\n"));
2218 DEBUG(0, ("No service name in service entry.\n"));
2222 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2223 /* I can't see why you'd want a non-printable printer service... */
2224 if (strwicmp(ServicePtrs
[iService
]->szService
, PRINTERS_NAME
) == 0) {
2225 if (!ServicePtrs
[iService
]->bPrint_ok
) {
2227 ("WARNING: [%s] service MUST be printable!\n",
2228 ServicePtrs
[iService
]->szService
));
2229 ServicePtrs
[iService
]->bPrint_ok
= True
;
2231 /* [printers] service must also be non-browsable. */
2232 if (ServicePtrs
[iService
]->bBrowseable
)
2233 ServicePtrs
[iService
]->bBrowseable
= False
;
2236 if (ServicePtrs
[iService
]->szPath
[0] == '\0' &&
2237 strwicmp(ServicePtrs
[iService
]->szService
, HOMES_NAME
) != 0)
2240 ("No path in service %s - using %s\n",
2241 ServicePtrs
[iService
]->szService
, tmpdir()));
2242 string_set(&ServicePtrs
[iService
]->szPath
, tmpdir());
2245 /* If a service is flagged unavailable, log the fact at level 0. */
2246 if (!ServicePtrs
[iService
]->bAvailable
)
2247 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2248 ServicePtrs
[iService
]->szService
));
2253 static struct file_lists
2255 struct file_lists
*next
;
2259 } *file_lists
= NULL
;
2261 /*******************************************************************
2262 keep a linked list of all config files so we know when one has changed
2263 it's date and needs to be reloaded
2264 ********************************************************************/
2265 static void add_to_file_list(char *fname
, char *subfname
)
2267 struct file_lists
*f
= file_lists
;
2270 if (f
->name
&& !strcmp(f
->name
, fname
))
2276 f
= (struct file_lists
*)malloc(sizeof(file_lists
[0]));
2279 f
->next
= file_lists
;
2280 f
->name
= strdup(fname
);
2285 f
->subfname
= strdup(subfname
);
2291 f
->modtime
= file_modtime(subfname
);
2293 time_t t
= file_modtime(subfname
);
2299 /*******************************************************************
2300 check if a config file has changed date
2301 ********************************************************************/
2302 BOOL
lp_file_list_changed(void)
2304 struct file_lists
*f
= file_lists
;
2305 DEBUG(6, ("lp_file_list_changed()\n"));
2311 pstrcpy(n2
, f
->name
);
2312 standard_sub_basic(n2
,sizeof(n2
));
2314 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2315 f
->name
, n2
, ctime(&f
->modtime
)));
2317 mod_time
= file_modtime(n2
);
2319 if (mod_time
&& ((f
->modtime
!= mod_time
) || (f
->subfname
== NULL
) || (strcmp(n2
, f
->subfname
) != 0))) {
2320 DEBUGADD(6, ("file %s modified: %s\n", n2
, ctime(&mod_time
)));
2321 f
->modtime
= mod_time
;
2322 SAFE_FREE(f
->subfname
);
2323 f
->subfname
= strdup(n2
);
2331 /***************************************************************************
2332 Run standard_sub_basic on netbios name... needed because global_myname
2333 is not accessed through any lp_ macro.
2334 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2335 ***************************************************************************/
2337 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
)
2339 pstring netbios_name
;
2341 pstrcpy(netbios_name
, pszParmValue
);
2343 standard_sub_basic(netbios_name
,sizeof(netbios_name
));
2344 strupper(netbios_name
);
2347 * Convert from UNIX to DOS string - the UNIX to DOS converter
2348 * isn't called on the special handlers.
2350 unix_to_dos(netbios_name
);
2351 pstrcpy(global_myname
, netbios_name
);
2354 ("handle_netbios_name: set global_myname to: %s\n",
2360 /***************************************************************************
2361 Do the work of sourcing in environment variable/value pairs.
2362 ***************************************************************************/
2364 static BOOL
source_env(char **lines
)
2371 for (i
= 0; lines
[i
]; i
++)
2373 char *line
= lines
[i
];
2375 if ((len
= strlen(line
)) == 0)
2378 if (line
[len
- 1] == '\n')
2381 if ((varval
= malloc(len
+ 1)) == NULL
)
2383 DEBUG(0, ("source_env: Not enough memory!\n"));
2387 DEBUG(4, ("source_env: Adding to environment: %s\n", line
));
2388 strncpy(varval
, line
, len
);
2391 p
= strchr(line
, (int)'=');
2394 DEBUG(4, ("source_env: missing '=': %s\n", line
));
2401 ("source_env: Failed to put environment variable %s\n",
2409 ("source_env: getting var %s = %s\n", line
,
2413 DEBUG(4, ("source_env: returning successfully\n"));
2417 /***************************************************************************
2418 Handle the source environment operation
2419 ***************************************************************************/
2421 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
)
2428 pstrcpy(fname
, pszParmValue
);
2430 standard_sub_basic(fname
,sizeof(fname
));
2432 string_set(ptr
, pszParmValue
);
2434 DEBUG(4, ("handle_source_env: checking env type\n"));
2437 * Filename starting with '|' means popen and read from stdin.
2442 lines
= file_lines_pload(p
+ 1, NULL
, True
);
2446 lines
= file_lines_load(fname
, NULL
, True
);
2452 ("handle_source_env: Failed to open file %s, Error was %s\n",
2453 fname
, strerror(errno
)));
2457 result
= source_env(lines
);
2458 file_lines_free(lines
);
2463 /***************************************************************************
2464 handle the interpretation of the vfs object parameter
2465 *************************************************************************/
2466 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
)
2468 /* Set string value */
2470 string_set(ptr
, pszParmValue
);
2472 /* Do any other initialisation required for vfs. Note that
2473 anything done here may have linking repercussions in nmbd. */
2478 /***************************************************************************
2479 handle the interpretation of the coding system parameter
2480 *************************************************************************/
2481 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
)
2483 string_set(ptr
, pszParmValue
);
2484 interpret_coding_system(pszParmValue
);
2488 /***************************************************************************
2489 Handle the interpretation of the character set system parameter.
2490 ***************************************************************************/
2492 static char *saved_character_set
= NULL
;
2494 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
)
2496 /* A dependency here is that the parameter client code page should be
2497 set before this is called.
2499 string_set(ptr
, pszParmValue
);
2501 saved_character_set
= strdup(*ptr
);
2502 interpret_character_set(*ptr
, lp_client_code_page());
2506 /***************************************************************************
2507 Handle the interpretation of the client code page parameter.
2508 We handle this separately so that we can reset the character set
2509 parameter in case this came before 'client code page' in the smb.conf.
2510 ***************************************************************************/
2512 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
)
2514 Globals
.client_code_page
= atoi(pszParmValue
);
2515 if (saved_character_set
!= NULL
)
2516 interpret_character_set(saved_character_set
,
2517 lp_client_code_page());
2518 codepage_initialise(lp_client_code_page());
2522 /***************************************************************************
2523 handle the valid chars lines
2524 ***************************************************************************/
2526 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
)
2528 string_set(ptr
, pszParmValue
);
2530 /* A dependency here is that the parameter client code page must be
2531 set before this is called - as calling codepage_initialise()
2532 would overwrite the valid char lines.
2534 codepage_initialise(lp_client_code_page());
2536 add_char_string(pszParmValue
);
2540 /***************************************************************************
2541 handle the include operation
2542 ***************************************************************************/
2544 static BOOL
handle_include(char *pszParmValue
, char **ptr
)
2547 pstrcpy(fname
, pszParmValue
);
2549 standard_sub_basic(fname
,sizeof(fname
));
2551 add_to_file_list(pszParmValue
, fname
);
2553 string_set(ptr
, fname
);
2555 if (file_exist(fname
, NULL
))
2556 return (pm_process(fname
, do_section
, do_parameter
));
2558 DEBUG(2, ("Can't find include file %s\n", fname
));
2564 /***************************************************************************
2565 handle the interpretation of the copy parameter
2566 ***************************************************************************/
2567 static BOOL
handle_copy(char *pszParmValue
, char **ptr
)
2571 service serviceTemp
;
2573 string_set(ptr
, pszParmValue
);
2575 init_service(&serviceTemp
);
2579 DEBUG(3, ("Copying service from service %s\n", pszParmValue
));
2581 if ((iTemp
= getservicebyname(pszParmValue
, &serviceTemp
)) >= 0)
2583 if (iTemp
== iServiceIndex
)
2586 ("Can't copy service %s - unable to copy self!\n",
2591 copy_service(ServicePtrs
[iServiceIndex
],
2593 ServicePtrs
[iServiceIndex
]->copymap
);
2599 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2604 free_service(&serviceTemp
);
2608 /***************************************************************************
2609 Handle winbind uid and gid allocation parameters. The format of these
2614 winbind uid = 1000-1999
2615 winbind gid = 700-899
2617 We only do simple parsing checks here. The strings are parsed into useful
2618 structures in the winbind daemon code.
2620 ***************************************************************************/
2622 /* Some lp_ routines to return winbind [ug]id information */
2624 static uid_t winbind_uid_low
, winbind_uid_high
;
2625 static gid_t winbind_gid_low
, winbind_gid_high
;
2627 BOOL
lp_winbind_uid(uid_t
*low
, uid_t
*high
)
2629 if (winbind_uid_low
== 0 || winbind_uid_high
== 0)
2633 *low
= winbind_uid_low
;
2636 *high
= winbind_uid_high
;
2641 BOOL
lp_winbind_gid(gid_t
*low
, gid_t
*high
)
2643 if (winbind_gid_low
== 0 || winbind_gid_high
== 0)
2647 *low
= winbind_gid_low
;
2650 *high
= winbind_gid_high
;
2655 /* Do some simple checks on "winbind [ug]id" parameter values */
2657 static BOOL
handle_winbind_uid(char *pszParmValue
, char **ptr
)
2659 unsigned int low
, high
;
2661 if (sscanf(pszParmValue
, "%u-%u", &low
, &high
) != 2 || high
< low
)
2666 string_set(ptr
, pszParmValue
);
2668 winbind_uid_low
= (uid_t
)low
;
2669 winbind_uid_high
= (uid_t
)high
;
2674 static BOOL
handle_winbind_gid(char *pszParmValue
, char **ptr
)
2676 unsigned int low
, high
;
2678 if (sscanf(pszParmValue
, "%u-%u", &low
, &high
) != 2 || high
< low
)
2683 string_set(ptr
, pszParmValue
);
2685 winbind_gid_low
= (gid_t
)low
;
2686 winbind_gid_high
= (gid_t
)high
;
2691 /***************************************************************************
2692 Handle the WINS SERVER list.
2693 ***************************************************************************/
2695 static BOOL
handle_wins_server_list( char *pszParmValue
, char **ptr
)
2697 if( !wins_srv_load_list( pszParmValue
) )
2698 return( False
); /* Parse failed. */
2700 string_set( ptr
, pszParmValue
);
2704 /***************************************************************************
2705 Handle the DEBUG level list.
2706 ***************************************************************************/
2708 static BOOL
handle_debug_list( char *pszParmValueIn
, char **ptr
)
2710 pstring pszParmValue
;
2712 pstrcpy(pszParmValue
, pszParmValueIn
);
2713 return debug_parse_levels( pszParmValue
);
2717 /***************************************************************************
2718 Initialise a copymap.
2719 ***************************************************************************/
2721 static void init_copymap(service
* pservice
)
2724 SAFE_FREE(pservice
->copymap
);
2725 pservice
->copymap
= (BOOL
*)malloc(sizeof(BOOL
) * NUMPARAMETERS
);
2726 if (!pservice
->copymap
)
2728 ("Couldn't allocate copymap!! (size %d)\n",
2729 (int)NUMPARAMETERS
));
2731 for (i
= 0; i
< NUMPARAMETERS
; i
++)
2732 pservice
->copymap
[i
] = True
;
2736 /***************************************************************************
2737 return the local pointer to a parameter given the service number and the
2738 pointer into the default structure
2739 ***************************************************************************/
2740 void *lp_local_ptr(int snum
, void *ptr
)
2742 return (void *)(((char *)ServicePtrs
[snum
]) + PTR_DIFF(ptr
, &sDefault
));
2745 /***************************************************************************
2746 Process a parameter for a particular service number. If snum < 0
2747 then assume we are in the globals
2748 ***************************************************************************/
2749 BOOL
lp_do_parameter(int snum
, char *pszParmName
, char *pszParmValue
)
2752 void *parm_ptr
= NULL
; /* where we are going to store the result */
2753 void *def_ptr
= NULL
;
2755 parmnum
= map_parameter(pszParmName
);
2760 ("Ignoring unknown parameter \"%s\"\n", pszParmName
));
2764 if (parm_table
[parmnum
].flags
& FLAG_DEPRECATED
)
2766 DEBUG(0, ("WARNING: The \"%s\"option is deprecated\n",
2770 def_ptr
= parm_table
[parmnum
].ptr
;
2772 /* we might point at a service, the default service or a global */
2779 if (parm_table
[parmnum
].class == P_GLOBAL
)
2782 ("Global parameter %s found in service section!\n",
2787 ((char *)ServicePtrs
[snum
]) + PTR_DIFF(def_ptr
,
2793 if (!ServicePtrs
[snum
]->copymap
)
2794 init_copymap(ServicePtrs
[snum
]);
2796 /* this handles the aliases - set the copymap for other entries with
2797 the same data pointer */
2798 for (i
= 0; parm_table
[i
].label
; i
++)
2799 if (parm_table
[i
].ptr
== parm_table
[parmnum
].ptr
)
2800 ServicePtrs
[snum
]->copymap
[i
] = False
;
2803 /* if it is a special case then go ahead */
2804 if (parm_table
[parmnum
].special
)
2806 parm_table
[parmnum
].special(pszParmValue
, (char **)parm_ptr
);
2810 /* now switch on the type of variable it is */
2811 switch (parm_table
[parmnum
].type
)
2814 set_boolean(parm_ptr
, pszParmValue
);
2818 set_boolean(parm_ptr
, pszParmValue
);
2819 *(BOOL
*)parm_ptr
= !*(BOOL
*)parm_ptr
;
2823 *(int *)parm_ptr
= atoi(pszParmValue
);
2827 *(char *)parm_ptr
= *pszParmValue
;
2831 sscanf(pszParmValue
, "%o", (int *)parm_ptr
);
2835 string_set(parm_ptr
, pszParmValue
);
2836 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2837 unix_to_dos(*(char **)parm_ptr
);
2841 string_set(parm_ptr
, pszParmValue
);
2842 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2843 unix_to_dos(*(char **)parm_ptr
);
2844 strupper(*(char **)parm_ptr
);
2848 pstrcpy((char *)parm_ptr
, pszParmValue
);
2849 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2850 unix_to_dos((char *)parm_ptr
);
2854 pstrcpy((char *)parm_ptr
, pszParmValue
);
2855 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2856 unix_to_dos((char *)parm_ptr
);
2857 strupper((char *)parm_ptr
);
2861 for (i
= 0; parm_table
[parmnum
].enum_list
[i
].name
;
2866 parm_table
[parmnum
].enum_list
[i
].name
))
2869 parm_table
[parmnum
].
2883 /***************************************************************************
2884 Process a parameter.
2885 ***************************************************************************/
2886 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
)
2888 if (!bInGlobalSection
&& bGlobalOnly
)
2891 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName
, pszParmValue
));
2893 return (lp_do_parameter(bInGlobalSection
? -2 : iServiceIndex
,
2894 pszParmName
, pszParmValue
));
2898 /***************************************************************************
2899 print a parameter of the specified type
2900 ***************************************************************************/
2901 static void print_parameter(struct parm_struct
*p
, void *ptr
, FILE * f
, char *(*dos_to_ext
)(const char *))
2907 for (i
= 0; p
->enum_list
[i
].name
; i
++)
2909 if (*(int *)ptr
== p
->enum_list
[i
].value
)
2912 p
->enum_list
[i
].name
);
2919 fprintf(f
, "%s", BOOLSTR(*(BOOL
*)ptr
));
2923 fprintf(f
, "%s", BOOLSTR(!*(BOOL
*)ptr
));
2927 fprintf(f
, "%d", *(int *)ptr
);
2928 if (strequal(p
->label
,"log level")) {
2929 for (i
= 1; i
< DBGC_LAST
; i
++) {
2930 if (((int *)ptr
)[i
])
2931 fprintf(f
, ",%s:%d",debug_classname_from_index(i
),((int *)ptr
)[i
]);
2937 fprintf(f
, "%c", *(char *)ptr
);
2941 fprintf(f
, "%s", octal_string(*(int *)ptr
));
2947 if (p
->flags
& FLAG_DOS_STRING
)
2948 fprintf(f
, "%s", dos_to_ext((const char *)ptr
));
2950 fprintf(f
, "%s", (char *)ptr
);
2956 if (*(char **)ptr
) {
2957 if(p
->flags
& FLAG_DOS_STRING
)
2958 fprintf(f
,"%s",dos_to_ext((const char *)*(const char **)ptr
));
2960 fprintf(f
, "%s", *(char **)ptr
);
2969 /***************************************************************************
2970 check if two parameters are equal
2971 ***************************************************************************/
2972 static BOOL
equal_parameter(parm_type type
, void *ptr1
, void *ptr2
)
2978 return (*((BOOL
*)ptr1
) == *((BOOL
*)ptr2
));
2983 return (*((int *)ptr1
) == *((int *)ptr2
));
2986 return (*((char *)ptr1
) == *((char *)ptr2
));
2991 char *p1
= (char *)ptr1
, *p2
= (char *)ptr2
;
2996 return (p1
== p2
|| strequal(p1
, p2
));
3001 char *p1
= *(char **)ptr1
, *p2
= *(char **)ptr2
;
3006 return (p1
== p2
|| strequal(p1
, p2
));
3014 /***************************************************************************
3015 Initialize any local varients in the sDefault table.
3016 ***************************************************************************/
3018 void init_locals(void)
3023 /***************************************************************************
3024 Process a new section (service). At this stage all sections are services.
3025 Later we'll have special sections that permit server parameters to be set.
3026 Returns True on success, False on failure. SectionName must be in DOS codepage.
3027 ***************************************************************************/
3028 static BOOL
do_section(char *pszSectionName
)
3031 BOOL isglobal
= ((strwicmp(pszSectionName
, GLOBAL_NAME
) == 0) ||
3032 (strwicmp(pszSectionName
, GLOBAL_NAME2
) == 0));
3035 /* if we were in a global section then do the local inits */
3036 if (bInGlobalSection
&& !isglobal
)
3039 /* if we've just struck a global section, note the fact. */
3040 bInGlobalSection
= isglobal
;
3042 /* check for multiple global sections */
3043 if (bInGlobalSection
)
3045 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName
));
3049 if (!bInGlobalSection
&& bGlobalOnly
)
3052 /* if we have a current service, tidy it up before moving on */
3055 if (iServiceIndex
>= 0)
3056 bRetval
= service_ok(iServiceIndex
);
3058 /* if all is still well, move to the next record in the services array */
3061 /* We put this here to avoid an odd message order if messages are */
3062 /* issued by the post-processing of a previous section. */
3063 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName
));
3065 if ((iServiceIndex
= add_a_service(&sDefault
, pszSectionName
))
3068 DEBUG(0, ("Failed to add a new service\n"));
3077 /***************************************************************************
3078 determine if a partcular base parameter is currently set to the default value.
3079 ***************************************************************************/
3080 static BOOL
is_default(int i
)
3082 if (!defaults_saved
)
3084 switch (parm_table
[i
].type
)
3088 return strequal(parm_table
[i
].def
.svalue
,
3089 *(char **)parm_table
[i
].ptr
);
3092 return strequal(parm_table
[i
].def
.svalue
,
3093 (char *)parm_table
[i
].ptr
);
3096 return parm_table
[i
].def
.bvalue
==
3097 *(BOOL
*)parm_table
[i
].ptr
;
3099 return parm_table
[i
].def
.cvalue
==
3100 *(char *)parm_table
[i
].ptr
;
3104 return parm_table
[i
].def
.ivalue
==
3105 *(int *)parm_table
[i
].ptr
;
3113 /***************************************************************************
3114 Display the contents of the global structure.
3115 ***************************************************************************/
3116 static void dump_globals(FILE *f
, char *(*dos_to_ext
)(const char *))
3119 fprintf(f
, "# Global parameters\n[global]\n");
3121 for (i
= 0; parm_table
[i
].label
; i
++)
3122 if (parm_table
[i
].class == P_GLOBAL
&&
3123 parm_table
[i
].ptr
&&
3124 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
3126 if (defaults_saved
&& is_default(i
))
3128 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
3129 print_parameter(&parm_table
[i
], parm_table
[i
].ptr
, f
, dos_to_ext
);
3134 /***************************************************************************
3135 return True if a local parameter is currently set to the global default
3136 ***************************************************************************/
3137 BOOL
lp_is_default(int snum
, struct parm_struct
*parm
)
3139 int pdiff
= PTR_DIFF(parm
->ptr
, &sDefault
);
3141 return equal_parameter(parm
->type
,
3142 ((char *)ServicePtrs
[snum
]) + pdiff
,
3143 ((char *)&sDefault
) + pdiff
);
3147 /***************************************************************************
3148 Display the contents of a single services record.
3149 ***************************************************************************/
3150 static void dump_a_service(service
* pService
, FILE * f
, char *(*dos_to_ext
)(const char *))
3153 if (pService
!= &sDefault
)
3154 fprintf(f
, "\n[%s]\n", pService
->szService
);
3156 for (i
= 0; parm_table
[i
].label
; i
++)
3157 if (parm_table
[i
].class == P_LOCAL
&&
3158 parm_table
[i
].ptr
&&
3159 (*parm_table
[i
].label
!= '-') &&
3160 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
3162 int pdiff
= PTR_DIFF(parm_table
[i
].ptr
, &sDefault
);
3164 if (pService
== &sDefault
)
3166 if (defaults_saved
&& is_default(i
))
3171 if (equal_parameter(parm_table
[i
].type
,
3172 ((char *)pService
) +
3174 ((char *)&sDefault
) +
3179 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
3180 print_parameter(&parm_table
[i
],
3181 ((char *)pService
) + pdiff
, f
, dos_to_ext
);
3187 /***************************************************************************
3188 return info about the next service in a service. snum==-1 gives the globals
3190 return NULL when out of parameters
3191 ***************************************************************************/
3192 struct parm_struct
*lp_next_parameter(int snum
, int *i
, int allparameters
)
3196 /* do the globals */
3197 for (; parm_table
[*i
].label
; (*i
)++)
3199 if (parm_table
[*i
].class == P_SEPARATOR
)
3200 return &parm_table
[(*i
)++];
3202 if (!parm_table
[*i
].ptr
3203 || (*parm_table
[*i
].label
== '-'))
3207 && (parm_table
[*i
].ptr
==
3208 parm_table
[(*i
) - 1].ptr
))
3211 return &parm_table
[(*i
)++];
3216 service
*pService
= ServicePtrs
[snum
];
3218 for (; parm_table
[*i
].label
; (*i
)++)
3220 if (parm_table
[*i
].class == P_SEPARATOR
)
3221 return &parm_table
[(*i
)++];
3223 if (parm_table
[*i
].class == P_LOCAL
&&
3224 parm_table
[*i
].ptr
&&
3225 (*parm_table
[*i
].label
!= '-') &&
3227 (parm_table
[*i
].ptr
!=
3228 parm_table
[(*i
) - 1].ptr
)))
3231 PTR_DIFF(parm_table
[*i
].ptr
,
3234 if (allparameters
||
3235 !equal_parameter(parm_table
[*i
].type
,
3236 ((char *)pService
) +
3238 ((char *)&sDefault
) +
3241 return &parm_table
[(*i
)++];
3252 /***************************************************************************
3253 Display the contents of a single copy structure.
3254 ***************************************************************************/
3255 static void dump_copy_map(BOOL
*pcopymap
)
3261 printf("\n\tNon-Copied parameters:\n");
3263 for (i
= 0; parm_table
[i
].label
; i
++)
3264 if (parm_table
[i
].class == P_LOCAL
&&
3265 parm_table
[i
].ptr
&& !pcopymap
[i
] &&
3266 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
3268 printf("\t\t%s\n", parm_table
[i
].label
);
3273 /***************************************************************************
3274 Return TRUE if the passed service number is within range.
3275 ***************************************************************************/
3277 BOOL
lp_snum_ok(int iService
)
3279 return (LP_SNUM_OK(iService
) && ServicePtrs
[iService
]->bAvailable
);
3282 /***************************************************************************
3283 Auto-load some home services.
3284 ***************************************************************************/
3286 static void lp_add_auto_services(char *str
)
3299 homes
= lp_servicenumber(HOMES_NAME
);
3301 for (p
= strtok(s
, LIST_SEP
); p
; p
= strtok(NULL
, LIST_SEP
)) {
3302 char *home
= get_user_service_home_dir(p
);
3304 if (lp_servicenumber(p
) >= 0)
3307 if (home
&& homes
>= 0)
3308 lp_add_home(p
, homes
, home
);
3313 /***************************************************************************
3314 Auto-load one printer.
3315 ***************************************************************************/
3317 void lp_add_one_printer(char *name
, char *comment
)
3319 int printers
= lp_servicenumber(PRINTERS_NAME
);
3322 if (lp_servicenumber(name
) < 0) {
3323 lp_add_printer(name
, printers
);
3324 if ((i
= lp_servicenumber(name
)) >= 0) {
3325 string_set(&ServicePtrs
[i
]->comment
, comment
);
3326 unix_to_dos(ServicePtrs
[i
]->comment
);
3327 ServicePtrs
[i
]->autoloaded
= True
;
3332 /***************************************************************************
3333 have we loaded a services file yet?
3334 ***************************************************************************/
3335 BOOL
lp_loaded(void)
3340 /***************************************************************************
3341 unload unused services
3342 ***************************************************************************/
3343 void lp_killunused(BOOL (*snumused
) (int))
3346 for (i
= 0; i
< iNumServices
; i
++)
3351 if (!snumused
|| !snumused(i
))
3353 ServicePtrs
[i
]->valid
= False
;
3354 free_service(ServicePtrs
[i
]);
3360 /***************************************************************************
3362 ***************************************************************************/
3363 void lp_killservice(int iServiceIn
)
3365 if (VALID(iServiceIn
))
3367 ServicePtrs
[iServiceIn
]->valid
= False
;
3368 free_service(ServicePtrs
[iServiceIn
]);
3372 /***************************************************************************
3373 save the curent values of all global and sDefault parameters into the
3374 defaults union. This allows swat and testparm to show only the
3375 changed (ie. non-default) parameters.
3376 ***************************************************************************/
3377 static void lp_save_defaults(void)
3380 for (i
= 0; parm_table
[i
].label
; i
++)
3382 if (i
> 0 && parm_table
[i
].ptr
== parm_table
[i
- 1].ptr
)
3384 switch (parm_table
[i
].type
)
3388 parm_table
[i
].def
.svalue
=
3389 strdup(*(char **)parm_table
[i
].ptr
);
3393 parm_table
[i
].def
.svalue
=
3394 strdup((char *)parm_table
[i
].ptr
);
3398 parm_table
[i
].def
.bvalue
=
3399 *(BOOL
*)parm_table
[i
].ptr
;
3402 parm_table
[i
].def
.cvalue
=
3403 *(char *)parm_table
[i
].ptr
;
3408 parm_table
[i
].def
.ivalue
=
3409 *(int *)parm_table
[i
].ptr
;
3415 defaults_saved
= True
;
3418 /*******************************************************************
3419 Set the server type we will announce as via nmbd.
3420 ********************************************************************/
3421 static void set_server_role(void)
3423 server_role
= ROLE_STANDALONE
;
3425 switch (lp_security()) {
3427 if (lp_domain_logons())
3428 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
3429 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3433 if (lp_domain_logons()) {
3434 server_role
= ROLE_DOMAIN_BDC
;
3435 DEBUG(10,("set_server_role: ROLE_DOMAIN_BDC\n"));
3438 server_role
= ROLE_DOMAIN_MEMBER
;
3439 DEBUG(10,("set_server_role: ROLE_DOMAIN_MEMBER\n"));
3442 if (lp_domain_logons()) {
3443 server_role
= ROLE_DOMAIN_PDC
;
3444 DEBUG(10,("set_server_role: ROLE_DOMAIN_PDC\n"));
3447 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3450 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
3451 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3457 /***************************************************************************
3458 Load the services array from the services file. Return True on success,
3460 ***************************************************************************/
3461 BOOL
lp_load(char *pszFname
, BOOL global_only
, BOOL save_defaults
,
3467 pstrcpy(n2
, pszFname
);
3468 standard_sub_basic(n2
,sizeof(n2
));
3470 add_to_file_list(pszFname
, n2
);
3474 bInGlobalSection
= True
;
3475 bGlobalOnly
= global_only
;
3485 pstrcpy(n2
, pszFname
);
3486 standard_sub_basic(n2
,sizeof(n2
));
3488 /* We get sections first, so have to start 'behind' to make up */
3490 bRetval
= pm_process(n2
, do_section
, do_parameter
);
3492 /* finish up the last section */
3493 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval
)));
3495 if (iServiceIndex
>= 0)
3496 bRetval
= service_ok(iServiceIndex
);
3498 lp_add_auto_services(lp_auto_services());
3501 lp_add_ipc("IPC$", True
);
3502 lp_add_ipc("ADMIN$", False
);
3506 set_default_server_announce_type();
3510 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3511 /* if bWINSsupport is true and we are in the client */
3513 if (in_client
&& Globals
.bWINSsupport
)
3516 string_set(&Globals
.szWINSserver
, "127.0.0.1");
3524 /***************************************************************************
3525 reset the max number of services
3526 ***************************************************************************/
3527 void lp_resetnumservices(void)
3532 /***************************************************************************
3533 return the max number of services
3534 ***************************************************************************/
3535 int lp_numservices(void)
3537 return (iNumServices
);
3540 /***************************************************************************
3541 Display the contents of the services array in human-readable form.
3542 ***************************************************************************/
3543 void lp_dump(FILE *f
, BOOL show_defaults
, int maxtoprint
, char *(*dos_to_ext
)(const char *))
3549 defaults_saved
= False
;
3552 dump_globals(f
, dos_to_ext
);
3554 dump_a_service(&sDefault
, f
, dos_to_ext
);
3556 for (iService
= 0; iService
< maxtoprint
; iService
++)
3557 lp_dump_one(f
, show_defaults
, iService
, dos_to_ext
);
3560 /***************************************************************************
3561 Display the contents of one service in human-readable form.
3562 ***************************************************************************/
3563 void lp_dump_one(FILE * f
, BOOL show_defaults
, int snum
, char *(*dos_to_ext
)(const char *))
3567 if (ServicePtrs
[snum
]->szService
[0] == '\0')
3569 dump_a_service(ServicePtrs
[snum
], f
, dos_to_ext
);
3574 /***************************************************************************
3575 Return the number of the service with the given name, or -1 if it doesn't
3576 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3577 getservicebyname()! This works ONLY if all services have been loaded, and
3578 does not copy the found service.
3579 ***************************************************************************/
3580 int lp_servicenumber(char *pszServiceName
)
3583 fstring serviceName
;
3586 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
3588 if (VALID(iService
) && ServicePtrs
[iService
]->szService
)
3591 * The substitution here is used to support %U is
3594 fstrcpy(serviceName
, ServicePtrs
[iService
]->szService
);
3595 standard_sub_basic(serviceName
,sizeof(serviceName
));
3596 if (strequal(serviceName
, pszServiceName
))
3602 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName
));
3607 /*******************************************************************
3608 A useful volume label function. Returns a string in DOS codepage.
3609 ********************************************************************/
3611 char *volume_label(int snum
)
3613 char *ret
= lp_volume(snum
);
3615 return lp_servicename(snum
);
3620 /*******************************************************************
3621 Set the server type we will announce as via nmbd.
3622 ********************************************************************/
3623 static void set_default_server_announce_type(void)
3625 default_server_announce
= 0;
3626 default_server_announce
|= SV_TYPE_WORKSTATION
;
3627 default_server_announce
|= SV_TYPE_SERVER
;
3628 default_server_announce
|= SV_TYPE_SERVER_UNIX
;
3629 default_server_announce
|= SV_TYPE_PRINTQ_SERVER
;
3631 switch (lp_announce_as())
3633 case ANNOUNCE_AS_NT_SERVER
:
3635 default_server_announce
|= SV_TYPE_SERVER_NT
;
3636 /* fall through... */
3638 case ANNOUNCE_AS_NT_WORKSTATION
:
3640 default_server_announce
|= SV_TYPE_NT
;
3643 case ANNOUNCE_AS_WIN95
:
3645 default_server_announce
|= SV_TYPE_WIN95_PLUS
;
3648 case ANNOUNCE_AS_WFW
:
3650 default_server_announce
|= SV_TYPE_WFW
;
3659 switch (lp_server_role())
3661 case ROLE_DOMAIN_MEMBER
:
3663 default_server_announce
|= SV_TYPE_DOMAIN_MEMBER
;
3666 case ROLE_DOMAIN_PDC
:
3668 default_server_announce
|= SV_TYPE_DOMAIN_CTRL
;
3671 case ROLE_DOMAIN_BDC
:
3673 default_server_announce
|= SV_TYPE_DOMAIN_BAKCTRL
;
3676 case ROLE_STANDALONE
:
3683 if (lp_time_server())
3685 default_server_announce
|= SV_TYPE_TIME_SOURCE
;
3688 if (lp_host_msdfs())
3690 default_server_announce
|= SV_TYPE_DFS_SERVER
;
3694 /***********************************************************
3695 returns role of Samba server
3696 ************************************************************/
3698 int lp_server_role(void)
3703 /***********************************************************
3704 If we are PDC then prefer us as DMB
3705 ************************************************************/
3707 BOOL
lp_domain_master(void)
3709 if (Globals
.bDomainMaster
== Auto
)
3711 return (lp_server_role() == ROLE_DOMAIN_PDC
);
3714 return Globals
.bDomainMaster
;
3717 /***********************************************************
3718 If we are DMB then prefer us as LMB
3719 ************************************************************/
3721 BOOL
lp_preferred_master(void)
3723 if (Globals
.bPreferredMaster
== Auto
)
3725 return (lp_local_master() && lp_domain_master());
3728 return Globals
.bPreferredMaster
;
3733 /*******************************************************************
3735 ********************************************************************/
3736 void lp_remove_service(int snum
)
3738 ServicePtrs
[snum
]->valid
= False
;
3741 /*******************************************************************
3742 copy a service. new_name must be in dos codepage
3743 ********************************************************************/
3744 void lp_copy_service(int snum
, char *new_name
)
3746 char *oldname
= lp_servicename(snum
);
3747 do_section(new_name
);
3750 snum
= lp_servicenumber(new_name
);
3752 lp_do_parameter(snum
, "copy", oldname
);
3757 /*******************************************************************
3758 Get the default server type we will announce as via nmbd.
3759 ********************************************************************/
3760 int lp_default_server_announce(void)
3762 return default_server_announce
;
3765 /*******************************************************************
3766 Split the announce version into major and minor numbers.
3767 ********************************************************************/
3768 int lp_major_announce_version(void)
3770 static BOOL got_major
= False
;
3771 static int major_version
= DEFAULT_MAJOR_VERSION
;
3776 return major_version
;
3779 if ((vers
= lp_announce_version()) == NULL
)
3780 return major_version
;
3782 if ((p
= strchr(vers
, '.')) == 0)
3783 return major_version
;
3786 major_version
= atoi(vers
);
3787 return major_version
;
3790 int lp_minor_announce_version(void)
3792 static BOOL got_minor
= False
;
3793 static int minor_version
= DEFAULT_MINOR_VERSION
;
3798 return minor_version
;
3801 if ((vers
= lp_announce_version()) == NULL
)
3802 return minor_version
;
3804 if ((p
= strchr(vers
, '.')) == 0)
3805 return minor_version
;
3808 minor_version
= atoi(p
);
3809 return minor_version
;
3812 /***********************************************************
3813 Set the global name resolution order (used in smbclient).
3814 ************************************************************/
3816 void lp_set_name_resolve_order(char *new_order
)
3818 Globals
.szNameResolveOrder
= new_order
;
3821 char *lp_printername(int snum
)
3823 char *ret
= _lp_printername(snum
);
3824 if (ret
== NULL
|| (ret
!= NULL
&& *ret
== '\0'))
3825 ret
= lp_servicename(snum
);
3830 /***********************************************************
3831 Return a pointer to the private directory (containing
3833 ************************************************************/
3835 void get_private_directory(pstring priv_dir
)
3842 pstrcpy(priv_dir
, lp_tdb_passwd_file());
3844 pstrcpy(priv_dir
, lp_smb_passwd_file());
3847 p
= strrchr(priv_dir
, '/');
3851 /***********************************************************
3852 Allow daemons such as winbindd to fix their logfile name.
3853 ************************************************************/
3855 void lp_set_logfile(const char *name
)
3857 extern pstring debugf
;
3858 string_set(&Globals
.szLogFile
, name
);
3859 pstrcpy(debugf
, name
);
3862 /*******************************************************************
3863 Return the NetBIOS called name.
3864 ********************************************************************/
3866 const char *get_called_name(void)
3868 extern fstring local_machine
;
3869 static fstring called_name
;
3871 if (! *local_machine
)
3872 return global_myname
;
3875 * Windows NT/2k uses "*SMBSERVER" and XP uses "*SMBSERV"
3876 * arrggg!!! but we've already rewritten the client's
3877 * netbios name at this point...
3880 if (*local_machine
) {
3881 if (!StrCaseCmp(local_machine
, "_SMBSERVER") || !StrCaseCmp(local_machine
, "_SMBSERV")) {
3882 fstrcpy(called_name
, get_my_primary_ip());
3883 DEBUG(8,("get_called_name: assuming that client used IP address [%s] as called name.\n",
3889 return local_machine
;
3892 /*******************************************************************
3893 Return the max print jobs per queue.
3894 ********************************************************************/
3896 int lp_maxprintjobs(int snum
)
3898 int maxjobs
= LP_SNUM_OK(snum
) ? ServicePtrs
[snum
]->iMaxPrintJobs
: sDefault
.iMaxPrintJobs
;
3899 if (maxjobs
<= 0 || maxjobs
>= PRINT_MAX_JOBID
)
3900 maxjobs
= PRINT_MAX_JOBID
- 1;