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
;
192 int iMaxSmbdProcesses
;
193 BOOL bDisableSpoolss
;
197 int enhanced_browsing
;
204 int client_code_page
;
205 int announce_as
; /* This is initialised in init_globals */
206 int machine_password_timeout
;
207 int change_notify_timeout
;
210 int min_passwd_length
;
211 int oplock_break_wait_time
;
212 int winbind_cache_time
;
222 #endif /* WITH_LDAP */
226 char *sslHostsRequire
;
227 char *sslHostsResign
;
231 char *sslServerPrivKey
;
233 char *sslClientPrivKey
;
236 char *sslEntropyFile
;
239 BOOL sslReqClientCert
;
240 BOOL sslReqServerCert
;
241 BOOL sslCompatibility
;
242 #endif /* WITH_SSL */
243 BOOL bMsAddPrinterWizard
;
248 BOOL bPreferredMaster
;
251 BOOL bEncryptPasswords
;
255 BOOL bObeyPamRestrictions
;
258 BOOL bLargeReadwrite
;
261 BOOL bReadPrediction
;
268 BOOL bBindInterfacesOnly
;
269 BOOL bPamPasswordChange
;
270 BOOL bUnixPasswdSync
;
271 BOOL bPasswdChatDebug
;
275 BOOL bNTStatusSupport
;
278 BOOL bAllowTrustedDomains
;
279 BOOL bRestrictAnonymous
;
281 BOOL bDebugHiresTimestamp
;
285 BOOL bHideLocalUsers
;
287 BOOL bUnixExtensions
;
288 int name_cache_timeout
;
292 static global Globals
;
297 * This structure describes a single service.
306 char *szGuestaccount
;
307 char *szInvalidUsers
;
315 char *szRootPostExec
;
316 char *szPrintcommand
;
319 char *szLppausecommand
;
320 char *szLpresumecommand
;
321 char *szQueuepausecommand
;
322 char *szQueueresumecommand
;
324 char *szPrinterDriver
;
325 char *szPrinterDriverLocation
;
335 char *szVetoOplockFiles
;
344 char *szVfsObjectFile
;
350 int iCreate_force_mode
;
352 int iSecurity_force_mode
;
355 int iDir_Security_mask
;
356 int iDir_Security_force_mode
;
360 int iOplockContentionLimit
;
365 BOOL bRootpreexecClose
;
368 BOOL bShortCasePreserve
;
372 BOOL bHideUnReadable
;
395 BOOL bStrictAllocate
;
399 BOOL bDeleteReadonly
;
401 BOOL bDeleteVetoFiles
;
404 BOOL bDosFiletimeResolution
;
405 BOOL bFakeDirCreateTimes
;
410 BOOL bUseClientDriver
;
411 BOOL bDefaultDevmode
;
413 BOOL bForceUnknownAclUser
;
419 char dummy
[3]; /* for alignment */
424 /* This is a default service used to prime a services structure */
425 static service sDefault
= {
427 False
, /* not autoloaded */
428 NULL
, /* szService */
430 NULL
, /* szUsername */
431 NULL
, /* szGuestAccount - this is set in init_globals() */
432 NULL
, /* szInvalidUsers */
433 NULL
, /* szValidUsers */
434 NULL
, /* szAdminUsers */
436 NULL
, /* szInclude */
437 NULL
, /* szPreExec */
438 NULL
, /* szPostExec */
439 NULL
, /* szRootPreExec */
440 NULL
, /* szRootPostExec */
441 NULL
, /* szPrintcommand */
442 NULL
, /* szLpqcommand */
443 NULL
, /* szLprmcommand */
444 NULL
, /* szLppausecommand */
445 NULL
, /* szLpresumecommand */
446 NULL
, /* szQueuepausecommand */
447 NULL
, /* szQueueresumecommand */
448 NULL
, /* szPrintername */
449 NULL
, /* szPrinterDriver - this is set in init_globals() */
450 NULL
, /* szPrinterDriverLocation */
451 NULL
, /* szDriverFile */
452 NULL
, /* szDontdescend */
453 NULL
, /* szHostsallow */
454 NULL
, /* szHostsdeny */
455 NULL
, /* szMagicScript */
456 NULL
, /* szMagicOutput */
457 NULL
, /* szMangledMap */
458 NULL
, /* szVetoFiles */
459 NULL
, /* szHideFiles */
460 NULL
, /* szVetoOplockFiles */
462 NULL
, /* force user */
463 NULL
, /* force group */
465 NULL
, /* writelist */
466 NULL
, /* printer admin */
469 NULL
, /* vfs object */
470 NULL
, /* vfs options */
471 0, /* iMinPrintSpace */
472 1000, /* iMaxPrintJobs */
473 0, /* iWriteCacheSize */
474 0744, /* iCreate_mask */
475 0000, /* iCreate_force_mode */
476 0777, /* iSecurity_mask */
477 0, /* iSecurity_force_mode */
478 0755, /* iDir_mask */
479 0000, /* iDir_force_mode */
480 0777, /* iDir_Security_mask */
481 0, /* iDir_Security_force_mode */
482 0, /* iMaxConnections */
483 CASE_LOWER
, /* iDefaultCase */
484 DEFAULT_PRINTING
, /* iPrinting */
485 2, /* iOplockContentionLimit */
487 1024, /* iBlock_size */
488 False
, /* bAlternatePerm */
489 False
, /* bPreexecClose */
490 False
, /* bRootpreexecClose */
491 False
, /* case sensitive */
492 True
, /* case preserve */
493 True
, /* short case preserve */
494 False
, /* case mangle */
496 True
, /* bHideDotFiles */
497 False
, /* bHideUnReadable */
498 True
, /* bBrowseable */
499 True
, /* bAvailable */
500 True
, /* bRead_only */
501 True
, /* bNo_set_dir */
502 False
, /* bGuest_only */
503 False
, /* bGuest_ok */
504 False
, /* bPrint_ok */
505 False
, /* bPostscript */
506 False
, /* bMap_system */
507 False
, /* bMap_hidden */
508 True
, /* bMap_archive */
510 False
, /* bStrictLocking */
511 True
, /* bPosixLocking */
512 True
, /* bShareModes */
514 True
, /* bLevel2OpLocks */
515 False
, /* bOnlyUser */
516 True
, /* bMangledNames */
517 True
, /* bWidelinks */
518 True
, /* bSymlinks */
519 False
, /* bSyncAlways */
520 False
, /* bStrictAllocate */
521 False
, /* bStrictSync */
522 '~', /* magic char */
524 False
, /* bDeleteReadonly */
525 False
, /* bFakeOplocks */
526 False
, /* bDeleteVetoFiles */
527 False
, /* bDosFilemode */
528 False
, /* bDosFiletimes */
529 False
, /* bDosFiletimeResolution */
530 False
, /* bFakeDirCreateTimes */
531 True
, /* bBlockingLocks */
532 False
, /* bInheritPerms */
533 False
, /* bInheritACLS */
534 False
, /* bMSDfsRoot */
535 False
, /* bUseClientDriver */
536 False
, /* bDefaultDevmode */
537 True
, /* bNTAclSupport */
538 False
, /* bForceUnknownAclUser */
540 False
, /* bUseSendfile */
542 False
, /* bProfileAcls */
547 /* local variables */
548 static service
**ServicePtrs
= NULL
;
549 static int iNumServices
= 0;
550 static int iServiceIndex
= 0;
551 static BOOL bInGlobalSection
= True
;
552 static BOOL bGlobalOnly
= False
;
553 static int server_role
;
554 static int default_server_announce
;
556 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
558 /* prototypes for the special type handlers */
559 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
);
560 static BOOL
handle_include(char *pszParmValue
, char **ptr
);
561 static BOOL
handle_copy(char *pszParmValue
, char **ptr
);
562 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
);
563 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
);
564 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
);
565 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
);
566 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
);
567 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
);
568 static BOOL
handle_winbind_uid(char *pszParmValue
, char **ptr
);
569 static BOOL
handle_winbind_gid(char *pszParmValue
, char **ptr
);
570 static BOOL
handle_wins_server_list(char *pszParmValue
, char **ptr
);
571 static BOOL
handle_debug_list( char *pszParmValue
, char **ptr
);
573 static void set_server_role(void);
574 static void set_default_server_announce_type(void);
576 static struct enum_list enum_protocol
[] = {
577 {PROTOCOL_NT1
, "NT1"},
578 {PROTOCOL_LANMAN2
, "LANMAN2"},
579 {PROTOCOL_LANMAN1
, "LANMAN1"},
580 {PROTOCOL_CORE
, "CORE"},
581 {PROTOCOL_COREPLUS
, "COREPLUS"},
582 {PROTOCOL_COREPLUS
, "CORE+"},
586 static struct enum_list enum_security
[] = {
587 {SEC_SHARE
, "SHARE"},
589 {SEC_SERVER
, "SERVER"},
590 {SEC_DOMAIN
, "DOMAIN"},
594 static struct enum_list enum_printing
[] = {
595 {PRINT_SYSV
, "sysv"},
597 {PRINT_HPUX
, "hpux"},
601 {PRINT_LPRNG
, "lprng"},
602 {PRINT_SOFTQ
, "softq"},
603 {PRINT_CUPS
, "cups"},
605 {PRINT_LPROS2
, "os2"},
607 {PRINT_TEST
, "test"},
609 #endif /* DEVELOPER */
614 static struct enum_list enum_ldap_ssl
[] = {
615 {LDAP_SSL_ON
, "Yes"},
616 {LDAP_SSL_ON
, "yes"},
619 {LDAP_SSL_OFF
, "no"},
620 {LDAP_SSL_OFF
, "No"},
621 {LDAP_SSL_OFF
, "off"},
622 {LDAP_SSL_OFF
, "Off"},
623 {LDAP_SSL_START_TLS
, "start tls"},
624 {LDAP_SSL_START_TLS
, "start_tls"},
629 /* Types of machine we can announce as. */
630 #define ANNOUNCE_AS_NT_SERVER 1
631 #define ANNOUNCE_AS_WIN95 2
632 #define ANNOUNCE_AS_WFW 3
633 #define ANNOUNCE_AS_NT_WORKSTATION 4
635 static struct enum_list enum_announce_as
[] = {
636 {ANNOUNCE_AS_NT_SERVER
, "NT"},
637 {ANNOUNCE_AS_NT_SERVER
, "NT Server"},
638 {ANNOUNCE_AS_NT_WORKSTATION
, "NT Workstation"},
639 {ANNOUNCE_AS_WIN95
, "win95"},
640 {ANNOUNCE_AS_WFW
, "WfW"},
644 static struct enum_list enum_case
[] = {
645 {CASE_LOWER
, "lower"},
646 {CASE_UPPER
, "upper"},
650 static struct enum_list enum_bool_auto
[] = {
661 /* Client-side offline caching policy types */
662 #define CSC_POLICY_MANUAL 0
663 #define CSC_POLICY_DOCUMENTS 1
664 #define CSC_POLICY_PROGRAMS 2
665 #define CSC_POLICY_DISABLE 3
667 static struct enum_list enum_csc_policy
[] = {
668 {CSC_POLICY_MANUAL
, "manual"},
669 {CSC_POLICY_DOCUMENTS
, "documents"},
670 {CSC_POLICY_PROGRAMS
, "programs"},
671 {CSC_POLICY_DISABLE
, "disable"},
676 Do you want session setups at user level security with a invalid
677 password to be rejected or allowed in as guest? WinNT rejects them
678 but it can be a pain as it means "net view" needs to use a password
680 You have 3 choices in the setting of map_to_guest:
682 "Never" means session setups with an invalid password
683 are rejected. This is the default.
685 "Bad User" means session setups with an invalid password
686 are rejected, unless the username does not exist, in which case it
687 is treated as a guest login
689 "Bad Password" means session setups with an invalid password
690 are treated as a guest login
692 Note that map_to_guest only has an effect in user or server
696 static struct enum_list enum_map_to_guest
[] = {
697 {NEVER_MAP_TO_GUEST
, "Never"},
698 {MAP_TO_GUEST_ON_BAD_USER
, "Bad User"},
699 {MAP_TO_GUEST_ON_BAD_PASSWORD
, "Bad Password"},
704 static struct enum_list enum_ssl_version
[] = {
705 {SMB_SSL_V2
, "ssl2"},
706 {SMB_SSL_V3
, "ssl3"},
707 {SMB_SSL_V23
, "ssl2or3"},
708 {SMB_SSL_TLS1
, "tls1"},
713 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
714 static struct parm_struct parm_table
[] = {
715 {"Base Options", P_SEP
, P_SEPARATOR
},
717 {"coding system", P_STRING
, P_GLOBAL
, &Globals
.szCodingSystem
, handle_coding_system
, NULL
, 0},
718 {"client code page", P_INTEGER
, P_GLOBAL
, &Globals
.client_code_page
, handle_client_code_page
, NULL
, 0},
719 {"code page directory", P_STRING
, P_GLOBAL
, &Globals
.szCodePageDir
, NULL
, NULL
, 0},
720 {"comment", P_STRING
, P_LOCAL
, &sDefault
.comment
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
721 {"path", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
722 {"directory", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_DOS_STRING
},
723 {"workgroup", P_USTRING
, P_GLOBAL
, &Globals
.szWorkGroup
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
| FLAG_WIZARD
},
724 {"netbios name", P_UGSTRING
, P_GLOBAL
, global_myname
, handle_netbios_name
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
| FLAG_WIZARD
},
725 {"netbios aliases", P_STRING
, P_GLOBAL
, &Globals
.szNetbiosAliases
, NULL
, NULL
, FLAG_DOS_STRING
},
726 {"netbios scope", P_UGSTRING
, P_GLOBAL
, global_scope
, NULL
, NULL
, FLAG_DOS_STRING
},
727 {"server string", P_STRING
, P_GLOBAL
, &Globals
.szServerString
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
728 {"interfaces", P_STRING
, P_GLOBAL
, &Globals
.szInterfaces
, NULL
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
729 {"bind interfaces only", P_BOOL
, P_GLOBAL
, &Globals
.bBindInterfacesOnly
, NULL
, NULL
, FLAG_WIZARD
},
731 {"Security Options", P_SEP
, P_SEPARATOR
},
733 {"security", P_ENUM
, P_GLOBAL
, &Globals
.security
, NULL
, enum_security
, FLAG_BASIC
| FLAG_WIZARD
},
734 {"encrypt passwords", P_BOOL
, P_GLOBAL
, &Globals
.bEncryptPasswords
, NULL
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
735 {"update encrypted", P_BOOL
, P_GLOBAL
, &Globals
.bUpdateEncrypt
, NULL
, NULL
, FLAG_BASIC
},
736 {"allow trusted domains", P_BOOL
, P_GLOBAL
, &Globals
.bAllowTrustedDomains
, NULL
, NULL
, 0},
737 {"alternate permissions", P_BOOL
, P_LOCAL
, &sDefault
.bAlternatePerm
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_DEPRECATED
},
738 {"hosts equiv", P_STRING
, P_GLOBAL
, &Globals
.szHostsEquiv
, NULL
, NULL
, 0},
739 {"min passwd length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
740 {"min password length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
741 {"map to guest", P_ENUM
, P_GLOBAL
, &Globals
.map_to_guest
, NULL
, enum_map_to_guest
, 0},
742 {"null passwords", P_BOOL
, P_GLOBAL
, &Globals
.bNullPasswords
, NULL
, NULL
, 0},
743 {"obey pam restrictions", P_BOOL
, P_GLOBAL
, &Globals
.bObeyPamRestrictions
, NULL
, NULL
, 0},
744 {"password server", P_STRING
, P_GLOBAL
, &Globals
.szPasswordServer
, NULL
, NULL
, FLAG_WIZARD
},
746 {"tdb passwd file", P_STRING
, P_GLOBAL
, &Globals
.szTDBPasswdFile
, NULL
, NULL
, 0},
748 {"smb passwd file", P_STRING
, P_GLOBAL
, &Globals
.szSMBPasswdFile
, NULL
, NULL
, 0},
750 {"root directory", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
751 {"root dir", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
752 {"root", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
754 {"pam password change", P_BOOL
, P_GLOBAL
, &Globals
.bPamPasswordChange
, NULL
, NULL
, 0},
755 {"passwd program", P_STRING
, P_GLOBAL
, &Globals
.szPasswdProgram
, NULL
, NULL
, 0},
756 {"passwd chat", P_STRING
, P_GLOBAL
, &Globals
.szPasswdChat
, NULL
, NULL
, 0},
757 {"passwd chat debug", P_BOOL
, P_GLOBAL
, &Globals
.bPasswdChatDebug
, NULL
, NULL
, 0},
758 {"username map", P_STRING
, P_GLOBAL
, &Globals
.szUsernameMap
, NULL
, NULL
, 0},
759 {"password level", P_INTEGER
, P_GLOBAL
, &Globals
.pwordlevel
, NULL
, NULL
, 0},
760 {"username level", P_INTEGER
, P_GLOBAL
, &Globals
.unamelevel
, NULL
, NULL
, 0},
761 {"unix password sync", P_BOOL
, P_GLOBAL
, &Globals
.bUnixPasswdSync
, NULL
, NULL
, 0},
762 {"restrict anonymous", P_BOOL
, P_GLOBAL
, &Globals
.bRestrictAnonymous
, NULL
, NULL
, 0},
763 {"lanman auth", P_BOOL
, P_GLOBAL
, &Globals
.bLanmanAuth
, NULL
, NULL
, 0},
764 {"use rhosts", P_BOOL
, P_GLOBAL
, &Globals
.bUseRhosts
, NULL
, NULL
, 0},
766 {"username", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
767 {"user", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
768 {"users", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
770 {"guest account", P_STRING
, P_LOCAL
, &sDefault
.szGuestaccount
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_GLOBAL
},
771 {"invalid users", P_STRING
, P_LOCAL
, &sDefault
.szInvalidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
772 {"valid users", P_STRING
, P_LOCAL
, &sDefault
.szValidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
773 {"admin users", P_STRING
, P_LOCAL
, &sDefault
.szAdminUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
774 {"read list", P_STRING
, P_LOCAL
, &sDefault
.readlist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
775 {"write list", P_STRING
, P_LOCAL
, &sDefault
.writelist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
776 {"printer admin", P_STRING
, P_LOCAL
, &sDefault
.printer_admin
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_PRINT
},
777 {"force user", P_STRING
, P_LOCAL
, &sDefault
.force_user
, NULL
, NULL
, FLAG_SHARE
},
778 {"force group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, FLAG_SHARE
},
779 {"group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, 0},
781 {"read only", P_BOOL
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
},
782 {"write ok", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
783 {"writeable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
784 {"writable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
786 {"create mask", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
787 {"create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
},
788 {"force create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
789 {"security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
790 {"force security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
791 {"directory mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
792 {"directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
},
793 {"force directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
794 {"directory security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
795 {"force directory security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
796 {"force unknown acl user", P_OCTAL
, P_LOCAL
, &sDefault
.bForceUnknownAclUser
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
797 {"inherit permissions", P_BOOL
, P_LOCAL
, &sDefault
.bInheritPerms
, NULL
, NULL
, FLAG_SHARE
},
798 {"inherit acls", P_BOOL
, P_LOCAL
, &sDefault
.bInheritACLS
, NULL
, NULL
, FLAG_SHARE
},
799 {"guest only", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, FLAG_SHARE
},
800 {"only guest", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, 0},
802 {"guest ok", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
803 {"public", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, 0},
805 {"only user", P_BOOL
, P_LOCAL
, &sDefault
.bOnlyUser
, NULL
, NULL
, FLAG_SHARE
},
806 {"hosts allow", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
807 {"allow hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, 0},
808 {"hosts deny", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
809 {"deny hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, 0},
812 {"Secure Socket Layer Options", P_SEP
, P_SEPARATOR
},
813 {"ssl", P_BOOL
, P_GLOBAL
, &Globals
.sslEnabled
, NULL
, NULL
, 0},
815 {"ssl hosts", P_STRING
, P_GLOBAL
, &Globals
.sslHostsRequire
, NULL
, NULL
, 0},
816 {"ssl hosts resign", P_STRING
, P_GLOBAL
, &Globals
.sslHostsResign
, NULL
, NULL
, 0},
817 {"ssl CA certDir", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertDir
, NULL
, NULL
, 0},
818 {"ssl CA certFile", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertFile
, NULL
, NULL
, 0},
819 {"ssl server cert", P_STRING
, P_GLOBAL
, &Globals
.sslServerCert
, NULL
, NULL
, 0},
820 {"ssl server key", P_STRING
, P_GLOBAL
, &Globals
.sslServerPrivKey
, NULL
, NULL
, 0},
821 {"ssl client cert", P_STRING
, P_GLOBAL
, &Globals
.sslClientCert
, NULL
, NULL
, 0},
822 {"ssl client key", P_STRING
, P_GLOBAL
, &Globals
.sslClientPrivKey
, NULL
, NULL
, 0},
823 {"ssl egd socket", P_STRING
, P_GLOBAL
, &Globals
.sslEgdSocket
, NULL
, NULL
, 0},
824 {"ssl entropy file", P_STRING
, P_GLOBAL
, &Globals
.sslEntropyFile
, NULL
, NULL
, 0},
825 {"ssl entropy bytes", P_INTEGER
, P_GLOBAL
, &Globals
.sslEntropyBytes
, NULL
, NULL
, 0},
826 {"ssl require clientcert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqClientCert
, NULL
, NULL
, 0},
827 {"ssl require servercert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqServerCert
, NULL
, NULL
, 0},
828 {"ssl ciphers", P_STRING
, P_GLOBAL
, &Globals
.sslCiphers
, NULL
, NULL
, 0},
829 {"ssl version", P_ENUM
, P_GLOBAL
, &Globals
.sslVersion
, NULL
, enum_ssl_version
, 0},
830 {"ssl compatibility", P_BOOL
, P_GLOBAL
, &Globals
.sslCompatibility
, NULL
, NULL
, 0},
831 #endif /* WITH_SSL */
833 {"Logging Options", P_SEP
, P_SEPARATOR
},
835 {"admin log", P_BOOL
, P_GLOBAL
, &Globals
.bAdminLog
, NULL
, NULL
, 0},
836 {"log level", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL_CLASS
[DBGC_ALL
], handle_debug_list
, NULL
, 0},
837 {"debuglevel", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL_CLASS
[DBGC_ALL
], handle_debug_list
, NULL
, 0},
838 {"syslog", P_INTEGER
, P_GLOBAL
, &Globals
.syslog
, NULL
, NULL
, 0},
839 {"syslog only", P_BOOL
, P_GLOBAL
, &Globals
.bSyslogOnly
, NULL
, NULL
, 0},
840 {"log file", P_STRING
, P_GLOBAL
, &Globals
.szLogFile
, NULL
, NULL
, 0},
842 {"max log size", P_INTEGER
, P_GLOBAL
, &Globals
.max_log_size
, NULL
, NULL
, 0},
843 {"timestamp logs", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
844 {"debug timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
845 {"debug hires timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bDebugHiresTimestamp
, NULL
, NULL
, 0},
846 {"debug pid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugPid
, NULL
, NULL
, 0},
847 {"debug uid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugUid
, NULL
, NULL
, 0},
849 {"status", P_BOOL
, P_LOCAL
, &sDefault
.status
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DEPRECATED
},
851 {"Protocol Options", P_SEP
, P_SEPARATOR
},
853 {"protocol", P_ENUM
, P_GLOBAL
, &Globals
.maxprotocol
, NULL
, enum_protocol
, 0},
854 {"large readwrite", P_BOOL
, P_GLOBAL
, &Globals
.bLargeReadwrite
, NULL
, NULL
, 0},
855 {"max protocol", P_ENUM
, P_GLOBAL
, &Globals
.maxprotocol
, NULL
, enum_protocol
, 0},
856 {"min protocol", P_ENUM
, P_GLOBAL
, &Globals
.minprotocol
, NULL
, enum_protocol
, 0},
857 {"read bmpx", P_BOOL
, P_GLOBAL
, &Globals
.bReadbmpx
, NULL
, NULL
, 0},
858 {"read raw", P_BOOL
, P_GLOBAL
, &Globals
.bReadRaw
, NULL
, NULL
, 0},
859 {"write raw", P_BOOL
, P_GLOBAL
, &Globals
.bWriteRaw
, NULL
, NULL
, 0},
861 {"nt smb support", P_BOOL
, P_GLOBAL
, &Globals
.bNTSmbSupport
, NULL
, NULL
, 0},
862 {"nt pipe support", P_BOOL
, P_GLOBAL
, &Globals
.bNTPipeSupport
, NULL
, NULL
, 0},
863 {"nt acl support", P_BOOL
, P_LOCAL
, &sDefault
.bNTAclSupport
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
864 {"nt status support", P_BOOL
, P_GLOBAL
, &Globals
.bNTStatusSupport
, NULL
, NULL
, 0 },
865 {"profile acls", P_BOOL
, P_LOCAL
, &sDefault
.bProfileAcls
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
866 {"announce version", P_STRING
, P_GLOBAL
, &Globals
.szAnnounceVersion
, NULL
, NULL
, 0},
867 {"announce as", P_ENUM
, P_GLOBAL
, &Globals
.announce_as
, NULL
, enum_announce_as
, 0},
868 {"max mux", P_INTEGER
, P_GLOBAL
, &Globals
.max_mux
, NULL
, NULL
, 0},
869 {"max xmit", P_INTEGER
, P_GLOBAL
, &Globals
.max_xmit
, NULL
, NULL
, 0},
871 {"name resolve order", P_STRING
, P_GLOBAL
, &Globals
.szNameResolveOrder
, NULL
, NULL
, 0},
872 {"max ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_ttl
, NULL
, NULL
, 0},
873 {"max wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_wins_ttl
, NULL
, NULL
, 0},
874 {"min wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.min_wins_ttl
, NULL
, NULL
, 0},
875 {"time server", P_BOOL
, P_GLOBAL
, &Globals
.bTimeServer
, NULL
, NULL
, 0},
876 {"unix extensions", P_BOOL
, P_GLOBAL
, &Globals
.bUnixExtensions
, NULL
, NULL
, 0},
878 {"Tuning Options", P_SEP
, P_SEPARATOR
},
880 {"block size", P_INTEGER
, P_LOCAL
, &sDefault
.iBlock_size
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
881 {"change notify timeout", P_INTEGER
, P_GLOBAL
, &Globals
.change_notify_timeout
, NULL
, NULL
, 0},
882 {"deadtime", P_INTEGER
, P_GLOBAL
, &Globals
.deadtime
, NULL
, NULL
, 0},
883 {"getwd cache", P_BOOL
, P_GLOBAL
, &use_getwd_cache
, NULL
, NULL
, 0},
884 {"keepalive", P_INTEGER
, P_GLOBAL
, &keepalive
, NULL
, NULL
, 0},
886 {"lpq cache time", P_INTEGER
, P_GLOBAL
, &Globals
.lpqcachetime
, NULL
, NULL
, 0},
887 {"max smbd processes", P_INTEGER
, P_GLOBAL
, &Globals
.iMaxSmbdProcesses
, NULL
, NULL
, 0},
888 {"max connections", P_INTEGER
, P_LOCAL
, &sDefault
.iMaxConnections
, NULL
, NULL
, FLAG_SHARE
},
889 {"max disk size", P_INTEGER
, P_GLOBAL
, &Globals
.maxdisksize
, NULL
, NULL
, 0},
890 {"max open files", P_INTEGER
, P_GLOBAL
, &Globals
.max_open_files
, NULL
, NULL
, 0},
891 {"min print space", P_INTEGER
, P_LOCAL
, &sDefault
.iMinPrintSpace
, NULL
, NULL
, FLAG_PRINT
},
892 {"name cache timeout", P_INTEGER
, P_GLOBAL
, &Globals
.name_cache_timeout
, NULL
, NULL
, 0},
893 {"read size", P_INTEGER
, P_GLOBAL
, &Globals
.ReadSize
, NULL
, NULL
, 0},
895 {"socket options", P_GSTRING
, P_GLOBAL
, user_socket_options
, NULL
, NULL
, 0},
896 {"stat cache size", P_INTEGER
, P_GLOBAL
, &Globals
.stat_cache_size
, NULL
, NULL
, 0},
897 {"strict allocate", P_BOOL
, P_LOCAL
, &sDefault
.bStrictAllocate
, NULL
, NULL
, FLAG_SHARE
},
898 {"strict sync", P_BOOL
, P_LOCAL
, &sDefault
.bStrictSync
, NULL
, NULL
, FLAG_SHARE
},
899 {"sync always", P_BOOL
, P_LOCAL
, &sDefault
.bSyncAlways
, NULL
, NULL
, FLAG_SHARE
},
900 {"use mmap", P_BOOL
, P_GLOBAL
, &Globals
.bUseMmap
, NULL
, NULL
, 0},
902 {"use sendfile", P_BOOL
, P_LOCAL
, &sDefault
.bUseSendfile
, NULL
, NULL
, FLAG_SHARE
},
904 {"write cache size", P_INTEGER
, P_LOCAL
, &sDefault
.iWriteCacheSize
, NULL
, NULL
, FLAG_SHARE
},
906 {"Printing Options", P_SEP
, P_SEPARATOR
},
908 {"total print jobs", P_INTEGER
, P_GLOBAL
, &Globals
.iTotalPrintJobs
, NULL
, NULL
, FLAG_PRINT
},
909 {"max print jobs", P_INTEGER
, P_LOCAL
, &sDefault
.iMaxPrintJobs
, NULL
, NULL
, FLAG_PRINT
},
910 {"load printers", P_BOOL
, P_GLOBAL
, &Globals
.bLoadPrinters
, NULL
, NULL
, FLAG_PRINT
},
911 {"printcap name", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, FLAG_PRINT
},
912 {"printcap", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, 0},
913 {"printable", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, FLAG_PRINT
},
914 {"print ok", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, 0},
915 {"postscript", P_BOOL
, P_LOCAL
, &sDefault
.bPostscript
, NULL
, NULL
, FLAG_PRINT
| FLAG_DEPRECATED
},
916 {"printing", P_ENUM
, P_LOCAL
, &sDefault
.iPrinting
, NULL
, enum_printing
, FLAG_PRINT
| FLAG_GLOBAL
},
917 {"print command", P_STRING
, P_LOCAL
, &sDefault
.szPrintcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
918 {"disable spoolss", P_BOOL
, P_GLOBAL
, &Globals
.bDisableSpoolss
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
919 {"lpq command", P_STRING
, P_LOCAL
, &sDefault
.szLpqcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
920 {"lprm command", P_STRING
, P_LOCAL
, &sDefault
.szLprmcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
921 {"lppause command", P_STRING
, P_LOCAL
, &sDefault
.szLppausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
922 {"lpresume command", P_STRING
, P_LOCAL
, &sDefault
.szLpresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
923 {"queuepause command", P_STRING
, P_LOCAL
, &sDefault
.szQueuepausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
924 {"queueresume command", P_STRING
, P_LOCAL
, &sDefault
.szQueueresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
926 {"enumports command", P_STRING
, P_GLOBAL
, &Globals
.szEnumPortsCommand
, NULL
, NULL
, 0},
927 {"addprinter command", P_STRING
, P_GLOBAL
, &Globals
.szAddPrinterCommand
, NULL
, NULL
, 0},
928 {"deleteprinter command", P_STRING
, P_GLOBAL
, &Globals
.szDeletePrinterCommand
, NULL
, NULL
, 0},
929 {"show add printer wizard", P_BOOL
, P_GLOBAL
, &Globals
.bMsAddPrinterWizard
, NULL
, NULL
, 0},
930 {"os2 driver map", P_STRING
, P_GLOBAL
, &Globals
.szOs2DriverMap
, NULL
, NULL
, 0},
932 {"printer name", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, FLAG_PRINT
|FLAG_DOS_STRING
},
933 {"printer", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, FLAG_DOS_STRING
},
934 {"use client driver", P_BOOL
, P_LOCAL
, &sDefault
.bUseClientDriver
, NULL
, NULL
, FLAG_PRINT
},
935 {"default devmode", P_BOOL
, P_LOCAL
, &sDefault
.bDefaultDevmode
, NULL
, NULL
, FLAG_PRINT
},
936 {"printer driver", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriver
, NULL
, NULL
, FLAG_PRINT
| FLAG_DEPRECATED
},
937 {"printer driver file", P_STRING
, P_LOCAL
, &sDefault
.szDriverFile
, NULL
, NULL
, FLAG_PRINT
| FLAG_DEPRECATED
},
938 {"printer driver location", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriverLocation
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
| FLAG_DEPRECATED
},
940 {"Filename Handling", P_SEP
, P_SEPARATOR
},
941 {"strip dot", P_BOOL
, P_GLOBAL
, &Globals
.bStripDot
, NULL
, NULL
, FLAG_DEPRECATED
},
942 {"mangling method", P_STRING
, P_GLOBAL
, &Globals
.szManglingMethod
, NULL
, NULL
, 0},
944 {"character set", P_STRING
, P_GLOBAL
, &Globals
.szCharacterSet
, handle_character_set
, NULL
, 0},
945 {"mangled stack", P_INTEGER
, P_GLOBAL
, &Globals
.mangled_stack
, NULL
, NULL
, 0},
946 {"default case", P_ENUM
, P_LOCAL
, &sDefault
.iDefaultCase
, NULL
, enum_case
, FLAG_SHARE
},
947 {"case sensitive", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
948 {"casesignames", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, 0},
949 {"preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
950 {"short preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bShortCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
951 {"mangle case", P_BOOL
, P_LOCAL
, &sDefault
.bCaseMangle
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
952 {"mangling char", P_CHAR
, P_LOCAL
, &sDefault
.magic_char
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
953 {"hide dot files", P_BOOL
, P_LOCAL
, &sDefault
.bHideDotFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
954 {"hide unreadable", P_BOOL
, P_LOCAL
, &sDefault
.bHideUnReadable
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
955 {"delete veto files", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
956 {"veto files", P_STRING
, P_LOCAL
, &sDefault
.szVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
957 {"hide files", P_STRING
, P_LOCAL
, &sDefault
.szHideFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
958 {"veto oplock files", P_STRING
, P_LOCAL
, &sDefault
.szVetoOplockFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
959 {"map system", P_BOOL
, P_LOCAL
, &sDefault
.bMap_system
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
960 {"map hidden", P_BOOL
, P_LOCAL
, &sDefault
.bMap_hidden
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
961 {"map archive", P_BOOL
, P_LOCAL
, &sDefault
.bMap_archive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
962 {"mangled names", P_BOOL
, P_LOCAL
, &sDefault
.bMangledNames
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
963 {"mangled map", P_STRING
, P_LOCAL
, &sDefault
.szMangledMap
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
964 {"stat cache", P_BOOL
, P_GLOBAL
, &Globals
.bStatCache
, NULL
, NULL
, 0},
966 {"Domain Options", P_SEP
, P_SEPARATOR
},
968 {"domain admin group", P_STRING
, P_GLOBAL
, &Globals
.szDomainAdminGroup
, NULL
, NULL
, 0},
969 {"domain guest group", P_STRING
, P_GLOBAL
, &Globals
.szDomainGuestGroup
, NULL
, NULL
, 0},
970 #ifdef USING_GROUPNAME_MAP
972 {"groupname map", P_STRING
, P_GLOBAL
, &Globals
.szGroupnameMap
, NULL
, NULL
, 0},
973 #endif /* USING_GROUPNAME_MAP */
975 {"machine password timeout", P_INTEGER
, P_GLOBAL
, &Globals
.machine_password_timeout
, NULL
, NULL
, 0},
977 {"Logon Options", P_SEP
, P_SEPARATOR
},
979 {"add user script", P_STRING
, P_GLOBAL
, &Globals
.szAddUserScript
, NULL
, NULL
, 0},
980 {"delete user script", P_STRING
, P_GLOBAL
, &Globals
.szDelUserScript
, NULL
, NULL
, 0},
981 {"logon script", P_STRING
, P_GLOBAL
, &Globals
.szLogonScript
, NULL
, NULL
, FLAG_DOS_STRING
},
982 {"logon path", P_STRING
, P_GLOBAL
, &Globals
.szLogonPath
, NULL
, NULL
, FLAG_DOS_STRING
},
983 {"logon drive", P_STRING
, P_GLOBAL
, &Globals
.szLogonDrive
, NULL
, NULL
, 0},
984 {"logon home", P_STRING
, P_GLOBAL
, &Globals
.szLogonHome
, NULL
, NULL
, FLAG_DOS_STRING
},
985 {"domain logons", P_BOOL
, P_GLOBAL
, &Globals
.bDomainLogons
, NULL
, NULL
, 0},
987 {"Browse Options", P_SEP
, P_SEPARATOR
},
989 {"os level", P_INTEGER
, P_GLOBAL
, &Globals
.os_level
, NULL
, NULL
, FLAG_BASIC
},
990 {"lm announce", P_ENUM
, P_GLOBAL
, &Globals
.lm_announce
, NULL
, enum_bool_auto
, 0},
991 {"lm interval", P_INTEGER
, P_GLOBAL
, &Globals
.lm_interval
, NULL
, NULL
, 0},
992 {"preferred master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
993 {"prefered master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_HIDE
},
994 {"local master", P_BOOL
, P_GLOBAL
, &Globals
.bLocalMaster
, NULL
, NULL
, FLAG_BASIC
},
995 {"domain master", P_ENUM
, P_GLOBAL
, &Globals
.bDomainMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
996 {"browse list", P_BOOL
, P_GLOBAL
, &Globals
.bBrowseList
, NULL
, NULL
, 0},
997 {"browseable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
998 {"browsable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, 0},
999 {"enhanced browsing", P_BOOL
, P_GLOBAL
, &Globals
.enhanced_browsing
, NULL
, NULL
},
1001 {"WINS Options", P_SEP
, P_SEPARATOR
},
1002 {"dns proxy", P_BOOL
, P_GLOBAL
, &Globals
.bDNSproxy
, NULL
, NULL
, 0},
1003 {"wins proxy", P_BOOL
, P_GLOBAL
, &Globals
.bWINSproxy
, NULL
, NULL
, 0},
1005 {"wins server", P_STRING
, P_GLOBAL
, &Globals
.szWINSserver
, handle_wins_server_list
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
1006 {"wins support", P_BOOL
, P_GLOBAL
, &Globals
.bWINSsupport
, NULL
, NULL
, FLAG_BASIC
| FLAG_WIZARD
},
1007 {"wins hook", P_STRING
, P_GLOBAL
, &Globals
.szWINSHook
, NULL
, NULL
, 0},
1009 {"Locking Options", P_SEP
, P_SEPARATOR
},
1011 {"blocking locks", P_BOOL
, P_LOCAL
, &sDefault
.bBlockingLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1012 {"csc policy", P_ENUM
, P_LOCAL
, &sDefault
.iCSCPolicy
, NULL
, enum_csc_policy
, FLAG_SHARE
| FLAG_GLOBAL
},
1013 {"fake oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bFakeOplocks
, NULL
, NULL
, FLAG_SHARE
},
1014 {"kernel oplocks", P_BOOL
, P_GLOBAL
, &Globals
.bKernelOplocks
, NULL
, NULL
, FLAG_GLOBAL
},
1015 {"locking", P_BOOL
, P_LOCAL
, &sDefault
.bLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1016 {"lock spin count", P_INTEGER
, P_GLOBAL
, &Globals
.iLockSpinCount
, NULL
, NULL
, FLAG_GLOBAL
},
1017 {"lock spin time", P_INTEGER
, P_GLOBAL
, &Globals
.iLockSpinTime
, NULL
, NULL
, FLAG_GLOBAL
},
1019 {"oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bOpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1020 {"level2 oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bLevel2OpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1021 {"oplock break wait time", P_INTEGER
, P_GLOBAL
, &Globals
.oplock_break_wait_time
, NULL
, NULL
, FLAG_GLOBAL
},
1022 {"oplock contention limit", P_INTEGER
, P_LOCAL
, &sDefault
.iOplockContentionLimit
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1023 {"posix locking", P_BOOL
, P_LOCAL
, &sDefault
.bPosixLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1024 {"strict locking", P_BOOL
, P_LOCAL
, &sDefault
.bStrictLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1025 {"share modes", P_BOOL
, P_LOCAL
, &sDefault
.bShareModes
, NULL
, NULL
, FLAG_SHARE
|FLAG_GLOBAL
},
1027 #ifdef WITH_LDAP_SAM
1028 {"Ldap Options", P_SEP
, P_SEPARATOR
},
1030 {"ldap server", P_STRING
, P_GLOBAL
, &Globals
.szLdapServer
, NULL
, NULL
, 0},
1031 {"ldap port", P_INTEGER
, P_GLOBAL
, &Globals
.ldap_port
, NULL
, NULL
, 0},
1032 {"ldap suffix", P_STRING
, P_GLOBAL
, &Globals
.szLdapSuffix
, NULL
, NULL
, 0},
1033 {"ldap filter", P_STRING
, P_GLOBAL
, &Globals
.szLdapFilter
, NULL
, NULL
, 0},
1034 {"ldap admin dn", P_STRING
, P_GLOBAL
, &Globals
.szLdapAdminDn
, NULL
, NULL
, 0},
1035 {"ldap ssl", P_ENUM
, P_GLOBAL
, &Globals
.ldap_ssl
, NULL
, enum_ldap_ssl
, 0},
1036 #endif /* WITH_LDAP_SAM */
1038 {"Miscellaneous Options", P_SEP
, P_SEPARATOR
},
1039 {"add share command", P_STRING
, P_GLOBAL
, &Globals
.szAddShareCommand
, NULL
, NULL
, 0},
1040 {"change share command", P_STRING
, P_GLOBAL
, &Globals
.szChangeShareCommand
, NULL
, NULL
, 0},
1041 {"delete share command", P_STRING
, P_GLOBAL
, &Globals
.szDeleteShareCommand
, NULL
, NULL
, 0},
1043 {"config file", P_STRING
, P_GLOBAL
, &Globals
.szConfigFile
, NULL
, NULL
, FLAG_HIDE
},
1044 {"preload", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, FLAG_DOS_STRING
},
1045 {"auto services", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, FLAG_DOS_STRING
},
1046 {"lock dir", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
1047 {"lock directory", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
1048 {"pid directory", P_STRING
, P_GLOBAL
, &Globals
.szPidDir
, NULL
, NULL
, 0},
1050 {"utmp directory", P_STRING
, P_GLOBAL
, &Globals
.szUtmpDir
, NULL
, NULL
, 0},
1051 {"wtmp directory", P_STRING
, P_GLOBAL
, &Globals
.szWtmpDir
, NULL
, NULL
, 0},
1052 {"utmp", P_BOOL
, P_GLOBAL
, &Globals
.bUtmp
, NULL
, NULL
, 0},
1055 {"default service", P_STRING
, P_GLOBAL
, &Globals
.szDefaultService
, NULL
, NULL
, FLAG_DOS_STRING
},
1056 {"default", P_STRING
, P_GLOBAL
, &Globals
.szDefaultService
, NULL
, NULL
, FLAG_DOS_STRING
},
1057 {"message command", P_STRING
, P_GLOBAL
, &Globals
.szMsgCommand
, NULL
, NULL
, 0},
1058 {"dfree command", P_STRING
, P_GLOBAL
, &Globals
.szDfree
, NULL
, NULL
, 0},
1059 {"valid chars", P_STRING
, P_GLOBAL
, &Globals
.szValidChars
, handle_valid_chars
, NULL
, 0},
1060 {"remote announce", P_STRING
, P_GLOBAL
, &Globals
.szRemoteAnnounce
, NULL
, NULL
, 0},
1061 {"remote browse sync", P_STRING
, P_GLOBAL
, &Globals
.szRemoteBrowseSync
, NULL
, NULL
, 0},
1062 {"socket address", P_STRING
, P_GLOBAL
, &Globals
.szSocketAddress
, NULL
, NULL
, 0},
1063 {"homedir map", P_STRING
, P_GLOBAL
, &Globals
.szNISHomeMapName
, NULL
, NULL
, 0},
1064 {"time offset", P_INTEGER
, P_GLOBAL
, &extra_time_offset
, NULL
, NULL
, 0},
1065 {"NIS homedir", P_BOOL
, P_GLOBAL
, &Globals
.bNISHomeMap
, NULL
, NULL
, 0},
1066 {"-valid", P_BOOL
, P_LOCAL
, &sDefault
.valid
, NULL
, NULL
, FLAG_HIDE
},
1068 {"copy", P_STRING
, P_LOCAL
, &sDefault
.szCopy
, handle_copy
, NULL
, FLAG_HIDE
},
1069 {"include", P_STRING
, P_LOCAL
, &sDefault
.szInclude
, handle_include
, NULL
, FLAG_HIDE
},
1070 {"exec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1071 {"preexec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, 0},
1073 {"preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bPreexecClose
, NULL
, NULL
, FLAG_SHARE
},
1074 {"postexec", P_STRING
, P_LOCAL
, &sDefault
.szPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1075 {"root preexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1076 {"root preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bRootpreexecClose
, NULL
, NULL
, FLAG_SHARE
},
1077 {"root postexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
1078 {"available", P_BOOL
, P_LOCAL
, &sDefault
.bAvailable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
1079 {"volume", P_STRING
, P_LOCAL
, &sDefault
.volume
, NULL
, NULL
, FLAG_SHARE
| FLAG_DOS_STRING
},
1080 {"fstype", P_STRING
, P_LOCAL
, &sDefault
.fstype
, NULL
, NULL
, FLAG_SHARE
},
1081 {"set directory", P_BOOLREV
, P_LOCAL
, &sDefault
.bNo_set_dir
, NULL
, NULL
, FLAG_SHARE
},
1082 {"source environment", P_STRING
, P_GLOBAL
, &Globals
.szSourceEnv
, handle_source_env
, NULL
, 0},
1083 {"wide links", P_BOOL
, P_LOCAL
, &sDefault
.bWidelinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1084 {"follow symlinks", P_BOOL
, P_LOCAL
, &sDefault
.bSymlinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1085 {"dont descend", P_STRING
, P_LOCAL
, &sDefault
.szDontdescend
, NULL
, NULL
, FLAG_SHARE
},
1086 {"magic script", P_STRING
, P_LOCAL
, &sDefault
.szMagicScript
, NULL
, NULL
, FLAG_SHARE
},
1087 {"magic output", P_STRING
, P_LOCAL
, &sDefault
.szMagicOutput
, NULL
, NULL
, FLAG_SHARE
},
1088 {"delete readonly", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteReadonly
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1089 {"dos filemode", P_BOOL
, P_LOCAL
, &sDefault
.bDosFilemode
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1090 {"dos filetimes", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1091 {"dos filetime resolution", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimeResolution
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1093 {"fake directory create times", P_BOOL
, P_LOCAL
, &sDefault
.bFakeDirCreateTimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
1094 {"panic action", P_STRING
, P_GLOBAL
, &Globals
.szPanicAction
, NULL
, NULL
, 0},
1095 {"hide local users", P_BOOL
, P_GLOBAL
, &Globals
.bHideLocalUsers
, NULL
,
1098 {"VFS module options", P_SEP
, P_SEPARATOR
},
1100 {"vfs object", P_STRING
, P_LOCAL
, &sDefault
.szVfsObjectFile
, handle_vfs_object
, NULL
, FLAG_SHARE
},
1101 {"vfs options", P_STRING
, P_LOCAL
, &sDefault
.szVfsOptions
, NULL
, NULL
, FLAG_SHARE
},
1104 {"MSDfs options", P_SEP
, P_SEPARATOR
},
1106 {"msdfs root", P_BOOL
, P_LOCAL
, &sDefault
.bMSDfsRoot
, NULL
, NULL
, FLAG_SHARE
},
1107 {"host msdfs", P_BOOL
, P_GLOBAL
, &Globals
.bHostMSDfs
, NULL
, NULL
, 0},
1110 {"Winbind options", P_SEP
, P_SEPARATOR
},
1112 {"winbind uid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindUID
, handle_winbind_uid
, NULL
, 0},
1113 {"winbind gid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindGID
, handle_winbind_gid
, NULL
, 0},
1114 {"template homedir", P_STRING
, P_GLOBAL
, &Globals
.szTemplateHomedir
, NULL
, NULL
, 0},
1115 {"template shell", P_STRING
, P_GLOBAL
, &Globals
.szTemplateShell
, NULL
, NULL
, 0},
1116 {"winbind separator", P_STRING
, P_GLOBAL
, &Globals
.szWinbindSeparator
, NULL
, NULL
, 0},
1117 {"winbind cache time", P_INTEGER
, P_GLOBAL
, &Globals
.winbind_cache_time
, NULL
, NULL
, 0},
1118 {"winbind enum users", P_BOOL
, P_GLOBAL
, &Globals
.bWinbindEnumUsers
, NULL
, NULL
, 0},
1119 {"winbind enum groups", P_BOOL
, P_GLOBAL
, &Globals
.bWinbindEnumGroups
, NULL
, NULL
, 0},
1120 {"winbind use default domain", P_BOOL
, P_GLOBAL
, &Globals
.bWinbindUseDefaultDomain
, NULL
, NULL
, 0},
1122 {NULL
, P_BOOL
, P_NONE
, NULL
, NULL
, NULL
, 0}
1126 /***************************************************************************
1127 Initialise the sDefault parameter structure for the printer values.
1128 ***************************************************************************/
1129 static void init_printer_values(void)
1131 string_set(&sDefault
.szPrinterDriver
, "");
1132 string_set(&sDefault
.szDriverFile
, DRIVERFILE
);
1134 /* choose defaults depending on the type of printing */
1135 switch (sDefault
.iPrinting
)
1141 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1142 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1143 string_set(&sDefault
.szPrintcommand
,
1149 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1150 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1151 string_set(&sDefault
.szPrintcommand
,
1153 string_set(&sDefault
.szQueuepausecommand
,
1155 string_set(&sDefault
.szQueueresumecommand
,
1157 string_set(&sDefault
.szLppausecommand
,
1159 string_set(&sDefault
.szLpresumecommand
,
1160 "lpc release %p %j");
1165 string_set(&sDefault
.szLpqcommand
, "");
1166 string_set(&sDefault
.szLprmcommand
, "");
1167 string_set(&sDefault
.szPrintcommand
, "");
1168 string_set(&sDefault
.szLppausecommand
, "");
1169 string_set(&sDefault
.szLpresumecommand
, "");
1170 string_set(&sDefault
.szQueuepausecommand
, "");
1171 string_set(&sDefault
.szQueueresumecommand
, "");
1173 string_set(&Globals
.szPrintcapname
, "cups");
1175 string_set(&sDefault
.szLpqcommand
,
1176 "/usr/bin/lpstat -o %p");
1177 string_set(&sDefault
.szLprmcommand
,
1178 "/usr/bin/cancel %p-%j");
1179 string_set(&sDefault
.szPrintcommand
,
1180 "/usr/bin/lp -d %p %s; rm %s");
1181 string_set(&sDefault
.szLppausecommand
,
1182 "lp -i %p-%j -H hold");
1183 string_set(&sDefault
.szLpresumecommand
,
1184 "lp -i %p-%j -H resume");
1185 string_set(&sDefault
.szQueuepausecommand
,
1186 "/usr/bin/disable %p");
1187 string_set(&sDefault
.szQueueresumecommand
,
1188 "/usr/bin/enable %p");
1189 string_set(&Globals
.szPrintcapname
, "lpstat");
1190 #endif /* HAVE_CUPS */
1195 string_set(&sDefault
.szLpqcommand
, "lpstat -o%p");
1196 string_set(&sDefault
.szLprmcommand
, "cancel %p-%j");
1197 string_set(&sDefault
.szPrintcommand
,
1198 "lp -c -d%p %s; rm %s");
1199 string_set(&sDefault
.szQueuepausecommand
,
1201 string_set(&sDefault
.szQueueresumecommand
,
1204 string_set(&sDefault
.szLppausecommand
,
1205 "lp -i %p-%j -H hold");
1206 string_set(&sDefault
.szLpresumecommand
,
1207 "lp -i %p-%j -H resume");
1212 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1213 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1214 string_set(&sDefault
.szPrintcommand
, "lp -r -P%p %s");
1218 string_set(&sDefault
.szLpqcommand
, "qstat -l -d%p");
1219 string_set(&sDefault
.szLprmcommand
,
1220 "qstat -s -j%j -c");
1221 string_set(&sDefault
.szPrintcommand
,
1222 "lp -d%p -s %s; rm %s");
1223 string_set(&sDefault
.szLppausecommand
,
1224 "qstat -s -j%j -h");
1225 string_set(&sDefault
.szLpresumecommand
,
1226 "qstat -s -j%j -r");
1231 string_set(&sDefault
.szPrintcommand
, "vlp print %p %s");
1232 string_set(&sDefault
.szLpqcommand
, "vlp lpq %p");
1233 string_set(&sDefault
.szLprmcommand
, "vlp lprm %p %j");
1234 string_set(&sDefault
.szLppausecommand
, "vlp lppause %p %j");
1235 string_set(&sDefault
.szLpresumecommand
, "vlp lpresum %p %j");
1236 string_set(&sDefault
.szQueuepausecommand
, "vlp queuepause %p");
1237 string_set(&sDefault
.szQueueresumecommand
, "vlp queueresume %p");
1239 #endif /* DEVELOPER */
1244 /***************************************************************************
1245 Initialise the global parameter structure.
1246 ***************************************************************************/
1247 static void init_globals(void)
1249 static BOOL done_init
= False
;
1255 memset((void *)&Globals
, '\0', sizeof(Globals
));
1257 for (i
= 0; parm_table
[i
].label
; i
++)
1258 if ((parm_table
[i
].type
== P_STRING
||
1259 parm_table
[i
].type
== P_USTRING
) &&
1261 string_set(parm_table
[i
].ptr
, "");
1263 string_set(&sDefault
.szGuestaccount
, GUEST_ACCOUNT
);
1264 string_set(&sDefault
.fstype
, FSTYPE_STRING
);
1266 init_printer_values();
1272 DEBUG(3, ("Initialising global parameters\n"));
1275 string_set(&Globals
.szTDBPasswdFile
, TDB_PASSWD_FILE
);
1277 string_set(&Globals
.szSMBPasswdFile
, SMB_PASSWD_FILE
);
1280 /* use the old 'hash' method by default */
1281 string_set(&Globals
.szManglingMethod
, "hash");
1284 * Allow the default PASSWD_CHAT to be overridden in local.h.
1286 string_set(&Globals
.szPasswdChat
, DEFAULT_PASSWD_CHAT
);
1287 string_set(&Globals
.szWorkGroup
, WORKGROUP
);
1288 string_set(&Globals
.szPasswdProgram
, PASSWD_PROGRAM
);
1289 string_set(&Globals
.szPrintcapname
, PRINTCAP_NAME
);
1290 string_set(&Globals
.szLockDir
, LOCKDIR
);
1291 string_set(&Globals
.szPidDir
, PIDDIR
);
1293 string_set(&Globals
.szUtmpDir
, "");
1294 string_set(&Globals
.szWtmpDir
, "");
1295 Globals
.bUtmp
= False
;
1297 string_set(&Globals
.szSocketAddress
, "0.0.0.0");
1298 pstrcpy(s
, "Samba ");
1299 pstrcat(s
, VERSION
);
1300 string_set(&Globals
.szServerString
, s
);
1301 slprintf(s
, sizeof(s
) - 1, "%d.%d", DEFAULT_MAJOR_VERSION
,
1302 DEFAULT_MINOR_VERSION
);
1303 string_set(&Globals
.szAnnounceVersion
, s
);
1305 pstrcpy(user_socket_options
, DEFAULT_SOCKET_OPTIONS
);
1307 string_set(&Globals
.szLogonDrive
, "");
1308 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1309 string_set(&Globals
.szLogonHome
, "\\\\%N\\%U");
1310 string_set(&Globals
.szLogonPath
, "\\\\%N\\%U\\profile");
1312 string_set(&Globals
.szNameResolveOrder
, "lmhosts host wins bcast");
1313 string_set(&Globals
.szCodePageDir
, CODEPAGEDIR
);
1315 Globals
.bLoadPrinters
= True
;
1316 Globals
.bUseRhosts
= False
;
1317 Globals
.mangled_stack
= 50;
1318 Globals
.max_xmit
= 65535;
1319 Globals
.max_mux
= 50; /* This is *needed* for profile support. */
1320 Globals
.lpqcachetime
= 10;
1321 Globals
.bDisableSpoolss
= False
;
1322 Globals
.iMaxSmbdProcesses
= 0;/* no limit specified */
1323 Globals
.iTotalPrintJobs
= 0; /* no limit specified */
1324 Globals
.pwordlevel
= 0;
1325 Globals
.unamelevel
= 0;
1326 Globals
.deadtime
= 0;
1327 Globals
.bLargeReadwrite
= False
;
1328 Globals
.max_log_size
= 5000;
1329 Globals
.max_open_files
= MAX_OPEN_FILES
;
1330 Globals
.maxprotocol
= PROTOCOL_NT1
;
1331 Globals
.minprotocol
= PROTOCOL_CORE
;
1332 Globals
.security
= SEC_USER
;
1333 Globals
.bEncryptPasswords
= False
;
1334 Globals
.bUpdateEncrypt
= False
;
1335 Globals
.bReadRaw
= True
;
1336 Globals
.bWriteRaw
= True
;
1337 Globals
.bReadPrediction
= False
;
1338 Globals
.bReadbmpx
= False
;
1339 Globals
.bNullPasswords
= False
;
1340 Globals
.bObeyPamRestrictions
= False
;
1341 Globals
.bStripDot
= False
;
1343 Globals
.bSyslogOnly
= False
;
1344 Globals
.bAdminLog
= False
;
1345 Globals
.bTimestampLogs
= True
;
1346 Globals
.bDebugHiresTimestamp
= False
;
1347 Globals
.bDebugPid
= False
;
1348 Globals
.bDebugUid
= False
;
1349 Globals
.max_ttl
= 60 * 60 * 24 * 3; /* 3 days default. */
1350 Globals
.max_wins_ttl
= 60 * 60 * 24 * 6; /* 6 days default. */
1351 Globals
.min_wins_ttl
= 60 * 60 * 6; /* 6 hours default. */
1352 Globals
.machine_password_timeout
= 60 * 60 * 24 * 7; /* 7 days default. */
1353 Globals
.change_notify_timeout
= 60; /* 1 minute default. */
1354 Globals
.ReadSize
= 16 * 1024;
1355 Globals
.lm_announce
= 2; /* = Auto: send only if LM clients found */
1356 Globals
.lm_interval
= 60;
1357 Globals
.stat_cache_size
= 50; /* Number of stat translations we'll keep */
1358 Globals
.announce_as
= ANNOUNCE_AS_NT_SERVER
;
1359 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1360 Globals
.bNISHomeMap
= False
;
1361 #ifdef WITH_NISPLUS_HOME
1362 string_set(&Globals
.szNISHomeMapName
, "auto_home.org_dir");
1364 string_set(&Globals
.szNISHomeMapName
, "auto.home");
1367 Globals
.client_code_page
= DEFAULT_CLIENT_CODE_PAGE
;
1368 Globals
.bTimeServer
= False
;
1369 Globals
.bBindInterfacesOnly
= False
;
1370 Globals
.bUnixPasswdSync
= False
;
1371 Globals
.bPamPasswordChange
= False
;
1372 Globals
.bPasswdChatDebug
= False
;
1373 Globals
.bNTSmbSupport
= True
; /* Do NT SMB's by default. */
1374 Globals
.bNTPipeSupport
= True
; /* Do NT pipes by default. */
1375 Globals
.bStatCache
= True
; /* use stat cache by default */
1376 Globals
.bNTStatusSupport
= True
; /* Use NT status by default. */
1377 Globals
.bRestrictAnonymous
= False
;
1378 Globals
.bLanmanAuth
= True
; /* Do use the LanMan hash if it is available */
1379 Globals
.map_to_guest
= 0; /* By Default, "Never" */
1380 Globals
.min_passwd_length
= MINPASSWDLENGTH
; /* By Default, 5. */
1381 Globals
.oplock_break_wait_time
= 0; /* By Default, 0 msecs. */
1382 Globals
.enhanced_browsing
= True
;
1383 Globals
.iLockSpinCount
= 3; /* Try 2 times. */
1384 Globals
.iLockSpinTime
= 10; /* usec. */
1385 #ifdef MMAP_BLACKLIST
1386 Globals
.bUseMmap
= False
;
1388 Globals
.bUseMmap
= True
;
1390 Globals
.bUnixExtensions
= False
;
1393 Globals
.sslVersion
= SMB_SSL_V23
;
1394 string_set(&Globals
.sslHostsRequire
, "");
1395 string_set(&Globals
.sslHostsResign
, "");
1396 string_set(&Globals
.sslCaCertDir
, "");
1397 string_set(&Globals
.sslCaCertFile
, "");
1398 string_set(&Globals
.sslServerCert
, "");
1399 string_set(&Globals
.sslServerPrivKey
, "");
1400 string_set(&Globals
.sslClientCert
, "");
1401 string_set(&Globals
.sslClientPrivKey
, "");
1402 string_set(&Globals
.sslCiphers
, "");
1403 string_set(&Globals
.sslEgdSocket
, "");
1404 string_set(&Globals
.sslEntropyFile
, "");
1405 Globals
.sslEntropyBytes
= 256;
1406 Globals
.sslEnabled
= False
;
1407 Globals
.sslReqClientCert
= False
;
1408 Globals
.sslReqServerCert
= False
;
1409 Globals
.sslCompatibility
= False
;
1410 #endif /* WITH_SSL */
1412 #ifdef WITH_LDAP_SAM
1413 string_set(&Globals
.szLdapServer
, "localhost");
1414 string_set(&Globals
.szLdapSuffix
, "");
1415 string_set(&Globals
.szLdapFilter
, "(&(uid=%u)(objectclass=sambaAccount))");
1416 string_set(&Globals
.szLdapAdminDn
, "");
1417 Globals
.ldap_port
= 636;
1418 Globals
.ldap_ssl
= LDAP_SSL_ON
;
1419 #endif /* WITH_LDAP_SAM */
1420 /* these parameters are set to defaults that are more appropriate
1421 for the increasing samba install base:
1423 as a member of the workgroup, that will possibly become a
1424 _local_ master browser (lm = True). this is opposed to a forced
1425 local master browser startup (pm = True).
1427 doesn't provide WINS server service by default (wsupp = False),
1428 and doesn't provide domain master browser services by default, either.
1432 Globals
.bMsAddPrinterWizard
= True
;
1433 Globals
.bPreferredMaster
= Auto
; /* depending on bDomainMaster */
1434 Globals
.os_level
= 20;
1435 Globals
.bLocalMaster
= True
;
1436 Globals
.bDomainMaster
= Auto
; /* depending on bDomainLogons */
1437 Globals
.bDomainLogons
= False
;
1438 Globals
.bBrowseList
= True
;
1439 Globals
.bWINSsupport
= False
;
1440 Globals
.bWINSproxy
= False
;
1442 Globals
.bDNSproxy
= True
;
1444 /* this just means to use them if they exist */
1445 Globals
.bKernelOplocks
= True
;
1447 Globals
.bAllowTrustedDomains
= True
;
1449 string_set(&Globals
.szTemplateShell
, "/bin/false");
1450 string_set(&Globals
.szTemplateHomedir
, "/home/%D/%U");
1451 string_set(&Globals
.szWinbindSeparator
, "\\");
1452 Globals
.winbind_cache_time
= 15;
1454 Globals
.bWinbindEnumUsers
= True
;
1455 Globals
.bWinbindEnumGroups
= True
;
1456 Globals
.bWinbindUseDefaultDomain
= False
;
1458 Globals
.bHostMSDfs
= False
;
1460 Globals
.name_cache_timeout
= 660; /* In seconds */
1463 * This must be done last as it checks the value in
1467 interpret_coding_system(KANJI
);
1470 static TALLOC_CTX
*lp_talloc
;
1472 /******************************************************************* a
1473 free up temporary memory - called from the main loop
1474 ********************************************************************/
1475 void lp_talloc_free(void)
1479 talloc_destroy(lp_talloc
);
1483 /*******************************************************************
1484 convenience routine to grab string parameters into temporary memory
1485 and run standard_sub_basic on them. The buffers can be written to by
1486 callers without affecting the source string.
1487 ********************************************************************/
1488 static char *lp_string(const char *s
)
1490 size_t len
= s
? strlen(s
) : 0;
1494 lp_talloc
= talloc_init();
1496 ret
= (char *)talloc(lp_talloc
, len
+ 100); /* leave room for substitution */
1504 StrnCpy(ret
, s
, len
);
1506 trim_string(ret
, "\"", "\"");
1508 standard_sub_basic(ret
, len
+ 100);
1514 In this section all the functions that are used to access the
1515 parameters from the rest of the program are defined
1518 #define FN_GLOBAL_STRING(fn_name,ptr) \
1519 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1520 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1521 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1522 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1523 char fn_name(void) {return(*(char *)(ptr));}
1524 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1525 int fn_name(void) {return(*(int *)(ptr));}
1527 #define FN_LOCAL_STRING(fn_name,val) \
1528 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1529 #define FN_LOCAL_CONST_STRING(fn_name,val) \
1530 const char *fn_name(int i) {return(const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1531 #define FN_LOCAL_BOOL(fn_name,val) \
1532 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1533 #define FN_LOCAL_CHAR(fn_name,val) \
1534 char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1535 #define FN_LOCAL_INTEGER(fn_name,val) \
1536 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1538 FN_GLOBAL_STRING(lp_logfile
, &Globals
.szLogFile
)
1539 FN_GLOBAL_STRING(lp_configfile
, &Globals
.szConfigFile
)
1541 FN_GLOBAL_STRING(lp_tdb_passwd_file
, &Globals
.szTDBPasswdFile
)
1543 FN_GLOBAL_STRING(lp_smb_passwd_file
, &Globals
.szSMBPasswdFile
)
1545 FN_GLOBAL_STRING(lp_serverstring
, &Globals
.szServerString
)
1546 FN_GLOBAL_STRING(lp_printcapname
, &Globals
.szPrintcapname
)
1547 FN_GLOBAL_STRING(lp_enumports_cmd
, &Globals
.szEnumPortsCommand
)
1548 FN_GLOBAL_STRING(lp_addprinter_cmd
, &Globals
.szAddPrinterCommand
)
1549 FN_GLOBAL_STRING(lp_deleteprinter_cmd
, &Globals
.szDeletePrinterCommand
)
1550 FN_GLOBAL_STRING(lp_os2_driver_map
, &Globals
.szOs2DriverMap
)
1551 FN_GLOBAL_STRING(lp_lockdir
, &Globals
.szLockDir
)
1552 FN_GLOBAL_STRING(lp_piddir
, &Globals
.szPidDir
)
1554 FN_GLOBAL_STRING(lp_utmpdir
, &Globals
.szUtmpDir
)
1555 FN_GLOBAL_STRING(lp_wtmpdir
, &Globals
.szWtmpDir
)
1556 FN_GLOBAL_BOOL(lp_utmp
, &Globals
.bUtmp
)
1558 FN_GLOBAL_STRING(lp_rootdir
, &Globals
.szRootdir
)
1559 FN_GLOBAL_STRING(lp_source_environment
, &Globals
.szSourceEnv
)
1560 FN_GLOBAL_STRING(lp_defaultservice
, &Globals
.szDefaultService
)
1561 FN_GLOBAL_STRING(lp_msg_command
, &Globals
.szMsgCommand
)
1562 FN_GLOBAL_STRING(lp_dfree_command
, &Globals
.szDfree
)
1563 FN_GLOBAL_STRING(lp_hosts_equiv
, &Globals
.szHostsEquiv
)
1564 FN_GLOBAL_STRING(lp_auto_services
, &Globals
.szAutoServices
)
1565 FN_GLOBAL_STRING(lp_passwd_program
, &Globals
.szPasswdProgram
)
1566 FN_GLOBAL_STRING(lp_passwd_chat
, &Globals
.szPasswdChat
)
1567 FN_GLOBAL_STRING(lp_passwordserver
, &Globals
.szPasswordServer
)
1568 FN_GLOBAL_STRING(lp_name_resolve_order
, &Globals
.szNameResolveOrder
)
1569 FN_GLOBAL_STRING(lp_workgroup
, &Globals
.szWorkGroup
)
1570 FN_GLOBAL_STRING(lp_username_map
, &Globals
.szUsernameMap
)
1571 #ifdef USING_GROUPNAME_MAP
1572 FN_GLOBAL_STRING(lp_groupname_map
, &Globals
.szGroupnameMap
)
1573 #endif /* USING_GROUPNAME_MAP */
1574 FN_GLOBAL_STRING(lp_logon_script
, &Globals
.szLogonScript
)
1575 FN_GLOBAL_STRING(lp_logon_path
, &Globals
.szLogonPath
)
1576 FN_GLOBAL_STRING(lp_logon_drive
, &Globals
.szLogonDrive
)
1577 FN_GLOBAL_STRING(lp_logon_home
, &Globals
.szLogonHome
)
1578 FN_GLOBAL_STRING(lp_remote_announce
, &Globals
.szRemoteAnnounce
)
1579 FN_GLOBAL_STRING(lp_remote_browse_sync
, &Globals
.szRemoteBrowseSync
)
1580 FN_GLOBAL_STRING(lp_wins_server
, &Globals
.szWINSserver
)
1581 FN_GLOBAL_STRING(lp_interfaces
, &Globals
.szInterfaces
)
1582 FN_GLOBAL_STRING(lp_socket_address
, &Globals
.szSocketAddress
)
1583 FN_GLOBAL_STRING(lp_nis_home_map_name
, &Globals
.szNISHomeMapName
)
1584 static FN_GLOBAL_STRING(lp_announce_version
, &Globals
.szAnnounceVersion
)
1585 FN_GLOBAL_STRING(lp_netbios_aliases
, &Globals
.szNetbiosAliases
)
1586 FN_GLOBAL_STRING(lp_panic_action
, &Globals
.szPanicAction
)
1587 FN_GLOBAL_STRING(lp_adduser_script
, &Globals
.szAddUserScript
)
1588 FN_GLOBAL_STRING(lp_deluser_script
, &Globals
.szDelUserScript
)
1589 FN_GLOBAL_STRING(lp_wins_hook
, &Globals
.szWINSHook
)
1590 FN_GLOBAL_STRING(lp_domain_admin_group
, &Globals
.szDomainAdminGroup
)
1591 FN_GLOBAL_STRING(lp_domain_guest_group
, &Globals
.szDomainGuestGroup
)
1592 FN_GLOBAL_STRING(lp_template_homedir
, &Globals
.szTemplateHomedir
)
1593 FN_GLOBAL_STRING(lp_template_shell
, &Globals
.szTemplateShell
)
1594 FN_GLOBAL_STRING(lp_winbind_separator
, &Globals
.szWinbindSeparator
)
1595 FN_GLOBAL_BOOL(lp_winbind_enum_users
, &Globals
.bWinbindEnumUsers
)
1596 FN_GLOBAL_BOOL(lp_winbind_enum_groups
, &Globals
.bWinbindEnumGroups
)
1597 FN_GLOBAL_BOOL(lp_winbind_use_default_domain
, &Globals
.bWinbindUseDefaultDomain
)
1598 FN_GLOBAL_STRING(lp_codepagedir
,&Globals
.szCodePageDir
)
1599 #ifdef WITH_LDAP_SAM
1600 FN_GLOBAL_STRING(lp_ldap_server
, &Globals
.szLdapServer
)
1601 FN_GLOBAL_STRING(lp_ldap_suffix
, &Globals
.szLdapSuffix
)
1602 FN_GLOBAL_STRING(lp_ldap_filter
, &Globals
.szLdapFilter
)
1603 FN_GLOBAL_STRING(lp_ldap_admin_dn
, &Globals
.szLdapAdminDn
)
1604 FN_GLOBAL_INTEGER(lp_ldap_port
, &Globals
.ldap_port
)
1605 FN_GLOBAL_INTEGER(lp_ldap_ssl
, &Globals
.ldap_ssl
)
1606 #endif /* WITH_LDAP_SAM */
1607 FN_GLOBAL_STRING(lp_add_share_cmd
, &Globals
.szAddShareCommand
)
1608 FN_GLOBAL_STRING(lp_change_share_cmd
, &Globals
.szChangeShareCommand
)
1609 FN_GLOBAL_STRING(lp_delete_share_cmd
, &Globals
.szDeleteShareCommand
)
1610 FN_GLOBAL_STRING(lp_mangling_method
, &Globals
.szManglingMethod
)
1613 FN_GLOBAL_INTEGER(lp_ssl_version
, &Globals
.sslVersion
)
1614 FN_GLOBAL_STRING(lp_ssl_hosts
, &Globals
.sslHostsRequire
)
1615 FN_GLOBAL_STRING(lp_ssl_hosts_resign
, &Globals
.sslHostsResign
)
1616 FN_GLOBAL_STRING(lp_ssl_cacertdir
, &Globals
.sslCaCertDir
)
1617 FN_GLOBAL_STRING(lp_ssl_cacertfile
, &Globals
.sslCaCertFile
)
1618 FN_GLOBAL_STRING(lp_ssl_server_cert
, &Globals
.sslServerCert
)
1619 FN_GLOBAL_STRING(lp_ssl_server_privkey
, &Globals
.sslServerPrivKey
)
1620 FN_GLOBAL_STRING(lp_ssl_client_cert
, &Globals
.sslClientCert
)
1621 FN_GLOBAL_STRING(lp_ssl_client_privkey
, &Globals
.sslClientPrivKey
)
1622 FN_GLOBAL_STRING(lp_ssl_ciphers
, &Globals
.sslCiphers
)
1623 FN_GLOBAL_STRING(lp_ssl_egdsocket
, &Globals
.sslEgdSocket
)
1624 FN_GLOBAL_STRING(lp_ssl_entropyfile
, &Globals
.sslEntropyFile
)
1625 FN_GLOBAL_INTEGER(lp_ssl_entropybytes
, &Globals
.sslEntropyBytes
)
1626 FN_GLOBAL_BOOL(lp_ssl_enabled
, &Globals
.sslEnabled
)
1627 FN_GLOBAL_BOOL(lp_ssl_reqClientCert
, &Globals
.sslReqClientCert
)
1628 FN_GLOBAL_BOOL(lp_ssl_reqServerCert
, &Globals
.sslReqServerCert
)
1629 FN_GLOBAL_BOOL(lp_ssl_compatibility
, &Globals
.sslCompatibility
)
1630 #endif /* WITH_SSL */
1632 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard
, &Globals
.bMsAddPrinterWizard
)
1633 FN_GLOBAL_BOOL(lp_dns_proxy
, &Globals
.bDNSproxy
)
1634 FN_GLOBAL_BOOL(lp_wins_support
, &Globals
.bWINSsupport
)
1635 FN_GLOBAL_BOOL(lp_we_are_a_wins_server
, &Globals
.bWINSsupport
)
1636 FN_GLOBAL_BOOL(lp_wins_proxy
, &Globals
.bWINSproxy
)
1637 FN_GLOBAL_BOOL(lp_local_master
, &Globals
.bLocalMaster
)
1638 FN_GLOBAL_BOOL(lp_domain_logons
, &Globals
.bDomainLogons
)
1639 FN_GLOBAL_BOOL(lp_load_printers
, &Globals
.bLoadPrinters
)
1640 FN_GLOBAL_BOOL(lp_use_rhosts
, &Globals
.bUseRhosts
)
1641 FN_GLOBAL_BOOL(lp_readprediction
, &Globals
.bReadPrediction
)
1642 FN_GLOBAL_BOOL(lp_readbmpx
, &Globals
.bReadbmpx
)
1643 FN_GLOBAL_BOOL(lp_readraw
, &Globals
.bReadRaw
)
1644 FN_GLOBAL_BOOL(lp_large_readwrite
, &Globals
.bLargeReadwrite
)
1645 FN_GLOBAL_BOOL(lp_writeraw
, &Globals
.bWriteRaw
)
1646 FN_GLOBAL_BOOL(lp_null_passwords
, &Globals
.bNullPasswords
)
1647 FN_GLOBAL_BOOL(lp_obey_pam_restrictions
, &Globals
.bObeyPamRestrictions
)
1648 FN_GLOBAL_BOOL(lp_strip_dot
, &Globals
.bStripDot
)
1649 FN_GLOBAL_BOOL(lp_encrypted_passwords
, &Globals
.bEncryptPasswords
)
1650 FN_GLOBAL_BOOL(lp_update_encrypted
, &Globals
.bUpdateEncrypt
)
1651 FN_GLOBAL_BOOL(lp_syslog_only
, &Globals
.bSyslogOnly
)
1652 FN_GLOBAL_BOOL(lp_admin_log
, &Globals
.bAdminLog
)
1653 FN_GLOBAL_BOOL(lp_timestamp_logs
, &Globals
.bTimestampLogs
)
1654 FN_GLOBAL_BOOL(lp_debug_hires_timestamp
, &Globals
.bDebugHiresTimestamp
)
1655 FN_GLOBAL_BOOL(lp_debug_pid
, &Globals
.bDebugPid
)
1656 FN_GLOBAL_BOOL(lp_debug_uid
, &Globals
.bDebugUid
)
1657 FN_GLOBAL_BOOL(lp_browse_list
, &Globals
.bBrowseList
)
1658 FN_GLOBAL_BOOL(lp_nis_home_map
, &Globals
.bNISHomeMap
)
1659 static FN_GLOBAL_BOOL(lp_time_server
, &Globals
.bTimeServer
)
1660 FN_GLOBAL_BOOL(lp_bind_interfaces_only
, &Globals
.bBindInterfacesOnly
)
1661 FN_GLOBAL_BOOL(lp_pam_password_change
, &Globals
.bPamPasswordChange
)
1662 FN_GLOBAL_BOOL(lp_unix_password_sync
, &Globals
.bUnixPasswdSync
)
1663 FN_GLOBAL_BOOL(lp_passwd_chat_debug
, &Globals
.bPasswdChatDebug
)
1664 FN_GLOBAL_BOOL(lp_nt_smb_support
, &Globals
.bNTSmbSupport
)
1665 FN_GLOBAL_BOOL(lp_nt_pipe_support
, &Globals
.bNTPipeSupport
)
1666 FN_GLOBAL_BOOL(lp_nt_status_support
, &Globals
.bNTStatusSupport
)
1667 FN_GLOBAL_BOOL(lp_stat_cache
, &Globals
.bStatCache
)
1668 FN_GLOBAL_BOOL(lp_allow_trusted_domains
, &Globals
.bAllowTrustedDomains
)
1669 FN_GLOBAL_BOOL(lp_restrict_anonymous
, &Globals
.bRestrictAnonymous
)
1670 FN_GLOBAL_BOOL(lp_lanman_auth
, &Globals
.bLanmanAuth
)
1671 FN_GLOBAL_BOOL(lp_host_msdfs
, &Globals
.bHostMSDfs
)
1672 FN_GLOBAL_BOOL(lp_kernel_oplocks
, &Globals
.bKernelOplocks
)
1673 FN_GLOBAL_BOOL(lp_enhanced_browsing
, &Globals
.enhanced_browsing
)
1674 FN_GLOBAL_BOOL(lp_use_mmap
, &Globals
.bUseMmap
)
1675 FN_GLOBAL_BOOL(lp_unix_extensions
, &Globals
.bUnixExtensions
)
1676 FN_GLOBAL_INTEGER(lp_os_level
, &Globals
.os_level
)
1677 FN_GLOBAL_INTEGER(lp_max_ttl
, &Globals
.max_ttl
)
1678 FN_GLOBAL_INTEGER(lp_max_wins_ttl
, &Globals
.max_wins_ttl
)
1679 FN_GLOBAL_INTEGER(lp_min_wins_ttl
, &Globals
.min_wins_ttl
)
1680 FN_GLOBAL_INTEGER(lp_max_log_size
, &Globals
.max_log_size
)
1681 FN_GLOBAL_INTEGER(lp_max_open_files
, &Globals
.max_open_files
)
1682 FN_GLOBAL_INTEGER(lp_maxxmit
, &Globals
.max_xmit
)
1683 FN_GLOBAL_INTEGER(lp_maxmux
, &Globals
.max_mux
)
1684 FN_GLOBAL_INTEGER(lp_passwordlevel
, &Globals
.pwordlevel
)
1685 FN_GLOBAL_INTEGER(lp_usernamelevel
, &Globals
.unamelevel
)
1686 FN_GLOBAL_INTEGER(lp_readsize
, &Globals
.ReadSize
)
1687 FN_GLOBAL_INTEGER(lp_deadtime
, &Globals
.deadtime
)
1688 FN_GLOBAL_INTEGER(lp_maxprotocol
, &Globals
.maxprotocol
)
1689 FN_GLOBAL_INTEGER(lp_minprotocol
, &Globals
.minprotocol
)
1690 FN_GLOBAL_INTEGER(lp_security
, &Globals
.security
)
1691 FN_GLOBAL_INTEGER(lp_maxdisksize
, &Globals
.maxdisksize
)
1692 FN_GLOBAL_INTEGER(lp_lpqcachetime
, &Globals
.lpqcachetime
)
1693 FN_GLOBAL_INTEGER(lp_max_smbd_processes
, &Globals
.iMaxSmbdProcesses
)
1694 FN_GLOBAL_INTEGER(lp_disable_spoolss
, &Globals
.bDisableSpoolss
)
1695 FN_GLOBAL_INTEGER(lp_totalprintjobs
, &Globals
.iTotalPrintJobs
)
1696 FN_GLOBAL_INTEGER(lp_syslog
, &Globals
.syslog
)
1697 FN_GLOBAL_INTEGER(lp_client_code_page
, &Globals
.client_code_page
)
1698 static FN_GLOBAL_INTEGER(lp_announce_as
, &Globals
.announce_as
)
1699 FN_GLOBAL_INTEGER(lp_lm_announce
, &Globals
.lm_announce
)
1700 FN_GLOBAL_INTEGER(lp_lm_interval
, &Globals
.lm_interval
)
1701 FN_GLOBAL_INTEGER(lp_machine_password_timeout
, &Globals
.machine_password_timeout
)
1702 FN_GLOBAL_INTEGER(lp_change_notify_timeout
, &Globals
.change_notify_timeout
)
1703 FN_GLOBAL_INTEGER(lp_stat_cache_size
, &Globals
.stat_cache_size
)
1704 FN_GLOBAL_INTEGER(lp_map_to_guest
, &Globals
.map_to_guest
)
1705 FN_GLOBAL_INTEGER(lp_min_passwd_length
, &Globals
.min_passwd_length
)
1706 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time
, &Globals
.oplock_break_wait_time
)
1707 FN_GLOBAL_INTEGER(lp_lock_spin_count
, &Globals
.iLockSpinCount
)
1708 FN_GLOBAL_INTEGER(lp_lock_sleep_time
, &Globals
.iLockSpinTime
)
1709 FN_GLOBAL_INTEGER(lp_name_cache_timeout
, &Globals
.name_cache_timeout
)
1710 FN_LOCAL_STRING(lp_preexec
, szPreExec
)
1711 FN_LOCAL_STRING(lp_postexec
, szPostExec
)
1712 FN_LOCAL_STRING(lp_rootpreexec
, szRootPreExec
)
1713 FN_LOCAL_STRING(lp_rootpostexec
, szRootPostExec
)
1714 FN_LOCAL_STRING(lp_servicename
, szService
)
1715 FN_LOCAL_CONST_STRING(lp_const_servicename
, szService
)
1716 FN_LOCAL_STRING(lp_pathname
, szPath
)
1717 FN_LOCAL_STRING(lp_dontdescend
, szDontdescend
)
1718 FN_LOCAL_STRING(lp_username
, szUsername
)
1719 FN_LOCAL_STRING(lp_guestaccount
, szGuestaccount
)
1720 FN_LOCAL_STRING(lp_invalid_users
, szInvalidUsers
)
1721 FN_LOCAL_STRING(lp_valid_users
, szValidUsers
)
1722 FN_LOCAL_STRING(lp_admin_users
, szAdminUsers
)
1723 FN_LOCAL_STRING(lp_printcommand
, szPrintcommand
)
1724 FN_LOCAL_STRING(lp_lpqcommand
, szLpqcommand
)
1725 FN_LOCAL_STRING(lp_lprmcommand
, szLprmcommand
)
1726 FN_LOCAL_STRING(lp_lppausecommand
, szLppausecommand
)
1727 FN_LOCAL_STRING(lp_lpresumecommand
, szLpresumecommand
)
1728 FN_LOCAL_STRING(lp_queuepausecommand
, szQueuepausecommand
)
1729 FN_LOCAL_STRING(lp_queueresumecommand
, szQueueresumecommand
)
1730 static FN_LOCAL_STRING(_lp_printername
, szPrintername
)
1731 FN_LOCAL_STRING(lp_driverfile
, szDriverFile
)
1732 FN_LOCAL_STRING(lp_printerdriver
, szPrinterDriver
)
1733 FN_LOCAL_STRING(lp_hostsallow
, szHostsallow
)
1734 FN_LOCAL_STRING(lp_hostsdeny
, szHostsdeny
)
1735 FN_LOCAL_STRING(lp_magicscript
, szMagicScript
)
1736 FN_LOCAL_STRING(lp_magicoutput
, szMagicOutput
)
1737 FN_LOCAL_STRING(lp_comment
, comment
)
1738 FN_LOCAL_STRING(lp_force_user
, force_user
)
1739 FN_LOCAL_STRING(lp_force_group
, force_group
)
1740 FN_LOCAL_STRING(lp_readlist
, readlist
)
1741 FN_LOCAL_STRING(lp_writelist
, writelist
)
1742 FN_LOCAL_STRING(lp_printer_admin
, printer_admin
)
1743 FN_LOCAL_STRING(lp_fstype
, fstype
)
1744 FN_LOCAL_STRING(lp_vfsobj
, szVfsObjectFile
)
1745 FN_LOCAL_STRING(lp_vfs_options
, szVfsOptions
)
1746 static FN_LOCAL_STRING(lp_volume
, volume
)
1747 FN_LOCAL_STRING(lp_mangled_map
, szMangledMap
)
1748 FN_LOCAL_STRING(lp_veto_files
, szVetoFiles
)
1749 FN_LOCAL_STRING(lp_hide_files
, szHideFiles
)
1750 FN_LOCAL_STRING(lp_veto_oplocks
, szVetoOplockFiles
)
1751 FN_LOCAL_STRING(lp_driverlocation
, szPrinterDriverLocation
)
1752 FN_LOCAL_BOOL(lp_msdfs_root
, bMSDfsRoot
)
1753 FN_LOCAL_BOOL(lp_autoloaded
, autoloaded
)
1754 FN_LOCAL_BOOL(lp_preexec_close
, bPreexecClose
)
1755 FN_LOCAL_BOOL(lp_rootpreexec_close
, bRootpreexecClose
)
1756 FN_LOCAL_BOOL(lp_casesensitive
, bCaseSensitive
)
1757 FN_LOCAL_BOOL(lp_preservecase
, bCasePreserve
)
1758 FN_LOCAL_BOOL(lp_shortpreservecase
, bShortCasePreserve
)
1759 FN_LOCAL_BOOL(lp_casemangle
, bCaseMangle
)
1760 FN_LOCAL_BOOL(lp_status
, status
)
1761 FN_LOCAL_BOOL(lp_hide_dot_files
, bHideDotFiles
)
1762 FN_LOCAL_BOOL(lp_hideunreadable
, bHideUnReadable
)
1763 FN_LOCAL_BOOL(lp_browseable
, bBrowseable
)
1764 FN_LOCAL_BOOL(lp_readonly
, bRead_only
)
1765 FN_LOCAL_BOOL(lp_no_set_dir
, bNo_set_dir
)
1766 FN_LOCAL_BOOL(lp_guest_ok
, bGuest_ok
)
1767 FN_LOCAL_BOOL(lp_guest_only
, bGuest_only
)
1768 FN_LOCAL_BOOL(lp_print_ok
, bPrint_ok
)
1769 FN_LOCAL_BOOL(lp_postscript
, bPostscript
)
1770 FN_LOCAL_BOOL(lp_map_hidden
, bMap_hidden
)
1771 FN_LOCAL_BOOL(lp_map_archive
, bMap_archive
)
1772 FN_LOCAL_BOOL(lp_locking
, bLocking
)
1773 FN_LOCAL_BOOL(lp_strict_locking
, bStrictLocking
)
1774 FN_LOCAL_BOOL(lp_share_modes
, bShareModes
)
1775 FN_LOCAL_BOOL(lp_posix_locking
, bPosixLocking
)
1776 FN_LOCAL_BOOL(lp_oplocks
, bOpLocks
)
1777 FN_LOCAL_BOOL(lp_level2_oplocks
, bLevel2OpLocks
)
1778 FN_LOCAL_BOOL(lp_onlyuser
, bOnlyUser
)
1779 FN_LOCAL_BOOL(lp_manglednames
, bMangledNames
)
1780 FN_LOCAL_BOOL(lp_widelinks
, bWidelinks
)
1781 FN_LOCAL_BOOL(lp_symlinks
, bSymlinks
)
1782 FN_LOCAL_BOOL(lp_syncalways
, bSyncAlways
)
1783 FN_LOCAL_BOOL(lp_strict_allocate
, bStrictAllocate
)
1784 FN_LOCAL_BOOL(lp_strict_sync
, bStrictSync
)
1785 FN_LOCAL_BOOL(lp_map_system
, bMap_system
)
1786 FN_LOCAL_BOOL(lp_delete_readonly
, bDeleteReadonly
)
1787 FN_LOCAL_BOOL(lp_fake_oplocks
, bFakeOplocks
)
1788 FN_LOCAL_BOOL(lp_recursive_veto_delete
, bDeleteVetoFiles
)
1789 FN_LOCAL_BOOL(lp_dos_filemode
, bDosFilemode
)
1790 FN_LOCAL_BOOL(lp_dos_filetimes
, bDosFiletimes
)
1791 FN_LOCAL_BOOL(lp_dos_filetime_resolution
, bDosFiletimeResolution
)
1792 FN_LOCAL_BOOL(lp_fake_dir_create_times
, bFakeDirCreateTimes
)
1793 FN_LOCAL_BOOL(lp_blocking_locks
, bBlockingLocks
)
1794 FN_LOCAL_BOOL(lp_inherit_perms
, bInheritPerms
)
1795 FN_LOCAL_BOOL(lp_inherit_acls
, bInheritACLS
)
1796 FN_LOCAL_BOOL(lp_use_client_driver
, bUseClientDriver
)
1797 FN_LOCAL_BOOL(lp_default_devmode
, bDefaultDevmode
)
1798 FN_LOCAL_BOOL(lp_nt_acl_support
, bNTAclSupport
)
1799 FN_LOCAL_BOOL(lp_force_unknown_acl_user
, bForceUnknownAclUser
)
1800 #ifdef WITH_SENDFILE
1801 FN_LOCAL_BOOL(lp_use_sendfile
, bUseSendfile
)
1803 FN_LOCAL_BOOL(lp_profile_acls
, bProfileAcls
)
1804 FN_LOCAL_INTEGER(lp_create_mask
, iCreate_mask
)
1805 FN_LOCAL_INTEGER(lp_force_create_mode
, iCreate_force_mode
)
1806 FN_LOCAL_INTEGER(lp_security_mask
, iSecurity_mask
)
1807 FN_LOCAL_INTEGER(lp_force_security_mode
, iSecurity_force_mode
)
1808 FN_LOCAL_INTEGER(lp_dir_mask
, iDir_mask
)
1809 FN_LOCAL_INTEGER(lp_force_dir_mode
, iDir_force_mode
)
1810 FN_LOCAL_INTEGER(lp_dir_security_mask
, iDir_Security_mask
)
1811 FN_LOCAL_INTEGER(lp_force_dir_security_mode
, iDir_Security_force_mode
)
1812 FN_LOCAL_INTEGER(lp_max_connections
, iMaxConnections
)
1813 FN_LOCAL_INTEGER(lp_defaultcase
, iDefaultCase
)
1814 FN_LOCAL_INTEGER(lp_minprintspace
, iMinPrintSpace
)
1815 FN_LOCAL_INTEGER(lp_printing
, iPrinting
)
1816 FN_LOCAL_INTEGER(lp_oplock_contention_limit
, iOplockContentionLimit
)
1817 FN_LOCAL_INTEGER(lp_csc_policy
, iCSCPolicy
)
1818 FN_LOCAL_INTEGER(lp_write_cache_size
, iWriteCacheSize
)
1819 FN_LOCAL_INTEGER(lp_block_size
, iBlock_size
)
1820 FN_LOCAL_CHAR(lp_magicchar
, magic_char
)
1821 FN_GLOBAL_INTEGER(lp_winbind_cache_time
, &Globals
.winbind_cache_time
)
1822 FN_GLOBAL_BOOL(lp_hide_local_users
, &Globals
.bHideLocalUsers
)
1824 /* local prototypes */
1826 static int map_parameter(char *pszParmName
);
1827 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
);
1828 static int getservicebyname(char *pszServiceName
,
1829 service
* pserviceDest
);
1830 static void copy_service(service
* pserviceDest
,
1831 service
* pserviceSource
, BOOL
*pcopymapDest
);
1832 static BOOL
service_ok(int iService
);
1833 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
);
1834 static BOOL
do_section(char *pszSectionName
);
1835 static void init_copymap(service
* pservice
);
1838 /***************************************************************************
1839 initialise a service to the defaults
1840 ***************************************************************************/
1841 static void init_service(service
* pservice
)
1843 memset((char *)pservice
, '\0', sizeof(service
));
1844 copy_service(pservice
, &sDefault
, NULL
);
1848 /***************************************************************************
1849 free the dynamically allocated parts of a service struct
1850 ***************************************************************************/
1851 static void free_service(service
* pservice
)
1857 if (pservice
->szService
)
1859 ("free_service: Freeing service %s\n",
1860 pservice
->szService
));
1862 string_free(&pservice
->szService
);
1863 SAFE_FREE(pservice
->copymap
);
1865 for (i
= 0; parm_table
[i
].label
; i
++)
1866 if ((parm_table
[i
].type
== P_STRING
||
1867 parm_table
[i
].type
== P_USTRING
) &&
1868 parm_table
[i
].class == P_LOCAL
)
1869 string_free((char **)
1870 (((char *)pservice
) +
1871 PTR_DIFF(parm_table
[i
].ptr
, &sDefault
)));
1873 ZERO_STRUCTP(pservice
);
1876 /***************************************************************************
1877 add a new service to the services array initialising it with the given
1878 service. name must be in DOS codepage.
1879 ***************************************************************************/
1880 static int add_a_service(service
* pservice
, char *name
)
1884 int num_to_alloc
= iNumServices
+ 1;
1886 tservice
= *pservice
;
1888 /* it might already exist */
1892 i
= getservicebyname(name
, NULL
);
1897 /* find an invalid one */
1898 for (i
= 0; i
< iNumServices
; i
++)
1899 if (!ServicePtrs
[i
]->valid
)
1902 /* if not, then create one */
1903 if (i
== iNumServices
)
1908 service
**oldservices
= iNumServices
? malloc(sizeof(service
*) * iNumServices
) : NULL
;
1911 memcpy(oldservices
, ServicePtrs
, sizeof(service
*) * iNumServices
);
1914 tsp
= (service
**) Realloc(ServicePtrs
,
1919 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
1923 ServicePtrs
[iNumServices
] =
1924 (service
*) malloc(sizeof(service
));
1928 if (iNumServices
&& (memcmp(oldservices
, ServicePtrs
, sizeof(service
*) * iNumServices
) != 0)) {
1929 smb_panic("add_a_service: Realloc corrupted ptrs...\n");
1931 safe_free(oldservices
);
1934 if (!ServicePtrs
[iNumServices
])
1940 free_service(ServicePtrs
[i
]);
1942 ServicePtrs
[i
]->valid
= True
;
1944 init_service(ServicePtrs
[i
]);
1945 copy_service(ServicePtrs
[i
], &tservice
, NULL
);
1948 string_set(&ServicePtrs
[i
]->szService
, name
);
1953 /***************************************************************************
1954 add a new home service, with the specified home directory, defaults coming
1955 from service ifrom. homename must be in DOS codepage.
1956 ***************************************************************************/
1957 BOOL
lp_add_home(char *pszHomename
, int iDefaultService
, char *pszHomedir
)
1961 i
= add_a_service(ServicePtrs
[iDefaultService
], pszHomename
);
1966 if (!(*(ServicePtrs
[i
]->szPath
))
1967 || strequal(ServicePtrs
[i
]->szPath
, lp_pathname(-1)))
1968 string_set(&ServicePtrs
[i
]->szPath
, pszHomedir
);
1969 if (!(*(ServicePtrs
[i
]->comment
)))
1972 slprintf(comment
, sizeof(comment
) - 1,
1973 "Home directory of %s", pszHomename
);
1974 string_set(&ServicePtrs
[i
]->comment
, comment
);
1976 ServicePtrs
[i
]->bAvailable
= sDefault
.bAvailable
;
1977 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
1980 ("adding home directory %s at %s\n", pszHomename
, pszHomedir
));
1985 /***************************************************************************
1986 add a new service, based on an old one. pszService must be in DOS codepage.
1987 ***************************************************************************/
1988 int lp_add_service(char *pszService
, int iDefaultService
)
1990 return (add_a_service(ServicePtrs
[iDefaultService
], pszService
));
1994 /***************************************************************************
1996 ***************************************************************************/
1997 static BOOL
lp_add_ipc(char *ipc_name
, BOOL guest_ok
)
2000 int i
= add_a_service(&sDefault
, ipc_name
);
2005 slprintf(comment
, sizeof(comment
) - 1,
2006 "IPC Service (%s)", Globals
.szServerString
);
2008 string_set(&ServicePtrs
[i
]->szPath
, tmpdir());
2009 string_set(&ServicePtrs
[i
]->szUsername
, "");
2010 string_set(&ServicePtrs
[i
]->comment
, comment
);
2011 string_set(&ServicePtrs
[i
]->fstype
, "IPC");
2012 ServicePtrs
[i
]->status
= False
;
2013 ServicePtrs
[i
]->iMaxConnections
= 0;
2014 ServicePtrs
[i
]->bAvailable
= True
;
2015 ServicePtrs
[i
]->bRead_only
= True
;
2016 ServicePtrs
[i
]->bGuest_only
= False
;
2017 ServicePtrs
[i
]->bGuest_ok
= guest_ok
;
2018 ServicePtrs
[i
]->bPrint_ok
= False
;
2019 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
2021 DEBUG(3, ("adding IPC service %s\n", ipc_name
));
2027 /***************************************************************************
2028 add a new printer service, with defaults coming from service iFrom.
2029 printername must be in DOS codepage.
2030 ***************************************************************************/
2031 BOOL
lp_add_printer(char *pszPrintername
, int iDefaultService
)
2033 char *comment
= "From Printcap";
2034 int i
= add_a_service(ServicePtrs
[iDefaultService
], pszPrintername
);
2039 /* note that we do NOT default the availability flag to True - */
2040 /* we take it from the default service passed. This allows all */
2041 /* dynamic printers to be disabled by disabling the [printers] */
2042 /* entry (if/when the 'available' keyword is implemented!). */
2044 /* the printer name is set to the service name. */
2045 string_set(&ServicePtrs
[i
]->szPrintername
, pszPrintername
);
2046 string_set(&ServicePtrs
[i
]->comment
, comment
);
2047 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
2048 /* Printers cannot be read_only. */
2049 ServicePtrs
[i
]->bRead_only
= False
;
2050 /* No oplocks on printer services. */
2051 ServicePtrs
[i
]->bOpLocks
= False
;
2052 /* Printer services must be printable. */
2053 ServicePtrs
[i
]->bPrint_ok
= True
;
2055 DEBUG(3, ("adding printer service %s\n", pszPrintername
));
2060 /***************************************************************************
2061 Map a parameter's string representation to something we can use.
2062 Returns False if the parameter string is not recognised, else TRUE.
2063 ***************************************************************************/
2064 static int map_parameter(char *pszParmName
)
2068 if (*pszParmName
== '-')
2071 for (iIndex
= 0; parm_table
[iIndex
].label
; iIndex
++)
2072 if (strwicmp(parm_table
[iIndex
].label
, pszParmName
) == 0)
2075 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName
));
2080 /***************************************************************************
2081 Set a boolean variable from the text value stored in the passed string.
2082 Returns True in success, False if the passed string does not correctly
2083 represent a boolean.
2084 ***************************************************************************/
2085 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
)
2090 if (strwicmp(pszParmValue
, "yes") == 0 ||
2091 strwicmp(pszParmValue
, "true") == 0 ||
2092 strwicmp(pszParmValue
, "1") == 0)
2095 if (strwicmp(pszParmValue
, "no") == 0 ||
2096 strwicmp(pszParmValue
, "False") == 0 ||
2097 strwicmp(pszParmValue
, "0") == 0)
2102 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
2109 /***************************************************************************
2110 Find a service by name. Otherwise works like get_service.
2111 ***************************************************************************/
2112 static int getservicebyname(char *pszServiceName
, service
* pserviceDest
)
2116 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
2117 if (VALID(iService
) &&
2118 strwicmp(ServicePtrs
[iService
]->szService
, pszServiceName
) == 0)
2120 if (pserviceDest
!= NULL
)
2121 copy_service(pserviceDest
, ServicePtrs
[iService
], NULL
);
2130 /***************************************************************************
2131 Copy a service structure to another
2133 If pcopymapDest is NULL then copy all fields
2134 ***************************************************************************/
2135 static void copy_service(service
* pserviceDest
,
2136 service
* pserviceSource
, BOOL
*pcopymapDest
)
2139 BOOL bcopyall
= (pcopymapDest
== NULL
);
2141 for (i
= 0; parm_table
[i
].label
; i
++)
2142 if (parm_table
[i
].ptr
&& parm_table
[i
].class == P_LOCAL
&&
2143 (bcopyall
|| pcopymapDest
[i
]))
2145 void *def_ptr
= parm_table
[i
].ptr
;
2147 ((char *)pserviceSource
) + PTR_DIFF(def_ptr
,
2150 ((char *)pserviceDest
) + PTR_DIFF(def_ptr
,
2153 switch (parm_table
[i
].type
)
2157 *(BOOL
*)dest_ptr
= *(BOOL
*)src_ptr
;
2163 *(int *)dest_ptr
= *(int *)src_ptr
;
2167 *(char *)dest_ptr
= *(char *)src_ptr
;
2171 string_set(dest_ptr
,
2176 string_set(dest_ptr
,
2178 strupper(*(char **)dest_ptr
);
2187 init_copymap(pserviceDest
);
2188 if (pserviceSource
->copymap
)
2189 memcpy((void *)pserviceDest
->copymap
,
2190 (void *)pserviceSource
->copymap
,
2191 sizeof(BOOL
) * NUMPARAMETERS
);
2195 /***************************************************************************
2196 Check a service for consistency. Return False if the service is in any way
2197 incomplete or faulty, else True.
2198 ***************************************************************************/
2199 static BOOL
service_ok(int iService
)
2204 if (ServicePtrs
[iService
]->szService
[0] == '\0')
2207 ("The following message indicates an internal error:\n"));
2208 DEBUG(0, ("No service name in service entry.\n"));
2212 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2213 /* I can't see why you'd want a non-printable printer service... */
2214 if (strwicmp(ServicePtrs
[iService
]->szService
, PRINTERS_NAME
) == 0) {
2215 if (!ServicePtrs
[iService
]->bPrint_ok
) {
2217 ("WARNING: [%s] service MUST be printable!\n",
2218 ServicePtrs
[iService
]->szService
));
2219 ServicePtrs
[iService
]->bPrint_ok
= True
;
2221 /* [printers] service must also be non-browsable. */
2222 if (ServicePtrs
[iService
]->bBrowseable
)
2223 ServicePtrs
[iService
]->bBrowseable
= False
;
2226 if (ServicePtrs
[iService
]->szPath
[0] == '\0' &&
2227 strwicmp(ServicePtrs
[iService
]->szService
, HOMES_NAME
) != 0)
2230 ("No path in service %s - using %s\n",
2231 ServicePtrs
[iService
]->szService
, tmpdir()));
2232 string_set(&ServicePtrs
[iService
]->szPath
, tmpdir());
2235 /* If a service is flagged unavailable, log the fact at level 0. */
2236 if (!ServicePtrs
[iService
]->bAvailable
)
2237 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2238 ServicePtrs
[iService
]->szService
));
2243 static struct file_lists
2245 struct file_lists
*next
;
2249 } *file_lists
= NULL
;
2251 /*******************************************************************
2252 keep a linked list of all config files so we know when one has changed
2253 it's date and needs to be reloaded
2254 ********************************************************************/
2255 static void add_to_file_list(char *fname
, char *subfname
)
2257 struct file_lists
*f
= file_lists
;
2260 if (f
->name
&& !strcmp(f
->name
, fname
))
2266 f
= (struct file_lists
*)malloc(sizeof(file_lists
[0]));
2269 f
->next
= file_lists
;
2270 f
->name
= strdup(fname
);
2275 f
->subfname
= strdup(subfname
);
2281 f
->modtime
= file_modtime(subfname
);
2283 time_t t
= file_modtime(subfname
);
2289 /*******************************************************************
2290 check if a config file has changed date
2291 ********************************************************************/
2292 BOOL
lp_file_list_changed(void)
2294 struct file_lists
*f
= file_lists
;
2295 DEBUG(6, ("lp_file_list_changed()\n"));
2301 pstrcpy(n2
, f
->name
);
2302 standard_sub_basic(n2
,sizeof(n2
));
2304 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2305 f
->name
, n2
, ctime(&f
->modtime
)));
2307 mod_time
= file_modtime(n2
);
2309 if (mod_time
&& ((f
->modtime
!= mod_time
) || (f
->subfname
== NULL
) || (strcmp(n2
, f
->subfname
) != 0))) {
2310 DEBUGADD(6, ("file %s modified: %s\n", n2
, ctime(&mod_time
)));
2311 f
->modtime
= mod_time
;
2312 SAFE_FREE(f
->subfname
);
2313 f
->subfname
= strdup(n2
);
2321 /***************************************************************************
2322 Run standard_sub_basic on netbios name... needed because global_myname
2323 is not accessed through any lp_ macro.
2324 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2325 ***************************************************************************/
2327 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
)
2329 pstring netbios_name
;
2331 pstrcpy(netbios_name
, pszParmValue
);
2333 standard_sub_basic(netbios_name
,sizeof(netbios_name
));
2334 strupper(netbios_name
);
2337 * Convert from UNIX to DOS string - the UNIX to DOS converter
2338 * isn't called on the special handlers.
2340 unix_to_dos(netbios_name
);
2341 pstrcpy(global_myname
, netbios_name
);
2344 ("handle_netbios_name: set global_myname to: %s\n",
2350 /***************************************************************************
2351 Do the work of sourcing in environment variable/value pairs.
2352 ***************************************************************************/
2354 static BOOL
source_env(char **lines
)
2361 for (i
= 0; lines
[i
]; i
++)
2363 char *line
= lines
[i
];
2365 if ((len
= strlen(line
)) == 0)
2368 if (line
[len
- 1] == '\n')
2371 if ((varval
= malloc(len
+ 1)) == NULL
)
2373 DEBUG(0, ("source_env: Not enough memory!\n"));
2377 DEBUG(4, ("source_env: Adding to environment: %s\n", line
));
2378 strncpy(varval
, line
, len
);
2381 p
= strchr(line
, (int)'=');
2384 DEBUG(4, ("source_env: missing '=': %s\n", line
));
2391 ("source_env: Failed to put environment variable %s\n",
2399 ("source_env: getting var %s = %s\n", line
,
2403 DEBUG(4, ("source_env: returning successfully\n"));
2407 /***************************************************************************
2408 Handle the source environment operation
2409 ***************************************************************************/
2411 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
)
2418 pstrcpy(fname
, pszParmValue
);
2420 standard_sub_basic(fname
,sizeof(fname
));
2422 string_set(ptr
, pszParmValue
);
2424 DEBUG(4, ("handle_source_env: checking env type\n"));
2427 * Filename starting with '|' means popen and read from stdin.
2432 lines
= file_lines_pload(p
+ 1, NULL
, True
);
2436 lines
= file_lines_load(fname
, NULL
, True
);
2442 ("handle_source_env: Failed to open file %s, Error was %s\n",
2443 fname
, strerror(errno
)));
2447 result
= source_env(lines
);
2448 file_lines_free(lines
);
2453 /***************************************************************************
2454 handle the interpretation of the vfs object parameter
2455 *************************************************************************/
2456 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
)
2458 /* Set string value */
2460 string_set(ptr
, pszParmValue
);
2462 /* Do any other initialisation required for vfs. Note that
2463 anything done here may have linking repercussions in nmbd. */
2468 /***************************************************************************
2469 handle the interpretation of the coding system parameter
2470 *************************************************************************/
2471 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
)
2473 string_set(ptr
, pszParmValue
);
2474 interpret_coding_system(pszParmValue
);
2478 /***************************************************************************
2479 Handle the interpretation of the character set system parameter.
2480 ***************************************************************************/
2482 static char *saved_character_set
= NULL
;
2484 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
)
2486 /* A dependency here is that the parameter client code page should be
2487 set before this is called.
2489 string_set(ptr
, pszParmValue
);
2491 saved_character_set
= strdup(*ptr
);
2492 interpret_character_set(*ptr
, lp_client_code_page());
2496 /***************************************************************************
2497 Handle the interpretation of the client code page parameter.
2498 We handle this separately so that we can reset the character set
2499 parameter in case this came before 'client code page' in the smb.conf.
2500 ***************************************************************************/
2502 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
)
2504 Globals
.client_code_page
= atoi(pszParmValue
);
2505 if (saved_character_set
!= NULL
)
2506 interpret_character_set(saved_character_set
,
2507 lp_client_code_page());
2508 codepage_initialise(lp_client_code_page());
2512 /***************************************************************************
2513 handle the valid chars lines
2514 ***************************************************************************/
2516 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
)
2518 string_set(ptr
, pszParmValue
);
2520 /* A dependency here is that the parameter client code page must be
2521 set before this is called - as calling codepage_initialise()
2522 would overwrite the valid char lines.
2524 codepage_initialise(lp_client_code_page());
2526 add_char_string(pszParmValue
);
2530 /***************************************************************************
2531 handle the include operation
2532 ***************************************************************************/
2534 static BOOL
handle_include(char *pszParmValue
, char **ptr
)
2537 pstrcpy(fname
, pszParmValue
);
2539 standard_sub_basic(fname
,sizeof(fname
));
2541 add_to_file_list(pszParmValue
, fname
);
2543 string_set(ptr
, fname
);
2545 if (file_exist(fname
, NULL
))
2546 return (pm_process(fname
, do_section
, do_parameter
));
2548 DEBUG(2, ("Can't find include file %s\n", fname
));
2554 /***************************************************************************
2555 handle the interpretation of the copy parameter
2556 ***************************************************************************/
2557 static BOOL
handle_copy(char *pszParmValue
, char **ptr
)
2561 service serviceTemp
;
2563 string_set(ptr
, pszParmValue
);
2565 init_service(&serviceTemp
);
2569 DEBUG(3, ("Copying service from service %s\n", pszParmValue
));
2571 if ((iTemp
= getservicebyname(pszParmValue
, &serviceTemp
)) >= 0)
2573 if (iTemp
== iServiceIndex
)
2576 ("Can't copy service %s - unable to copy self!\n",
2581 copy_service(ServicePtrs
[iServiceIndex
],
2583 ServicePtrs
[iServiceIndex
]->copymap
);
2589 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2594 free_service(&serviceTemp
);
2598 /***************************************************************************
2599 Handle winbind uid and gid allocation parameters. The format of these
2604 winbind uid = 1000-1999
2605 winbind gid = 700-899
2607 We only do simple parsing checks here. The strings are parsed into useful
2608 structures in the winbind daemon code.
2610 ***************************************************************************/
2612 /* Some lp_ routines to return winbind [ug]id information */
2614 static uid_t winbind_uid_low
, winbind_uid_high
;
2615 static gid_t winbind_gid_low
, winbind_gid_high
;
2617 BOOL
lp_winbind_uid(uid_t
*low
, uid_t
*high
)
2619 if (winbind_uid_low
== 0 || winbind_uid_high
== 0)
2623 *low
= winbind_uid_low
;
2626 *high
= winbind_uid_high
;
2631 BOOL
lp_winbind_gid(gid_t
*low
, gid_t
*high
)
2633 if (winbind_gid_low
== 0 || winbind_gid_high
== 0)
2637 *low
= winbind_gid_low
;
2640 *high
= winbind_gid_high
;
2645 /* Do some simple checks on "winbind [ug]id" parameter values */
2647 static BOOL
handle_winbind_uid(char *pszParmValue
, char **ptr
)
2649 unsigned int low
, high
;
2651 if (sscanf(pszParmValue
, "%u-%u", &low
, &high
) != 2 || high
< low
)
2656 string_set(ptr
, pszParmValue
);
2658 winbind_uid_low
= (uid_t
)low
;
2659 winbind_uid_high
= (uid_t
)high
;
2664 static BOOL
handle_winbind_gid(char *pszParmValue
, char **ptr
)
2666 unsigned int low
, high
;
2668 if (sscanf(pszParmValue
, "%u-%u", &low
, &high
) != 2 || high
< low
)
2673 string_set(ptr
, pszParmValue
);
2675 winbind_gid_low
= (gid_t
)low
;
2676 winbind_gid_high
= (gid_t
)high
;
2681 /***************************************************************************
2682 Handle the WINS SERVER list.
2683 ***************************************************************************/
2685 static BOOL
handle_wins_server_list( char *pszParmValue
, char **ptr
)
2687 if( !wins_srv_load_list( pszParmValue
) )
2688 return( False
); /* Parse failed. */
2690 string_set( ptr
, pszParmValue
);
2694 /***************************************************************************
2695 Handle the DEBUG level list.
2696 ***************************************************************************/
2698 static BOOL
handle_debug_list( char *pszParmValueIn
, char **ptr
)
2700 pstring pszParmValue
;
2702 pstrcpy(pszParmValue
, pszParmValueIn
);
2703 return debug_parse_levels( pszParmValue
);
2707 /***************************************************************************
2708 Initialise a copymap.
2709 ***************************************************************************/
2711 static void init_copymap(service
* pservice
)
2714 SAFE_FREE(pservice
->copymap
);
2715 pservice
->copymap
= (BOOL
*)malloc(sizeof(BOOL
) * NUMPARAMETERS
);
2716 if (!pservice
->copymap
)
2718 ("Couldn't allocate copymap!! (size %d)\n",
2719 (int)NUMPARAMETERS
));
2721 for (i
= 0; i
< NUMPARAMETERS
; i
++)
2722 pservice
->copymap
[i
] = True
;
2726 /***************************************************************************
2727 return the local pointer to a parameter given the service number and the
2728 pointer into the default structure
2729 ***************************************************************************/
2730 void *lp_local_ptr(int snum
, void *ptr
)
2732 return (void *)(((char *)ServicePtrs
[snum
]) + PTR_DIFF(ptr
, &sDefault
));
2735 /***************************************************************************
2736 Process a parameter for a particular service number. If snum < 0
2737 then assume we are in the globals
2738 ***************************************************************************/
2739 BOOL
lp_do_parameter(int snum
, char *pszParmName
, char *pszParmValue
)
2742 void *parm_ptr
= NULL
; /* where we are going to store the result */
2743 void *def_ptr
= NULL
;
2745 parmnum
= map_parameter(pszParmName
);
2750 ("Ignoring unknown parameter \"%s\"\n", pszParmName
));
2754 if (parm_table
[parmnum
].flags
& FLAG_DEPRECATED
)
2756 DEBUG(0, ("WARNING: The \"%s\"option is deprecated\n",
2760 def_ptr
= parm_table
[parmnum
].ptr
;
2762 /* we might point at a service, the default service or a global */
2769 if (parm_table
[parmnum
].class == P_GLOBAL
)
2772 ("Global parameter %s found in service section!\n",
2777 ((char *)ServicePtrs
[snum
]) + PTR_DIFF(def_ptr
,
2783 if (!ServicePtrs
[snum
]->copymap
)
2784 init_copymap(ServicePtrs
[snum
]);
2786 /* this handles the aliases - set the copymap for other entries with
2787 the same data pointer */
2788 for (i
= 0; parm_table
[i
].label
; i
++)
2789 if (parm_table
[i
].ptr
== parm_table
[parmnum
].ptr
)
2790 ServicePtrs
[snum
]->copymap
[i
] = False
;
2793 /* if it is a special case then go ahead */
2794 if (parm_table
[parmnum
].special
)
2796 parm_table
[parmnum
].special(pszParmValue
, (char **)parm_ptr
);
2800 /* now switch on the type of variable it is */
2801 switch (parm_table
[parmnum
].type
)
2804 set_boolean(parm_ptr
, pszParmValue
);
2808 set_boolean(parm_ptr
, pszParmValue
);
2809 *(BOOL
*)parm_ptr
= !*(BOOL
*)parm_ptr
;
2813 *(int *)parm_ptr
= atoi(pszParmValue
);
2817 *(char *)parm_ptr
= *pszParmValue
;
2821 sscanf(pszParmValue
, "%o", (int *)parm_ptr
);
2825 string_set(parm_ptr
, pszParmValue
);
2826 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2827 unix_to_dos(*(char **)parm_ptr
);
2831 string_set(parm_ptr
, pszParmValue
);
2832 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2833 unix_to_dos(*(char **)parm_ptr
);
2834 strupper(*(char **)parm_ptr
);
2838 pstrcpy((char *)parm_ptr
, pszParmValue
);
2839 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2840 unix_to_dos((char *)parm_ptr
);
2844 pstrcpy((char *)parm_ptr
, pszParmValue
);
2845 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2846 unix_to_dos((char *)parm_ptr
);
2847 strupper((char *)parm_ptr
);
2851 for (i
= 0; parm_table
[parmnum
].enum_list
[i
].name
;
2856 parm_table
[parmnum
].enum_list
[i
].name
))
2859 parm_table
[parmnum
].
2873 /***************************************************************************
2874 Process a parameter.
2875 ***************************************************************************/
2876 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
)
2878 if (!bInGlobalSection
&& bGlobalOnly
)
2881 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName
, pszParmValue
));
2883 return (lp_do_parameter(bInGlobalSection
? -2 : iServiceIndex
,
2884 pszParmName
, pszParmValue
));
2888 /***************************************************************************
2889 print a parameter of the specified type
2890 ***************************************************************************/
2891 static void print_parameter(struct parm_struct
*p
, void *ptr
, FILE * f
, char *(*dos_to_ext
)(const char *))
2897 for (i
= 0; p
->enum_list
[i
].name
; i
++)
2899 if (*(int *)ptr
== p
->enum_list
[i
].value
)
2902 p
->enum_list
[i
].name
);
2909 fprintf(f
, "%s", BOOLSTR(*(BOOL
*)ptr
));
2913 fprintf(f
, "%s", BOOLSTR(!*(BOOL
*)ptr
));
2917 fprintf(f
, "%d", *(int *)ptr
);
2918 if (strequal(p
->label
,"log level")) {
2919 for (i
= 1; i
< DBGC_LAST
; i
++) {
2920 if (((int *)ptr
)[i
])
2921 fprintf(f
, ",%s:%d",debug_classname_from_index(i
),((int *)ptr
)[i
]);
2927 fprintf(f
, "%c", *(char *)ptr
);
2931 fprintf(f
, "%s", octal_string(*(int *)ptr
));
2937 if (p
->flags
& FLAG_DOS_STRING
)
2938 fprintf(f
, "%s", dos_to_ext((const char *)ptr
));
2940 fprintf(f
, "%s", (char *)ptr
);
2946 if (*(char **)ptr
) {
2947 if(p
->flags
& FLAG_DOS_STRING
)
2948 fprintf(f
,"%s",dos_to_ext((const char *)*(const char **)ptr
));
2950 fprintf(f
, "%s", *(char **)ptr
);
2959 /***************************************************************************
2960 check if two parameters are equal
2961 ***************************************************************************/
2962 static BOOL
equal_parameter(parm_type type
, void *ptr1
, void *ptr2
)
2968 return (*((BOOL
*)ptr1
) == *((BOOL
*)ptr2
));
2973 return (*((int *)ptr1
) == *((int *)ptr2
));
2976 return (*((char *)ptr1
) == *((char *)ptr2
));
2981 char *p1
= (char *)ptr1
, *p2
= (char *)ptr2
;
2986 return (p1
== p2
|| strequal(p1
, p2
));
2991 char *p1
= *(char **)ptr1
, *p2
= *(char **)ptr2
;
2996 return (p1
== p2
|| strequal(p1
, p2
));
3004 /***************************************************************************
3005 Initialize any local varients in the sDefault table.
3006 ***************************************************************************/
3008 void init_locals(void)
3013 /***************************************************************************
3014 Process a new section (service). At this stage all sections are services.
3015 Later we'll have special sections that permit server parameters to be set.
3016 Returns True on success, False on failure. SectionName must be in DOS codepage.
3017 ***************************************************************************/
3018 static BOOL
do_section(char *pszSectionName
)
3021 BOOL isglobal
= ((strwicmp(pszSectionName
, GLOBAL_NAME
) == 0) ||
3022 (strwicmp(pszSectionName
, GLOBAL_NAME2
) == 0));
3025 /* if we were in a global section then do the local inits */
3026 if (bInGlobalSection
&& !isglobal
)
3029 /* if we've just struck a global section, note the fact. */
3030 bInGlobalSection
= isglobal
;
3032 /* check for multiple global sections */
3033 if (bInGlobalSection
)
3035 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName
));
3039 if (!bInGlobalSection
&& bGlobalOnly
)
3042 /* if we have a current service, tidy it up before moving on */
3045 if (iServiceIndex
>= 0)
3046 bRetval
= service_ok(iServiceIndex
);
3048 /* if all is still well, move to the next record in the services array */
3051 /* We put this here to avoid an odd message order if messages are */
3052 /* issued by the post-processing of a previous section. */
3053 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName
));
3055 if ((iServiceIndex
= add_a_service(&sDefault
, pszSectionName
))
3058 DEBUG(0, ("Failed to add a new service\n"));
3067 /***************************************************************************
3068 determine if a partcular base parameter is currently set to the default value.
3069 ***************************************************************************/
3070 static BOOL
is_default(int i
)
3072 if (!defaults_saved
)
3074 switch (parm_table
[i
].type
)
3078 return strequal(parm_table
[i
].def
.svalue
,
3079 *(char **)parm_table
[i
].ptr
);
3082 return strequal(parm_table
[i
].def
.svalue
,
3083 (char *)parm_table
[i
].ptr
);
3086 return parm_table
[i
].def
.bvalue
==
3087 *(BOOL
*)parm_table
[i
].ptr
;
3089 return parm_table
[i
].def
.cvalue
==
3090 *(char *)parm_table
[i
].ptr
;
3094 return parm_table
[i
].def
.ivalue
==
3095 *(int *)parm_table
[i
].ptr
;
3103 /***************************************************************************
3104 Display the contents of the global structure.
3105 ***************************************************************************/
3106 static void dump_globals(FILE *f
, char *(*dos_to_ext
)(const char *))
3109 fprintf(f
, "# Global parameters\n[global]\n");
3111 for (i
= 0; parm_table
[i
].label
; i
++)
3112 if (parm_table
[i
].class == P_GLOBAL
&&
3113 parm_table
[i
].ptr
&&
3114 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
3116 if (defaults_saved
&& is_default(i
))
3118 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
3119 print_parameter(&parm_table
[i
], parm_table
[i
].ptr
, f
, dos_to_ext
);
3124 /***************************************************************************
3125 return True if a local parameter is currently set to the global default
3126 ***************************************************************************/
3127 BOOL
lp_is_default(int snum
, struct parm_struct
*parm
)
3129 int pdiff
= PTR_DIFF(parm
->ptr
, &sDefault
);
3131 return equal_parameter(parm
->type
,
3132 ((char *)ServicePtrs
[snum
]) + pdiff
,
3133 ((char *)&sDefault
) + pdiff
);
3137 /***************************************************************************
3138 Display the contents of a single services record.
3139 ***************************************************************************/
3140 static void dump_a_service(service
* pService
, FILE * f
, char *(*dos_to_ext
)(const char *))
3143 if (pService
!= &sDefault
)
3144 fprintf(f
, "\n[%s]\n", pService
->szService
);
3146 for (i
= 0; parm_table
[i
].label
; i
++)
3147 if (parm_table
[i
].class == P_LOCAL
&&
3148 parm_table
[i
].ptr
&&
3149 (*parm_table
[i
].label
!= '-') &&
3150 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
3152 int pdiff
= PTR_DIFF(parm_table
[i
].ptr
, &sDefault
);
3154 if (pService
== &sDefault
)
3156 if (defaults_saved
&& is_default(i
))
3161 if (equal_parameter(parm_table
[i
].type
,
3162 ((char *)pService
) +
3164 ((char *)&sDefault
) +
3169 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
3170 print_parameter(&parm_table
[i
],
3171 ((char *)pService
) + pdiff
, f
, dos_to_ext
);
3177 /***************************************************************************
3178 return info about the next service in a service. snum==-1 gives the globals
3180 return NULL when out of parameters
3181 ***************************************************************************/
3182 struct parm_struct
*lp_next_parameter(int snum
, int *i
, int allparameters
)
3186 /* do the globals */
3187 for (; parm_table
[*i
].label
; (*i
)++)
3189 if (parm_table
[*i
].class == P_SEPARATOR
)
3190 return &parm_table
[(*i
)++];
3192 if (!parm_table
[*i
].ptr
3193 || (*parm_table
[*i
].label
== '-'))
3197 && (parm_table
[*i
].ptr
==
3198 parm_table
[(*i
) - 1].ptr
))
3201 return &parm_table
[(*i
)++];
3206 service
*pService
= ServicePtrs
[snum
];
3208 for (; parm_table
[*i
].label
; (*i
)++)
3210 if (parm_table
[*i
].class == P_SEPARATOR
)
3211 return &parm_table
[(*i
)++];
3213 if (parm_table
[*i
].class == P_LOCAL
&&
3214 parm_table
[*i
].ptr
&&
3215 (*parm_table
[*i
].label
!= '-') &&
3217 (parm_table
[*i
].ptr
!=
3218 parm_table
[(*i
) - 1].ptr
)))
3221 PTR_DIFF(parm_table
[*i
].ptr
,
3224 if (allparameters
||
3225 !equal_parameter(parm_table
[*i
].type
,
3226 ((char *)pService
) +
3228 ((char *)&sDefault
) +
3231 return &parm_table
[(*i
)++];
3242 /***************************************************************************
3243 Display the contents of a single copy structure.
3244 ***************************************************************************/
3245 static void dump_copy_map(BOOL
*pcopymap
)
3251 printf("\n\tNon-Copied parameters:\n");
3253 for (i
= 0; parm_table
[i
].label
; i
++)
3254 if (parm_table
[i
].class == P_LOCAL
&&
3255 parm_table
[i
].ptr
&& !pcopymap
[i
] &&
3256 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
3258 printf("\t\t%s\n", parm_table
[i
].label
);
3263 /***************************************************************************
3264 Return TRUE if the passed service number is within range.
3265 ***************************************************************************/
3267 BOOL
lp_snum_ok(int iService
)
3269 return (LP_SNUM_OK(iService
) && ServicePtrs
[iService
]->bAvailable
);
3272 /***************************************************************************
3273 Auto-load some home services.
3274 ***************************************************************************/
3276 static void lp_add_auto_services(char *str
)
3289 homes
= lp_servicenumber(HOMES_NAME
);
3291 for (p
= strtok(s
, LIST_SEP
); p
; p
= strtok(NULL
, LIST_SEP
)) {
3292 char *home
= get_user_service_home_dir(p
);
3294 if (lp_servicenumber(p
) >= 0)
3297 if (home
&& homes
>= 0)
3298 lp_add_home(p
, homes
, home
);
3303 /***************************************************************************
3304 Auto-load one printer.
3305 ***************************************************************************/
3307 void lp_add_one_printer(char *name
, char *comment
)
3309 int printers
= lp_servicenumber(PRINTERS_NAME
);
3312 if (lp_servicenumber(name
) < 0) {
3313 lp_add_printer(name
, printers
);
3314 if ((i
= lp_servicenumber(name
)) >= 0) {
3315 string_set(&ServicePtrs
[i
]->comment
, comment
);
3316 unix_to_dos(ServicePtrs
[i
]->comment
);
3317 ServicePtrs
[i
]->autoloaded
= True
;
3322 /***************************************************************************
3323 have we loaded a services file yet?
3324 ***************************************************************************/
3325 BOOL
lp_loaded(void)
3330 /***************************************************************************
3331 unload unused services
3332 ***************************************************************************/
3333 void lp_killunused(BOOL (*snumused
) (int))
3336 for (i
= 0; i
< iNumServices
; i
++)
3341 if (!snumused
|| !snumused(i
))
3343 ServicePtrs
[i
]->valid
= False
;
3344 free_service(ServicePtrs
[i
]);
3350 /***************************************************************************
3352 ***************************************************************************/
3353 void lp_killservice(int iServiceIn
)
3355 if (VALID(iServiceIn
))
3357 ServicePtrs
[iServiceIn
]->valid
= False
;
3358 free_service(ServicePtrs
[iServiceIn
]);
3362 /***************************************************************************
3363 save the curent values of all global and sDefault parameters into the
3364 defaults union. This allows swat and testparm to show only the
3365 changed (ie. non-default) parameters.
3366 ***************************************************************************/
3367 static void lp_save_defaults(void)
3370 for (i
= 0; parm_table
[i
].label
; i
++)
3372 if (i
> 0 && parm_table
[i
].ptr
== parm_table
[i
- 1].ptr
)
3374 switch (parm_table
[i
].type
)
3378 parm_table
[i
].def
.svalue
=
3379 strdup(*(char **)parm_table
[i
].ptr
);
3383 parm_table
[i
].def
.svalue
=
3384 strdup((char *)parm_table
[i
].ptr
);
3388 parm_table
[i
].def
.bvalue
=
3389 *(BOOL
*)parm_table
[i
].ptr
;
3392 parm_table
[i
].def
.cvalue
=
3393 *(char *)parm_table
[i
].ptr
;
3398 parm_table
[i
].def
.ivalue
=
3399 *(int *)parm_table
[i
].ptr
;
3405 defaults_saved
= True
;
3408 /*******************************************************************
3409 Set the server type we will announce as via nmbd.
3410 ********************************************************************/
3411 static void set_server_role(void)
3413 server_role
= ROLE_STANDALONE
;
3415 switch (lp_security()) {
3417 if (lp_domain_logons())
3418 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
3419 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3423 if (lp_domain_logons()) {
3424 server_role
= ROLE_DOMAIN_BDC
;
3425 DEBUG(10,("set_server_role: ROLE_DOMAIN_BDC\n"));
3428 server_role
= ROLE_DOMAIN_MEMBER
;
3429 DEBUG(10,("set_server_role: ROLE_DOMAIN_MEMBER\n"));
3432 if (lp_domain_logons()) {
3433 server_role
= ROLE_DOMAIN_PDC
;
3434 DEBUG(10,("set_server_role: ROLE_DOMAIN_PDC\n"));
3437 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3440 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
3441 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3447 /***************************************************************************
3448 Load the services array from the services file. Return True on success,
3450 ***************************************************************************/
3451 BOOL
lp_load(char *pszFname
, BOOL global_only
, BOOL save_defaults
,
3457 pstrcpy(n2
, pszFname
);
3458 standard_sub_basic(n2
,sizeof(n2
));
3460 add_to_file_list(pszFname
, n2
);
3464 bInGlobalSection
= True
;
3465 bGlobalOnly
= global_only
;
3475 pstrcpy(n2
, pszFname
);
3476 standard_sub_basic(n2
,sizeof(n2
));
3478 /* We get sections first, so have to start 'behind' to make up */
3480 bRetval
= pm_process(n2
, do_section
, do_parameter
);
3482 /* finish up the last section */
3483 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval
)));
3485 if (iServiceIndex
>= 0)
3486 bRetval
= service_ok(iServiceIndex
);
3488 lp_add_auto_services(lp_auto_services());
3491 lp_add_ipc("IPC$", True
);
3492 lp_add_ipc("ADMIN$", False
);
3496 set_default_server_announce_type();
3500 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3501 /* if bWINSsupport is true and we are in the client */
3503 if (in_client
&& Globals
.bWINSsupport
)
3506 string_set(&Globals
.szWINSserver
, "127.0.0.1");
3514 /***************************************************************************
3515 reset the max number of services
3516 ***************************************************************************/
3517 void lp_resetnumservices(void)
3522 /***************************************************************************
3523 return the max number of services
3524 ***************************************************************************/
3525 int lp_numservices(void)
3527 return (iNumServices
);
3530 /***************************************************************************
3531 Display the contents of the services array in human-readable form.
3532 ***************************************************************************/
3533 void lp_dump(FILE *f
, BOOL show_defaults
, int maxtoprint
, char *(*dos_to_ext
)(const char *))
3539 defaults_saved
= False
;
3542 dump_globals(f
, dos_to_ext
);
3544 dump_a_service(&sDefault
, f
, dos_to_ext
);
3546 for (iService
= 0; iService
< maxtoprint
; iService
++)
3547 lp_dump_one(f
, show_defaults
, iService
, dos_to_ext
);
3550 /***************************************************************************
3551 Display the contents of one service in human-readable form.
3552 ***************************************************************************/
3553 void lp_dump_one(FILE * f
, BOOL show_defaults
, int snum
, char *(*dos_to_ext
)(const char *))
3557 if (ServicePtrs
[snum
]->szService
[0] == '\0')
3559 dump_a_service(ServicePtrs
[snum
], f
, dos_to_ext
);
3564 /***************************************************************************
3565 Return the number of the service with the given name, or -1 if it doesn't
3566 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3567 getservicebyname()! This works ONLY if all services have been loaded, and
3568 does not copy the found service.
3569 ***************************************************************************/
3570 int lp_servicenumber(char *pszServiceName
)
3573 fstring serviceName
;
3576 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
3578 if (VALID(iService
) && ServicePtrs
[iService
]->szService
)
3581 * The substitution here is used to support %U is
3584 fstrcpy(serviceName
, ServicePtrs
[iService
]->szService
);
3585 standard_sub_basic(serviceName
,sizeof(serviceName
));
3586 if (strequal(serviceName
, pszServiceName
))
3592 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName
));
3597 /*******************************************************************
3598 A useful volume label function. Returns a string in DOS codepage.
3599 ********************************************************************/
3601 char *volume_label(int snum
)
3603 char *ret
= lp_volume(snum
);
3605 return lp_servicename(snum
);
3610 /*******************************************************************
3611 Set the server type we will announce as via nmbd.
3612 ********************************************************************/
3613 static void set_default_server_announce_type(void)
3615 default_server_announce
= 0;
3616 default_server_announce
|= SV_TYPE_WORKSTATION
;
3617 default_server_announce
|= SV_TYPE_SERVER
;
3618 default_server_announce
|= SV_TYPE_SERVER_UNIX
;
3619 default_server_announce
|= SV_TYPE_PRINTQ_SERVER
;
3621 switch (lp_announce_as())
3623 case ANNOUNCE_AS_NT_SERVER
:
3625 default_server_announce
|= SV_TYPE_SERVER_NT
;
3626 /* fall through... */
3628 case ANNOUNCE_AS_NT_WORKSTATION
:
3630 default_server_announce
|= SV_TYPE_NT
;
3633 case ANNOUNCE_AS_WIN95
:
3635 default_server_announce
|= SV_TYPE_WIN95_PLUS
;
3638 case ANNOUNCE_AS_WFW
:
3640 default_server_announce
|= SV_TYPE_WFW
;
3649 switch (lp_server_role())
3651 case ROLE_DOMAIN_MEMBER
:
3653 default_server_announce
|= SV_TYPE_DOMAIN_MEMBER
;
3656 case ROLE_DOMAIN_PDC
:
3658 default_server_announce
|= SV_TYPE_DOMAIN_CTRL
;
3661 case ROLE_DOMAIN_BDC
:
3663 default_server_announce
|= SV_TYPE_DOMAIN_BAKCTRL
;
3666 case ROLE_STANDALONE
:
3673 if (lp_time_server())
3675 default_server_announce
|= SV_TYPE_TIME_SOURCE
;
3678 if (lp_host_msdfs())
3680 default_server_announce
|= SV_TYPE_DFS_SERVER
;
3684 /***********************************************************
3685 returns role of Samba server
3686 ************************************************************/
3688 int lp_server_role(void)
3693 /***********************************************************
3694 If we are PDC then prefer us as DMB
3695 ************************************************************/
3697 BOOL
lp_domain_master(void)
3699 if (Globals
.bDomainMaster
== Auto
)
3701 return (lp_server_role() == ROLE_DOMAIN_PDC
);
3704 return Globals
.bDomainMaster
;
3707 /***********************************************************
3708 If we are DMB then prefer us as LMB
3709 ************************************************************/
3711 BOOL
lp_preferred_master(void)
3713 if (Globals
.bPreferredMaster
== Auto
)
3715 return (lp_local_master() && lp_domain_master());
3718 return Globals
.bPreferredMaster
;
3723 /*******************************************************************
3725 ********************************************************************/
3726 void lp_remove_service(int snum
)
3728 ServicePtrs
[snum
]->valid
= False
;
3731 /*******************************************************************
3732 copy a service. new_name must be in dos codepage
3733 ********************************************************************/
3734 void lp_copy_service(int snum
, char *new_name
)
3736 char *oldname
= lp_servicename(snum
);
3737 do_section(new_name
);
3740 snum
= lp_servicenumber(new_name
);
3742 lp_do_parameter(snum
, "copy", oldname
);
3747 /*******************************************************************
3748 Get the default server type we will announce as via nmbd.
3749 ********************************************************************/
3750 int lp_default_server_announce(void)
3752 return default_server_announce
;
3755 /*******************************************************************
3756 Split the announce version into major and minor numbers.
3757 ********************************************************************/
3758 int lp_major_announce_version(void)
3760 static BOOL got_major
= False
;
3761 static int major_version
= DEFAULT_MAJOR_VERSION
;
3766 return major_version
;
3769 if ((vers
= lp_announce_version()) == NULL
)
3770 return major_version
;
3772 if ((p
= strchr(vers
, '.')) == 0)
3773 return major_version
;
3776 major_version
= atoi(vers
);
3777 return major_version
;
3780 int lp_minor_announce_version(void)
3782 static BOOL got_minor
= False
;
3783 static int minor_version
= DEFAULT_MINOR_VERSION
;
3788 return minor_version
;
3791 if ((vers
= lp_announce_version()) == NULL
)
3792 return minor_version
;
3794 if ((p
= strchr(vers
, '.')) == 0)
3795 return minor_version
;
3798 minor_version
= atoi(p
);
3799 return minor_version
;
3802 /***********************************************************
3803 Set the global name resolution order (used in smbclient).
3804 ************************************************************/
3806 void lp_set_name_resolve_order(char *new_order
)
3808 Globals
.szNameResolveOrder
= new_order
;
3811 char *lp_printername(int snum
)
3813 char *ret
= _lp_printername(snum
);
3814 if (ret
== NULL
|| (ret
!= NULL
&& *ret
== '\0'))
3815 ret
= lp_servicename(snum
);
3820 /***********************************************************
3821 Return a pointer to the private directory (containing
3823 ************************************************************/
3825 void get_private_directory(pstring priv_dir
)
3832 pstrcpy(priv_dir
, lp_tdb_passwd_file());
3834 pstrcpy(priv_dir
, lp_smb_passwd_file());
3837 p
= strrchr(priv_dir
, '/');
3841 /***********************************************************
3842 Allow daemons such as winbindd to fix their logfile name.
3843 ************************************************************/
3845 void lp_set_logfile(const char *name
)
3847 extern pstring debugf
;
3848 string_set(&Globals
.szLogFile
, name
);
3849 pstrcpy(debugf
, name
);
3852 /*******************************************************************
3853 Return the NetBIOS called name.
3854 ********************************************************************/
3856 const char *get_called_name(void)
3858 extern fstring local_machine
;
3859 static fstring called_name
;
3861 if (! *local_machine
)
3862 return global_myname
;
3865 * Windows NT/2k uses "*SMBSERVER" and XP uses "*SMBSERV"
3866 * arrggg!!! but we've already rewritten the client's
3867 * netbios name at this point...
3870 if (*local_machine
) {
3871 if (!StrCaseCmp(local_machine
, "_SMBSERVER") || !StrCaseCmp(local_machine
, "_SMBSERV")) {
3872 fstrcpy(called_name
, get_my_primary_ip());
3873 DEBUG(8,("get_called_name: assuming that client used IP address [%s] as called name.\n",
3879 return local_machine
;
3882 /*******************************************************************
3883 Return the max print jobs per queue.
3884 ********************************************************************/
3886 int lp_maxprintjobs(int snum
)
3888 int maxjobs
= LP_SNUM_OK(snum
) ? ServicePtrs
[snum
]->iMaxPrintJobs
: sDefault
.iMaxPrintJobs
;
3889 if (maxjobs
<= 0 || maxjobs
>= PRINT_MAX_JOBID
)
3890 maxjobs
= PRINT_MAX_JOBID
- 1;