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
;
72 extern pstring user_socket_options
;
73 extern pstring global_myname
;
74 pstring global_scope
= "";
77 #define GLOBAL_NAME "global"
81 #define PRINTERS_NAME "printers"
85 #define HOMES_NAME "homes"
88 /* some helpful bits */
89 #define pSERVICE(i) ServicePtrs[i]
90 #define iSERVICE(i) (*pSERVICE(i))
91 #define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
92 #define VALID(i) iSERVICE(i).valid
94 int keepalive
= DEFAULT_KEEPALIVE
;
95 BOOL use_getwd_cache
= True
;
97 extern int extra_time_offset
;
99 static BOOL defaults_saved
= False
;
102 * This structure describes global (ie., server-wide) parameters.
106 char *szPrintcapname
;
107 char *szEnumPortsCommand
;
108 char *szAddPrinterCommand
;
109 char *szDeletePrinterCommand
;
112 char *szDefaultService
;
116 char *szServerString
;
117 char *szAutoServices
;
118 char *szPasswdProgram
;
123 char *szTDBPasswdFile
;
125 char *szSMBPasswdFile
;
127 char *szPassdbModulePath
;
128 char *szPasswordServer
;
129 char *szSocketOptions
;
132 char *szDomainAdminGroup
;
133 char *szDomainGuestGroup
;
134 char *szDomainAdminUsers
;
135 char *szDomainGuestUsers
;
136 char *szDomainHostsallow
;
137 char *szDomainHostsdeny
;
139 #ifdef USING_GROUPNAME_MAP
140 char *szGroupnameMap
;
141 #endif /* USING_GROUPNAME_MAP */
142 char *szCharacterSet
;
150 char *szCodingSystem
;
152 char *szRemoteAnnounce
;
153 char *szRemoteBrowseSync
;
154 char *szSocketAddress
;
155 char *szNISHomeMapName
;
156 char *szAnnounceVersion
; /* This is initialised in init_globals */
157 char *szNetbiosAliases
;
158 char *szDomainOtherSIDs
;
159 char *szDomainGroups
;
160 char *szNameResolveOrder
;
165 char *szLdapRootPassword
;
167 char *szAddUserScript
;
168 char *szDelUserScript
;
173 char *szUtmpHostname
;
174 BOOL bUtmpConsolidate
;
175 #endif /* WITH_UTMP */
179 char *szTemplateHomedir
;
180 char *szTemplateShell
;
181 char *szWinbindSeparator
;
203 int client_code_page
;
204 int announce_as
; /* This is initialised in init_globals */
205 int machine_password_timeout
;
206 int change_notify_timeout
;
209 int min_passwd_length
;
210 int oplock_break_wait_time
;
211 int winbind_cache_time
;
214 #endif /* WITH_LDAP */
217 char *sslHostsRequire
;
218 char *sslHostsResign
;
224 char *sslClientPrivKey
;
227 BOOL sslReqClientCert
;
228 BOOL sslReqServerCert
;
229 BOOL sslCompatibility
;
230 #endif /* WITH_SSL */
231 BOOL bMsAddPrinterWizard
;
236 BOOL bPreferredMaster
;
239 BOOL bEncryptPasswords
;
247 BOOL bReadPrediction
;
254 BOOL bBindInterfacesOnly
;
255 BOOL bUnixPasswdSync
;
256 BOOL bPasswdChatDebug
;
263 BOOL bAllowTrustedDomains
;
264 BOOL bRestrictAnonymous
;
265 BOOL bDebugHiresTimestamp
;
272 static global Globals
;
277 * This structure describes a single service.
286 char *szGuestaccount
;
287 char *szInvalidUsers
;
295 char *szRootPostExec
;
296 char *szPrintcommand
;
299 char *szLppausecommand
;
300 char *szLpresumecommand
;
301 char *szQueuepausecommand
;
302 char *szQueueresumecommand
;
304 char *szPrinterDriver
;
305 char *szPrinterDriverLocation
;
315 char *szVetoOplockFiles
;
324 char *szVfsObjectFile
;
330 int iCreate_force_mode
;
332 int iSecurity_force_mode
;
335 int iDir_Security_mask
;
336 int iDir_Security_force_mode
;
340 int iOplockContentionLimit
;
343 BOOL bRootpreexecClose
;
346 BOOL bShortCasePreserve
;
378 BOOL bDeleteReadonly
;
380 BOOL bDeleteVetoFiles
;
382 BOOL bDosFiletimeResolution
;
383 BOOL bFakeDirCreateTimes
;
388 char dummy
[3]; /* for alignment */
393 /* This is a default service used to prime a services structure */
394 static service sDefault
= {
396 False
, /* not autoloaded */
397 NULL
, /* szService */
399 NULL
, /* szUsername */
400 NULL
, /* szGuestAccount - this is set in init_globals() */
401 NULL
, /* szInvalidUsers */
402 NULL
, /* szValidUsers */
403 NULL
, /* szAdminUsers */
405 NULL
, /* szInclude */
406 NULL
, /* szPreExec */
407 NULL
, /* szPostExec */
408 NULL
, /* szRootPreExec */
409 NULL
, /* szRootPostExec */
410 NULL
, /* szPrintcommand */
411 NULL
, /* szLpqcommand */
412 NULL
, /* szLprmcommand */
413 NULL
, /* szLppausecommand */
414 NULL
, /* szLpresumecommand */
415 NULL
, /* szQueuepausecommand */
416 NULL
, /* szQueueresumecommand */
417 NULL
, /* szPrintername */
418 NULL
, /* szPrinterDriver - this is set in init_globals() */
419 NULL
, /* szPrinterDriverLocation */
420 NULL
, /* szDriverFile */
421 NULL
, /* szDontdescend */
422 NULL
, /* szHostsallow */
423 NULL
, /* szHostsdeny */
424 NULL
, /* szMagicScript */
425 NULL
, /* szMagicOutput */
426 NULL
, /* szMangledMap */
427 NULL
, /* szVetoFiles */
428 NULL
, /* szHideFiles */
429 NULL
, /* szVetoOplockFiles */
431 NULL
, /* force user */
432 NULL
, /* force group */
434 NULL
, /* writelist */
435 NULL
, /* printer admin */
438 NULL
, /* vfs object */
439 NULL
, /* vfs options */
440 0, /* iMinPrintSpace */
441 1000, /* iMaxPrintJobs */
442 0, /* iWriteCacheSize */
443 0744, /* iCreate_mask */
444 0000, /* iCreate_force_mode */
445 -1, /* iSecurity_mask */
446 -1, /* iSecurity_force_mode */
447 0755, /* iDir_mask */
448 0000, /* iDir_force_mode */
449 -1, /* iDir_Security_mask */
450 -1, /* iDir_Security_force_mode */
451 0, /* iMaxConnections */
452 CASE_LOWER
, /* iDefaultCase */
453 DEFAULT_PRINTING
, /* iPrinting */
454 2, /* iOplockContentionLimit */
455 False
, /* bAlternatePerm */
456 False
, /* bPreexecClose */
457 False
, /* bRootpreexecClose */
458 False
, /* case sensitive */
459 True
, /* case preserve */
460 True
, /* short case preserve */
461 False
, /* case mangle */
463 True
, /* bHideDotFiles */
464 True
, /* bBrowseable */
465 True
, /* bAvailable */
466 True
, /* bRead_only */
467 True
, /* bNo_set_dir */
468 False
, /* bGuest_only */
469 False
, /* bGuest_ok */
470 False
, /* bPrint_ok */
471 False
, /* bPostscript */
472 False
, /* bMap_system */
473 False
, /* bMap_hidden */
474 True
, /* bMap_archive */
476 False
, /* bStrictLocking */
477 True
, /* bPosixLocking */
481 True
, /* bShareModes */
483 True
, /* bLevel2OpLocks */
484 False
, /* bOnlyUser */
485 True
, /* bMangledNames */
486 True
, /* bWidelinks */
487 True
, /* bSymlinks */
488 False
, /* bSyncAlways */
489 False
, /* bStrictSync */
490 '~', /* magic char */
492 False
, /* bDeleteReadonly */
493 False
, /* bFakeOplocks */
494 False
, /* bDeleteVetoFiles */
495 False
, /* bDosFiletimes */
496 False
, /* bDosFiletimeResolution */
497 False
, /* bFakeDirCreateTimes */
498 True
, /* bBlockingLocks */
499 False
, /* bInheritPerms */
500 False
, /* bMSDfsRoot */
507 /* local variables */
508 static service
**ServicePtrs
= NULL
;
509 static int iNumServices
= 0;
510 static int iServiceIndex
= 0;
511 static BOOL bInGlobalSection
= True
;
512 static BOOL bGlobalOnly
= False
;
513 static int server_role
;
514 static int default_server_announce
;
516 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
518 /* prototypes for the special type handlers */
519 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
);
520 static BOOL
handle_include(char *pszParmValue
, char **ptr
);
521 static BOOL
handle_copy(char *pszParmValue
, char **ptr
);
522 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
);
523 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
);
524 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
);
525 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
);
526 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
);
527 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
);
528 static BOOL
handle_winbind_id(char *pszParmValue
, char **ptr
);
529 static BOOL
handle_wins_server_list(char *pszParmValue
, char **ptr
);
531 static void set_server_role(void);
532 static void set_default_server_announce_type(void);
534 static struct enum_list enum_protocol
[] = {
535 {PROTOCOL_NT1
, "NT1"},
536 {PROTOCOL_LANMAN2
, "LANMAN2"},
537 {PROTOCOL_LANMAN1
, "LANMAN1"},
538 {PROTOCOL_CORE
, "CORE"},
539 {PROTOCOL_COREPLUS
, "COREPLUS"},
540 {PROTOCOL_COREPLUS
, "CORE+"},
544 static struct enum_list enum_security
[] = {
545 {SEC_SHARE
, "SHARE"},
547 {SEC_SERVER
, "SERVER"},
548 {SEC_DOMAIN
, "DOMAIN"},
552 static struct enum_list enum_printing
[] = {
553 {PRINT_SYSV
, "sysv"},
555 {PRINT_HPUX
, "hpux"},
559 {PRINT_LPRNG
, "lprng"},
560 {PRINT_SOFTQ
, "softq"},
561 {PRINT_CUPS
, "cups"},
563 {PRINT_LPROS2
, "os2"},
567 /* Types of machine we can announce as. */
568 #define ANNOUNCE_AS_NT_SERVER 1
569 #define ANNOUNCE_AS_WIN95 2
570 #define ANNOUNCE_AS_WFW 3
571 #define ANNOUNCE_AS_NT_WORKSTATION 4
573 static struct enum_list enum_announce_as
[] = {
574 {ANNOUNCE_AS_NT_SERVER
, "NT"},
575 {ANNOUNCE_AS_NT_SERVER
, "NT Server"},
576 {ANNOUNCE_AS_NT_WORKSTATION
, "NT Workstation"},
577 {ANNOUNCE_AS_WIN95
, "win95"},
578 {ANNOUNCE_AS_WFW
, "WfW"},
582 static struct enum_list enum_case
[] = {
583 {CASE_LOWER
, "lower"},
584 {CASE_UPPER
, "upper"},
588 static struct enum_list enum_bool_auto
[] = {
600 Do you want session setups at user level security with a invalid
601 password to be rejected or allowed in as guest? WinNT rejects them
602 but it can be a pain as it means "net view" needs to use a password
604 You have 3 choices in the setting of map_to_guest:
606 "Never" means session setups with an invalid password
607 are rejected. This is the default.
609 "Bad User" means session setups with an invalid password
610 are rejected, unless the username does not exist, in which case it
611 is treated as a guest login
613 "Bad Password" means session setups with an invalid password
614 are treated as a guest login
616 Note that map_to_guest only has an effect in user or server
620 static struct enum_list enum_map_to_guest
[] = {
621 {NEVER_MAP_TO_GUEST
, "Never"},
622 {MAP_TO_GUEST_ON_BAD_USER
, "Bad User"},
623 {MAP_TO_GUEST_ON_BAD_PASSWORD
, "Bad Password"},
628 static struct enum_list enum_ssl_version
[] = {
629 {SMB_SSL_V2
, "ssl2"},
630 {SMB_SSL_V3
, "ssl3"},
631 {SMB_SSL_V23
, "ssl2or3"},
632 {SMB_SSL_TLS1
, "tls1"},
637 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
638 static struct parm_struct parm_table
[] = {
639 {"Base Options", P_SEP
, P_SEPARATOR
},
641 {"coding system", P_STRING
, P_GLOBAL
, &Globals
.szCodingSystem
, handle_coding_system
, NULL
, 0},
642 {"client code page", P_INTEGER
, P_GLOBAL
, &Globals
.client_code_page
, handle_client_code_page
, NULL
, 0},
643 {"code page directory", P_STRING
, P_GLOBAL
, &Globals
.szCodePageDir
, NULL
, NULL
, 0},
644 {"comment", P_STRING
, P_LOCAL
, &sDefault
.comment
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
645 {"path", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
646 {"directory", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_DOS_STRING
},
647 {"workgroup", P_USTRING
, P_GLOBAL
, &Globals
.szWorkGroup
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
648 {"netbios name", P_UGSTRING
, P_GLOBAL
, global_myname
, handle_netbios_name
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
649 {"netbios aliases", P_STRING
, P_GLOBAL
, &Globals
.szNetbiosAliases
, NULL
, NULL
, FLAG_DOS_STRING
},
650 {"netbios scope", P_UGSTRING
, P_GLOBAL
, global_scope
, NULL
, NULL
, FLAG_DOS_STRING
},
651 {"server string", P_STRING
, P_GLOBAL
, &Globals
.szServerString
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
652 {"interfaces", P_STRING
, P_GLOBAL
, &Globals
.szInterfaces
, NULL
, NULL
, FLAG_BASIC
},
653 {"bind interfaces only", P_BOOL
, P_GLOBAL
, &Globals
.bBindInterfacesOnly
, NULL
, NULL
, 0},
655 {"Security Options", P_SEP
, P_SEPARATOR
},
657 {"security", P_ENUM
, P_GLOBAL
, &Globals
.security
, NULL
, enum_security
, FLAG_BASIC
},
658 {"encrypt passwords", P_BOOL
, P_GLOBAL
, &Globals
.bEncryptPasswords
, NULL
, NULL
, FLAG_BASIC
},
659 {"update encrypted", P_BOOL
, P_GLOBAL
, &Globals
.bUpdateEncrypt
, NULL
, NULL
, FLAG_BASIC
},
660 {"allow trusted domains", P_BOOL
, P_GLOBAL
, &Globals
.bAllowTrustedDomains
, NULL
, NULL
, 0},
661 {"alternate permissions", P_BOOL
, P_LOCAL
, &sDefault
.bAlternatePerm
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_DEPRECATED
},
662 {"hosts equiv", P_STRING
, P_GLOBAL
, &Globals
.szHostsEquiv
, NULL
, NULL
, 0},
663 {"min passwd length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
664 {"min password length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
665 {"map to guest", P_ENUM
, P_GLOBAL
, &Globals
.map_to_guest
, NULL
, enum_map_to_guest
, 0},
666 {"null passwords", P_BOOL
, P_GLOBAL
, &Globals
.bNullPasswords
, NULL
, NULL
, 0},
667 {"password server", P_STRING
, P_GLOBAL
, &Globals
.szPasswordServer
, NULL
, NULL
, 0},
668 /* #ifdef WITH_TDBPWD
669 {"tdb passwd file", P_STRING, P_GLOBAL, &Globals.szTDBPasswdFile, NULL, NULL, 0},
671 {"smb passwd file", P_STRING
, P_GLOBAL
, &Globals
.szSMBPasswdFile
, NULL
, NULL
, 0},
673 {"passdb module path", P_STRING
, P_GLOBAL
, &Globals
.szPassdbModulePath
, NULL
, NULL
, 0},
674 {"root directory", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
675 {"root dir", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
676 {"root", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
678 {"passwd program", P_STRING
, P_GLOBAL
, &Globals
.szPasswdProgram
, NULL
, NULL
, 0},
679 {"passwd chat", P_STRING
, P_GLOBAL
, &Globals
.szPasswdChat
, NULL
, NULL
, 0},
680 {"passwd chat debug", P_BOOL
, P_GLOBAL
, &Globals
.bPasswdChatDebug
, NULL
, NULL
, 0},
681 {"username map", P_STRING
, P_GLOBAL
, &Globals
.szUsernameMap
, NULL
, NULL
, 0},
682 {"password level", P_INTEGER
, P_GLOBAL
, &Globals
.pwordlevel
, NULL
, NULL
, 0},
683 {"username level", P_INTEGER
, P_GLOBAL
, &Globals
.unamelevel
, NULL
, NULL
, 0},
684 {"unix password sync", P_BOOL
, P_GLOBAL
, &Globals
.bUnixPasswdSync
, NULL
, NULL
, 0},
685 {"restrict anonymous", P_BOOL
, P_GLOBAL
, &Globals
.bRestrictAnonymous
, NULL
, NULL
, 0},
686 {"use rhosts", P_BOOL
, P_GLOBAL
, &Globals
.bUseRhosts
, NULL
, NULL
, 0},
688 {"username", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
689 {"user", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
690 {"users", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
692 {"guest account", P_STRING
, P_LOCAL
, &sDefault
.szGuestaccount
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_GLOBAL
},
693 {"invalid users", P_STRING
, P_LOCAL
, &sDefault
.szInvalidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
694 {"valid users", P_STRING
, P_LOCAL
, &sDefault
.szValidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
695 {"admin users", P_STRING
, P_LOCAL
, &sDefault
.szAdminUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
696 {"read list", P_STRING
, P_LOCAL
, &sDefault
.readlist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
697 {"write list", P_STRING
, P_LOCAL
, &sDefault
.writelist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
698 {"printer admin", P_STRING
, P_LOCAL
, &sDefault
.printer_admin
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
699 {"force user", P_STRING
, P_LOCAL
, &sDefault
.force_user
, NULL
, NULL
, FLAG_SHARE
},
700 {"force group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, FLAG_SHARE
},
701 {"group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, 0},
703 {"read only", P_BOOL
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
},
704 {"write ok", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
705 {"writeable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
706 {"writable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
708 {"create mask", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
709 {"create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
},
710 {"force create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
711 {"security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
712 {"force security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
713 {"directory mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
714 {"directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
},
715 {"force directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
716 {"directory security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
717 {"force directory security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
718 {"inherit permissions", P_BOOL
, P_LOCAL
, &sDefault
.bInheritPerms
, NULL
, NULL
, FLAG_SHARE
},
719 {"guest only", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, FLAG_SHARE
},
720 {"only guest", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, 0},
722 {"guest ok", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
723 {"public", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, 0},
725 {"only user", P_BOOL
, P_LOCAL
, &sDefault
.bOnlyUser
, NULL
, NULL
, FLAG_SHARE
},
726 {"hosts allow", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
727 {"allow hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, 0},
728 {"hosts deny", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
729 {"deny hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, 0},
732 {"Secure Socket Layer Options", P_SEP
, P_SEPARATOR
},
733 {"ssl", P_BOOL
, P_GLOBAL
, &Globals
.sslEnabled
, NULL
, NULL
, 0},
735 {"ssl hosts", P_STRING
, P_GLOBAL
, &Globals
.sslHostsRequire
, NULL
, NULL
, 0},
736 {"ssl hosts resign", P_STRING
, P_GLOBAL
, &Globals
.sslHostsResign
, NULL
, NULL
, 0},
737 {"ssl CA certDir", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertDir
, NULL
, NULL
, 0},
738 {"ssl CA certFile", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertFile
, NULL
, NULL
, 0},
739 {"ssl server cert", P_STRING
, P_GLOBAL
, &Globals
.sslCert
, NULL
, NULL
, 0},
740 {"ssl server key", P_STRING
, P_GLOBAL
, &Globals
.sslPrivKey
, NULL
, NULL
, 0},
741 {"ssl client cert", P_STRING
, P_GLOBAL
, &Globals
.sslClientCert
, NULL
, NULL
, 0},
742 {"ssl client key", P_STRING
, P_GLOBAL
, &Globals
.sslClientPrivKey
, NULL
, NULL
, 0},
743 {"ssl require clientcert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqClientCert
, NULL
, NULL
, 0},
744 {"ssl require servercert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqServerCert
, NULL
, NULL
, 0},
745 {"ssl ciphers", P_STRING
, P_GLOBAL
, &Globals
.sslCiphers
, NULL
, NULL
, 0},
746 {"ssl version", P_ENUM
, P_GLOBAL
, &Globals
.sslVersion
, NULL
, enum_ssl_version
, 0},
747 {"ssl compatibility", P_BOOL
, P_GLOBAL
, &Globals
.sslCompatibility
, NULL
, NULL
, 0},
748 #endif /* WITH_SSL */
750 {"Logging Options", P_SEP
, P_SEPARATOR
},
751 {"log level", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL
, NULL
, NULL
, FLAG_BASIC
},
752 {"debuglevel", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL
, NULL
, NULL
, 0},
753 {"syslog", P_INTEGER
, P_GLOBAL
, &Globals
.syslog
, NULL
, NULL
, 0},
754 {"syslog only", P_BOOL
, P_GLOBAL
, &Globals
.bSyslogOnly
, NULL
, NULL
, 0},
755 {"log file", P_STRING
, P_GLOBAL
, &Globals
.szLogFile
, NULL
, NULL
, 0},
757 {"max log size", P_INTEGER
, P_GLOBAL
, &Globals
.max_log_size
, NULL
, NULL
, 0},
758 {"timestamp logs", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
759 {"debug timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
760 {"debug hires timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bDebugHiresTimestamp
, NULL
, NULL
, 0},
761 {"debug pid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugPid
, NULL
, NULL
, 0},
762 {"debug uid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugUid
, NULL
, NULL
, 0},
764 {"status", P_BOOL
, P_LOCAL
, &sDefault
.status
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
| FLAG_PRINT
},
766 {"Protocol Options", P_SEP
, P_SEPARATOR
},
768 {"protocol", P_ENUM
, P_GLOBAL
, &Globals
.maxprotocol
, NULL
, enum_protocol
, 0},
769 {"read bmpx", P_BOOL
, P_GLOBAL
, &Globals
.bReadbmpx
, NULL
, NULL
, 0},
770 {"read raw", P_BOOL
, P_GLOBAL
, &Globals
.bReadRaw
, NULL
, NULL
, 0},
771 {"write raw", P_BOOL
, P_GLOBAL
, &Globals
.bWriteRaw
, NULL
, NULL
, 0},
773 {"nt smb support", P_BOOL
, P_GLOBAL
, &Globals
.bNTSmbSupport
, NULL
, NULL
, 0},
774 {"nt pipe support", P_BOOL
, P_GLOBAL
, &Globals
.bNTPipeSupport
, NULL
, NULL
, 0},
775 {"nt acl support", P_BOOL
, P_GLOBAL
, &Globals
.bNTAclSupport
, NULL
, NULL
, 0},
776 {"announce version", P_STRING
, P_GLOBAL
, &Globals
.szAnnounceVersion
, NULL
, NULL
, 0},
777 {"announce as", P_ENUM
, P_GLOBAL
, &Globals
.announce_as
, NULL
, enum_announce_as
, 0},
778 {"max mux", P_INTEGER
, P_GLOBAL
, &Globals
.max_mux
, NULL
, NULL
, 0},
779 {"max xmit", P_INTEGER
, P_GLOBAL
, &Globals
.max_xmit
, NULL
, NULL
, 0},
781 {"name resolve order", P_STRING
, P_GLOBAL
, &Globals
.szNameResolveOrder
, NULL
, NULL
, 0},
782 {"max packet", P_INTEGER
, P_GLOBAL
, &Globals
.max_packet
, NULL
, NULL
, 0},
783 {"packet size", P_INTEGER
, P_GLOBAL
, &Globals
.max_packet
, NULL
, NULL
, 0},
784 {"max ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_ttl
, NULL
, NULL
, 0},
785 {"max wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_wins_ttl
, NULL
, NULL
, 0},
786 {"min wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.min_wins_ttl
, NULL
, NULL
, 0},
787 {"time server", P_BOOL
, P_GLOBAL
, &Globals
.bTimeServer
, NULL
, NULL
, 0},
789 {"Tuning Options", P_SEP
, P_SEPARATOR
},
791 {"change notify timeout", P_INTEGER
, P_GLOBAL
, &Globals
.change_notify_timeout
, NULL
, NULL
, 0},
792 {"deadtime", P_INTEGER
, P_GLOBAL
, &Globals
.deadtime
, NULL
, NULL
, 0},
793 {"getwd cache", P_BOOL
, P_GLOBAL
, &use_getwd_cache
, NULL
, NULL
, 0},
794 {"keepalive", P_INTEGER
, P_GLOBAL
, &keepalive
, NULL
, NULL
, 0},
796 {"lpq cache time", P_INTEGER
, P_GLOBAL
, &Globals
.lpqcachetime
, NULL
, NULL
, 0},
797 {"max connections", P_INTEGER
, P_LOCAL
, &sDefault
.iMaxConnections
, NULL
, NULL
, FLAG_SHARE
},
798 {"max disk size", P_INTEGER
, P_GLOBAL
, &Globals
.maxdisksize
, NULL
, NULL
, 0},
799 {"max open files", P_INTEGER
, P_GLOBAL
, &Globals
.max_open_files
, NULL
, NULL
, 0},
800 {"min print space", P_INTEGER
, P_LOCAL
, &sDefault
.iMinPrintSpace
, NULL
, NULL
, FLAG_PRINT
},
801 {"read size", P_INTEGER
, P_GLOBAL
, &Globals
.ReadSize
, NULL
, NULL
, 0},
803 {"socket options", P_GSTRING
, P_GLOBAL
, user_socket_options
, NULL
, NULL
, 0},
804 {"stat cache size", P_INTEGER
, P_GLOBAL
, &Globals
.stat_cache_size
, NULL
, NULL
, 0},
805 {"strict sync", P_BOOL
, P_LOCAL
, &sDefault
.bStrictSync
, NULL
, NULL
, FLAG_SHARE
},
806 {"sync always", P_BOOL
, P_LOCAL
, &sDefault
.bSyncAlways
, NULL
, NULL
, FLAG_SHARE
},
807 {"write cache size", P_INTEGER
, P_LOCAL
, &sDefault
.iWriteCacheSize
, NULL
, NULL
, FLAG_SHARE
},
809 {"Printing Options", P_SEP
, P_SEPARATOR
},
811 {"max print jobs", P_INTEGER
, P_LOCAL
, &sDefault
.iMaxPrintJobs
, NULL
, NULL
, FLAG_PRINT
},
812 {"load printers", P_BOOL
, P_GLOBAL
, &Globals
.bLoadPrinters
, NULL
, NULL
, FLAG_PRINT
},
813 {"printcap name", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, FLAG_PRINT
},
814 {"printcap", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, 0},
815 {"printable", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, FLAG_PRINT
},
816 {"print ok", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, 0},
817 {"postscript", P_BOOL
, P_LOCAL
, &sDefault
.bPostscript
, NULL
, NULL
, FLAG_PRINT
},
818 {"printing", P_ENUM
, P_LOCAL
, &sDefault
.iPrinting
, NULL
, enum_printing
, FLAG_PRINT
| FLAG_GLOBAL
},
819 {"print command", P_STRING
, P_LOCAL
, &sDefault
.szPrintcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
820 {"lpq command", P_STRING
, P_LOCAL
, &sDefault
.szLpqcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
821 {"lprm command", P_STRING
, P_LOCAL
, &sDefault
.szLprmcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
822 {"lppause command", P_STRING
, P_LOCAL
, &sDefault
.szLppausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
823 {"lpresume command", P_STRING
, P_LOCAL
, &sDefault
.szLpresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
824 {"queuepause command", P_STRING
, P_LOCAL
, &sDefault
.szQueuepausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
825 {"queueresume command", P_STRING
, P_LOCAL
, &sDefault
.szQueueresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
827 {"enumports command", P_STRING
, P_GLOBAL
, &Globals
.szEnumPortsCommand
, NULL
, NULL
, 0},
828 {"addprinter command", P_STRING
, P_GLOBAL
, &Globals
.szAddPrinterCommand
, NULL
, NULL
, 0},
829 {"deleteprinter command", P_STRING
, P_GLOBAL
, &Globals
.szDeletePrinterCommand
, NULL
, NULL
, 0},
830 {"show add printer wizard", P_BOOL
, P_GLOBAL
, &Globals
.bMsAddPrinterWizard
, NULL
, NULL
, 0},
832 {"printer name", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, FLAG_PRINT
},
833 {"printer", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, 0},
834 {"printer driver", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriver
, NULL
, NULL
, FLAG_PRINT
},
835 {"printer driver file", P_STRING
, P_LOCAL
, &sDefault
.szDriverFile
, NULL
, NULL
, FLAG_PRINT
},
836 {"printer driver location", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriverLocation
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
838 {"Filename Handling", P_SEP
, P_SEPARATOR
},
839 {"strip dot", P_BOOL
, P_GLOBAL
, &Globals
.bStripDot
, NULL
, NULL
, 0},
841 {"character set", P_STRING
, P_GLOBAL
, &Globals
.szCharacterSet
, handle_character_set
, NULL
, 0},
842 {"mangled stack", P_INTEGER
, P_GLOBAL
, &Globals
.mangled_stack
, NULL
, NULL
, 0},
843 {"default case", P_ENUM
, P_LOCAL
, &sDefault
.iDefaultCase
, NULL
, enum_case
, FLAG_SHARE
},
844 {"case sensitive", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
845 {"casesignames", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, 0},
846 {"preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
847 {"short preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bShortCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
848 {"mangle case", P_BOOL
, P_LOCAL
, &sDefault
.bCaseMangle
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
849 {"mangling char", P_CHAR
, P_LOCAL
, &sDefault
.magic_char
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
850 {"hide dot files", P_BOOL
, P_LOCAL
, &sDefault
.bHideDotFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
851 {"delete veto files", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
852 {"veto files", P_STRING
, P_LOCAL
, &sDefault
.szVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
853 {"hide files", P_STRING
, P_LOCAL
, &sDefault
.szHideFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
854 {"veto oplock files", P_STRING
, P_LOCAL
, &sDefault
.szVetoOplockFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
855 {"map system", P_BOOL
, P_LOCAL
, &sDefault
.bMap_system
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
856 {"map hidden", P_BOOL
, P_LOCAL
, &sDefault
.bMap_hidden
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
857 {"map archive", P_BOOL
, P_LOCAL
, &sDefault
.bMap_archive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
858 {"mangled names", P_BOOL
, P_LOCAL
, &sDefault
.bMangledNames
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
859 {"mangled map", P_STRING
, P_LOCAL
, &sDefault
.szMangledMap
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
860 {"stat cache", P_BOOL
, P_GLOBAL
, &Globals
.bStatCache
, NULL
, NULL
, 0},
862 {"Domain Options", P_SEP
, P_SEPARATOR
},
864 {"domain groups", P_STRING
, P_GLOBAL
, &Globals
.szDomainGroups
, NULL
, NULL
, 0},
865 {"domain admin group", P_STRING
, P_GLOBAL
, &Globals
.szDomainAdminGroup
, NULL
, NULL
, 0},
866 {"domain guest group", P_STRING
, P_GLOBAL
, &Globals
.szDomainGuestGroup
, NULL
, NULL
, 0},
867 {"domain admin users", P_STRING
, P_GLOBAL
, &Globals
.szDomainAdminUsers
, NULL
, NULL
, 0},
868 {"domain guest users", P_STRING
, P_GLOBAL
, &Globals
.szDomainGuestUsers
, NULL
, NULL
, 0},
869 #ifdef USING_GROUPNAME_MAP
871 {"groupname map", P_STRING
, P_GLOBAL
, &Globals
.szGroupnameMap
, NULL
, NULL
, 0},
872 #endif /* USING_GROUPNAME_MAP */
874 {"machine password timeout", P_INTEGER
, P_GLOBAL
, &Globals
.machine_password_timeout
, NULL
, NULL
, 0},
876 {"Logon Options", P_SEP
, P_SEPARATOR
},
878 {"add user script", P_STRING
, P_GLOBAL
, &Globals
.szAddUserScript
, NULL
, NULL
, 0},
879 {"delete user script", P_STRING
, P_GLOBAL
, &Globals
.szDelUserScript
, NULL
, NULL
, 0},
880 {"logon script", P_STRING
, P_GLOBAL
, &Globals
.szLogonScript
, NULL
, NULL
, FLAG_DOS_STRING
},
881 {"logon path", P_STRING
, P_GLOBAL
, &Globals
.szLogonPath
, NULL
, NULL
, FLAG_DOS_STRING
},
882 {"logon drive", P_STRING
, P_GLOBAL
, &Globals
.szLogonDrive
, NULL
, NULL
, 0},
883 {"logon home", P_STRING
, P_GLOBAL
, &Globals
.szLogonHome
, NULL
, NULL
, FLAG_DOS_STRING
},
884 {"domain logons", P_BOOL
, P_GLOBAL
, &Globals
.bDomainLogons
, NULL
, NULL
, 0},
886 {"Browse Options", P_SEP
, P_SEPARATOR
},
888 {"os level", P_INTEGER
, P_GLOBAL
, &Globals
.os_level
, NULL
, NULL
, FLAG_BASIC
},
889 {"lm announce", P_ENUM
, P_GLOBAL
, &Globals
.lm_announce
, NULL
, enum_bool_auto
, 0},
890 {"lm interval", P_INTEGER
, P_GLOBAL
, &Globals
.lm_interval
, NULL
, NULL
, 0},
891 {"preferred master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
892 {"prefered master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_HIDE
},
893 {"local master", P_BOOL
, P_GLOBAL
, &Globals
.bLocalMaster
, NULL
, NULL
, FLAG_BASIC
},
894 {"domain master", P_ENUM
, P_GLOBAL
, &Globals
.bDomainMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
895 {"browse list", P_BOOL
, P_GLOBAL
, &Globals
.bBrowseList
, NULL
, NULL
, 0},
896 {"browseable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
897 {"browsable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, 0},
899 {"WINS Options", P_SEP
, P_SEPARATOR
},
900 {"dns proxy", P_BOOL
, P_GLOBAL
, &Globals
.bDNSproxy
, NULL
, NULL
, 0},
901 {"wins proxy", P_BOOL
, P_GLOBAL
, &Globals
.bWINSproxy
, NULL
, NULL
, 0},
903 {"wins server", P_STRING
, P_GLOBAL
, &Globals
.szWINSserver
, handle_wins_server_list
, NULL
, FLAG_BASIC
},
904 {"wins support", P_BOOL
, P_GLOBAL
, &Globals
.bWINSsupport
, NULL
, NULL
, FLAG_BASIC
},
905 {"wins hook", P_STRING
, P_GLOBAL
, &Globals
.szWINSHook
, NULL
, NULL
, 0},
907 {"Locking Options", P_SEP
, P_SEPARATOR
},
909 {"blocking locks", P_BOOL
, P_LOCAL
, &sDefault
.bBlockingLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
910 {"fake oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bFakeOplocks
, NULL
, NULL
, FLAG_SHARE
},
911 {"kernel oplocks", P_BOOL
, P_GLOBAL
, &Globals
.bKernelOplocks
, NULL
, NULL
, FLAG_GLOBAL
},
912 {"locking", P_BOOL
, P_LOCAL
, &sDefault
.bLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
914 {"utmp", P_BOOL
, P_LOCAL
, &sDefault
.bUtmp
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
917 {"oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bOpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
918 {"level2 oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bLevel2OpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
919 {"oplock break wait time", P_INTEGER
, P_GLOBAL
, &Globals
.oplock_break_wait_time
, NULL
, NULL
, FLAG_GLOBAL
},
920 {"oplock contention limit", P_INTEGER
, P_LOCAL
, &sDefault
.iOplockContentionLimit
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
921 {"posix locking", P_BOOL
, P_LOCAL
, &sDefault
.bPosixLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
922 {"strict locking", P_BOOL
, P_LOCAL
, &sDefault
.bStrictLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
923 {"share modes", P_BOOL
, P_LOCAL
, &sDefault
.bShareModes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
926 {"Ldap Options", P_SEP
, P_SEPARATOR
},
928 {"ldap server", P_STRING
, P_GLOBAL
, &Globals
.szLdapServer
, NULL
, NULL
, 0},
929 {"ldap port", P_INTEGER
, P_GLOBAL
, &Globals
.ldap_port
, NULL
, NULL
, 0},
930 {"ldap suffix", P_STRING
, P_GLOBAL
, &Globals
.szLdapSuffix
, NULL
, NULL
, 0},
931 {"ldap filter", P_STRING
, P_GLOBAL
, &Globals
.szLdapFilter
, NULL
, NULL
, 0},
932 {"ldap root", P_STRING
, P_GLOBAL
, &Globals
.szLdapRoot
, NULL
, NULL
, 0},
933 {"ldap root passwd", P_STRING
, P_GLOBAL
, &Globals
.szLdapRootPassword
, NULL
, NULL
, 0},
934 #endif /* WITH_LDAP */
936 {"Miscellaneous Options", P_SEP
, P_SEPARATOR
},
937 {"smbrun", P_STRING
, P_GLOBAL
, &Globals
.szSmbrun
, NULL
, NULL
, 0},
939 {"config file", P_STRING
, P_GLOBAL
, &Globals
.szConfigFile
, NULL
, NULL
, FLAG_HIDE
},
940 {"preload", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, 0},
941 {"auto services", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, 0},
942 {"lock dir", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
943 {"lock directory", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
945 {"utmp dir", P_STRING
, P_GLOBAL
, &Globals
.szUtmpDir
, NULL
, NULL
, 0},
946 {"utmp directory", P_STRING
, P_GLOBAL
, &Globals
.szUtmpDir
, NULL
, NULL
, 0},
947 {"wtmp dir", P_STRING
, P_GLOBAL
, &Globals
.szWtmpDir
, NULL
, NULL
, 0},
948 {"wtmp directory", P_STRING
, P_GLOBAL
, &Globals
.szWtmpDir
, NULL
, NULL
, 0},
949 {"utmp hostname", P_STRING
, P_GLOBAL
, &Globals
.szUtmpHostname
, NULL
, NULL
, 0},
950 {"utmp consolidate", P_BOOL
, P_GLOBAL
, &Globals
.bUtmpConsolidate
, NULL
, NULL
, 0},
951 #endif /* WITH_UTMP */
953 {"default service", P_STRING
, P_GLOBAL
,
954 &Globals
.szDefaultService
, NULL
, NULL
, 0},
955 {"default", P_STRING
, P_GLOBAL
, &Globals
.szDefaultService
, NULL
, NULL
, 0},
956 {"message command", P_STRING
, P_GLOBAL
, &Globals
.szMsgCommand
, NULL
, NULL
, 0},
957 {"dfree command", P_STRING
, P_GLOBAL
, &Globals
.szDfree
, NULL
, NULL
, 0},
958 {"valid chars", P_STRING
, P_GLOBAL
, &Globals
.szValidChars
, handle_valid_chars
, NULL
, 0},
959 {"remote announce", P_STRING
, P_GLOBAL
, &Globals
.szRemoteAnnounce
, NULL
, NULL
, 0},
960 {"remote browse sync", P_STRING
, P_GLOBAL
, &Globals
.szRemoteBrowseSync
, NULL
, NULL
, 0},
961 {"socket address", P_STRING
, P_GLOBAL
, &Globals
.szSocketAddress
, NULL
, NULL
, 0},
962 {"homedir map", P_STRING
, P_GLOBAL
, &Globals
.szNISHomeMapName
, NULL
, NULL
, 0},
963 {"time offset", P_INTEGER
, P_GLOBAL
, &extra_time_offset
, NULL
, NULL
, 0},
964 {"unix realname", P_BOOL
, P_GLOBAL
, &Globals
.bUnixRealname
, NULL
, NULL
, 0},
965 {"NIS homedir", P_BOOL
, P_GLOBAL
, &Globals
.bNISHomeMap
, NULL
, NULL
, 0},
966 {"-valid", P_BOOL
, P_LOCAL
, &sDefault
.valid
, NULL
, NULL
, FLAG_HIDE
},
968 {"copy", P_STRING
, P_LOCAL
, &sDefault
.szCopy
, handle_copy
, NULL
, FLAG_HIDE
},
969 {"include", P_STRING
, P_LOCAL
, &sDefault
.szInclude
, handle_include
, NULL
, FLAG_HIDE
},
970 {"exec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
971 {"preexec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, 0},
973 {"preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bPreexecClose
, NULL
, NULL
, FLAG_SHARE
},
974 {"postexec", P_STRING
, P_LOCAL
, &sDefault
.szPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
975 {"root preexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
976 {"root preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bRootpreexecClose
, NULL
, NULL
, FLAG_SHARE
},
977 {"root postexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
978 {"available", P_BOOL
, P_LOCAL
, &sDefault
.bAvailable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
979 {"volume", P_STRING
, P_LOCAL
, &sDefault
.volume
, NULL
, NULL
, FLAG_SHARE
},
980 {"fstype", P_STRING
, P_LOCAL
, &sDefault
.fstype
, NULL
, NULL
, FLAG_SHARE
},
981 {"set directory", P_BOOLREV
, P_LOCAL
, &sDefault
.bNo_set_dir
, NULL
, NULL
, FLAG_SHARE
},
982 {"source environment", P_STRING
, P_GLOBAL
, &Globals
.szSourceEnv
, handle_source_env
, NULL
, 0},
983 {"wide links", P_BOOL
, P_LOCAL
, &sDefault
.bWidelinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
984 {"follow symlinks", P_BOOL
, P_LOCAL
, &sDefault
.bSymlinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
985 {"dont descend", P_STRING
, P_LOCAL
, &sDefault
.szDontdescend
, NULL
, NULL
, FLAG_SHARE
},
986 {"magic script", P_STRING
, P_LOCAL
, &sDefault
.szMagicScript
, NULL
, NULL
, FLAG_SHARE
},
987 {"magic output", P_STRING
, P_LOCAL
, &sDefault
.szMagicOutput
, NULL
, NULL
, FLAG_SHARE
},
988 {"delete readonly", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteReadonly
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
989 {"dos filetimes", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
990 {"dos filetime resolution", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimeResolution
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
992 {"fake directory create times", P_BOOL
, P_LOCAL
, &sDefault
.bFakeDirCreateTimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
993 {"panic action", P_STRING
, P_GLOBAL
, &Globals
.szPanicAction
, NULL
, NULL
, 0},
995 {"VFS options", P_SEP
, P_SEPARATOR
},
997 {"vfs object", P_STRING
, P_LOCAL
, &sDefault
.szVfsObjectFile
, handle_vfs_object
, NULL
, 0},
998 {"vfs options", P_STRING
, P_LOCAL
, &sDefault
.szVfsOptions
, NULL
, NULL
, 0},
1001 {"msdfs root", P_BOOL
, P_LOCAL
, &sDefault
.bMSDfsRoot
, NULL
, NULL
, FLAG_SHARE
},
1002 {"host msdfs", P_BOOL
, P_GLOBAL
, &Globals
.bHostMSDfs
, NULL
, NULL
, FLAG_GLOBAL
},
1004 {"Winbind options", P_SEP
, P_SEPARATOR
},
1006 {"winbind uid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindUID
, handle_winbind_id
, NULL
, 0},
1007 {"winbind gid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindGID
, handle_winbind_id
, NULL
, 0},
1008 {"template homedir", P_STRING
, P_GLOBAL
, &Globals
.szTemplateHomedir
, NULL
, NULL
, 0},
1009 {"template shell", P_STRING
, P_GLOBAL
, &Globals
.szTemplateShell
, NULL
, NULL
, 0},
1010 {"winbind separator", P_STRING
, P_GLOBAL
, &Globals
.szWinbindSeparator
, NULL
, NULL
, 0},
1011 {"winbind cache time", P_INTEGER
, P_GLOBAL
, &Globals
.winbind_cache_time
, NULL
, NULL
, 0},
1013 {NULL
, P_BOOL
, P_NONE
, NULL
, NULL
, NULL
, 0}
1017 /***************************************************************************
1018 Initialise the sDefault parameter structure for the printer values.
1019 ***************************************************************************/
1020 static void init_printer_values(void)
1022 string_set(&sDefault
.szPrinterDriver
, "");
1023 string_set(&sDefault
.szDriverFile
, DRIVERFILE
);
1025 /* choose defaults depending on the type of printing */
1026 switch (sDefault
.iPrinting
)
1032 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1033 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1034 string_set(&sDefault
.szPrintcommand
,
1040 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1041 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1042 string_set(&sDefault
.szPrintcommand
,
1044 string_set(&sDefault
.szQueuepausecommand
,
1046 string_set(&sDefault
.szQueueresumecommand
,
1048 string_set(&sDefault
.szLppausecommand
,
1050 string_set(&sDefault
.szLpresumecommand
,
1051 "lpc release %p %j");
1055 string_set(&sDefault
.szLpqcommand
,
1056 "/usr/bin/lpstat -o%p");
1057 string_set(&sDefault
.szLprmcommand
,
1058 "/usr/bin/cancel %p-%j");
1059 string_set(&sDefault
.szPrintcommand
,
1060 "/usr/bin/lp -d%p -oraw %s; rm %s");
1061 string_set(&sDefault
.szQueuepausecommand
,
1062 "/usr/bin/disable %p");
1063 string_set(&sDefault
.szQueueresumecommand
,
1064 "/usr/bin/enable %p");
1069 string_set(&sDefault
.szLpqcommand
, "lpstat -o%p");
1070 string_set(&sDefault
.szLprmcommand
, "cancel %p-%j");
1071 string_set(&sDefault
.szPrintcommand
,
1072 "lp -c -d%p %s; rm %s");
1073 string_set(&sDefault
.szQueuepausecommand
,
1075 string_set(&sDefault
.szQueueresumecommand
,
1078 string_set(&sDefault
.szLppausecommand
,
1079 "lp -i %p-%j -H hold");
1080 string_set(&sDefault
.szLpresumecommand
,
1081 "lp -i %p-%j -H resume");
1086 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1087 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1088 string_set(&sDefault
.szPrintcommand
, "lp -r -P%p %s");
1092 string_set(&sDefault
.szLpqcommand
, "qstat -l -d%p");
1093 string_set(&sDefault
.szLprmcommand
,
1094 "qstat -s -j%j -c");
1095 string_set(&sDefault
.szPrintcommand
,
1096 "lp -d%p -s %s; rm %s");
1097 string_set(&sDefault
.szLppausecommand
,
1098 "qstat -s -j%j -h");
1099 string_set(&sDefault
.szLpresumecommand
,
1100 "qstat -s -j%j -r");
1106 /***************************************************************************
1107 Initialise the global parameter structure.
1108 ***************************************************************************/
1109 static void init_globals(void)
1111 static BOOL done_init
= False
;
1117 memset((void *)&Globals
, '\0', sizeof(Globals
));
1119 for (i
= 0; parm_table
[i
].label
; i
++)
1120 if ((parm_table
[i
].type
== P_STRING
||
1121 parm_table
[i
].type
== P_USTRING
) &&
1123 string_set(parm_table
[i
].ptr
, "");
1125 string_set(&sDefault
.szGuestaccount
, GUEST_ACCOUNT
);
1126 string_set(&sDefault
.fstype
, FSTYPE_STRING
);
1128 init_printer_values();
1134 DEBUG(3, ("Initialising global parameters\n"));
1137 string_set(&Globals
.szTDBPasswdFile
, TDB_PASSWD_FILE
);
1139 string_set(&Globals
.szSMBPasswdFile
, SMB_PASSWD_FILE
);
1141 string_set(&Globals
.szPassdbModulePath
, "");
1144 * Allow the default PASSWD_CHAT to be overridden in local.h.
1146 string_set(&Globals
.szPasswdChat
, DEFAULT_PASSWD_CHAT
);
1147 string_set(&Globals
.szWorkGroup
, WORKGROUP
);
1148 string_set(&Globals
.szPasswdProgram
, PASSWD_PROGRAM
);
1149 string_set(&Globals
.szPrintcapname
, PRINTCAP_NAME
);
1150 string_set(&Globals
.szLockDir
, LOCKDIR
);
1152 string_set(&Globals
.szUtmpDir
, "");
1153 string_set(&Globals
.szWtmpDir
, "");
1154 string_set(&Globals
.szUtmpHostname
, "%m");
1155 Globals
.bUtmpConsolidate
= False
;
1156 #endif /* WITH_UTMP */
1157 string_set(&Globals
.szSmbrun
, SMBRUN
);
1158 string_set(&Globals
.szSocketAddress
, "0.0.0.0");
1159 pstrcpy(s
, "Samba ");
1160 pstrcat(s
, VERSION
);
1161 string_set(&Globals
.szServerString
, s
);
1162 slprintf(s
, sizeof(s
) - 1, "%d.%d", DEFAULT_MAJOR_VERSION
,
1163 DEFAULT_MINOR_VERSION
);
1164 string_set(&Globals
.szAnnounceVersion
, s
);
1166 pstrcpy(user_socket_options
, DEFAULT_SOCKET_OPTIONS
);
1168 string_set(&Globals
.szLogonDrive
, "");
1169 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1170 string_set(&Globals
.szLogonHome
, "\\\\%N\\%U");
1171 string_set(&Globals
.szLogonPath
, "\\\\%N\\%U\\profile");
1173 string_set(&Globals
.szNameResolveOrder
, "lmhosts host wins bcast");
1174 string_set(&Globals
.szCodePageDir
, CODEPAGEDIR
);
1176 Globals
.bLoadPrinters
= True
;
1177 Globals
.bUseRhosts
= False
;
1178 Globals
.max_packet
= 65535;
1179 Globals
.mangled_stack
= 50;
1180 Globals
.max_xmit
= 65535;
1181 Globals
.max_mux
= 50; /* This is *needed* for profile support. */
1182 Globals
.lpqcachetime
= 10;
1183 Globals
.pwordlevel
= 0;
1184 Globals
.unamelevel
= 0;
1185 Globals
.deadtime
= 0;
1186 Globals
.max_log_size
= 5000;
1187 Globals
.max_open_files
= MAX_OPEN_FILES
;
1188 Globals
.maxprotocol
= PROTOCOL_NT1
;
1189 Globals
.security
= SEC_USER
;
1190 Globals
.bEncryptPasswords
= False
;
1191 Globals
.bUpdateEncrypt
= False
;
1192 Globals
.bReadRaw
= True
;
1193 Globals
.bWriteRaw
= True
;
1194 Globals
.bReadPrediction
= False
;
1195 Globals
.bReadbmpx
= False
;
1196 Globals
.bNullPasswords
= False
;
1197 Globals
.bStripDot
= False
;
1199 Globals
.bSyslogOnly
= False
;
1200 Globals
.bTimestampLogs
= False
;
1201 Globals
.bDebugHiresTimestamp
= False
;
1202 Globals
.bDebugPid
= False
;
1203 Globals
.bDebugUid
= False
;
1204 Globals
.max_ttl
= 60 * 60 * 24 * 3; /* 3 days default. */
1205 Globals
.max_wins_ttl
= 60 * 60 * 24 * 6; /* 6 days default. */
1206 Globals
.min_wins_ttl
= 60 * 60 * 6; /* 6 hours default. */
1207 Globals
.machine_password_timeout
= 60 * 60 * 24 * 7; /* 7 days default. */
1208 Globals
.change_notify_timeout
= 60; /* 1 minute default. */
1209 Globals
.ReadSize
= 16 * 1024;
1210 Globals
.lm_announce
= 2; /* = Auto: send only if LM clients found */
1211 Globals
.lm_interval
= 60;
1212 Globals
.stat_cache_size
= 50; /* Number of stat translations we'll keep */
1213 Globals
.announce_as
= ANNOUNCE_AS_NT_SERVER
;
1214 Globals
.bUnixRealname
= True
;
1215 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1216 Globals
.bNISHomeMap
= False
;
1217 #ifdef WITH_NISPLUS_HOME
1218 string_set(&Globals
.szNISHomeMapName
, "auto_home.org_dir");
1220 string_set(&Globals
.szNISHomeMapName
, "auto.home");
1223 Globals
.client_code_page
= DEFAULT_CLIENT_CODE_PAGE
;
1224 Globals
.bTimeServer
= False
;
1225 Globals
.bBindInterfacesOnly
= False
;
1226 Globals
.bUnixPasswdSync
= False
;
1227 Globals
.bPasswdChatDebug
= False
;
1228 Globals
.bNTSmbSupport
= True
; /* Do NT SMB's by default. */
1229 Globals
.bNTPipeSupport
= True
; /* Do NT pipes by default. */
1230 Globals
.bNTAclSupport
= True
; /* Use NT ACLs by default. */
1231 Globals
.bStatCache
= True
; /* use stat cache by default */
1232 Globals
.bRestrictAnonymous
= False
;
1233 Globals
.map_to_guest
= 0; /* By Default, "Never" */
1234 Globals
.min_passwd_length
= MINPASSWDLENGTH
; /* By Default, 5. */
1235 Globals
.oplock_break_wait_time
= 10; /* By Default, 10 msecs. */
1238 /* default values for ldap */
1239 string_set(&Globals
.szLdapServer
, "localhost");
1240 Globals
.ldap_port
= 389;
1241 #endif /* WITH_LDAP */
1244 Globals
.sslVersion
= SMB_SSL_V23
;
1245 string_set(&Globals
.sslHostsRequire
, "");
1246 string_set(&Globals
.sslHostsResign
, "");
1247 string_set(&Globals
.sslCaCertDir
, "");
1248 string_set(&Globals
.sslCaCertFile
, "");
1249 string_set(&Globals
.sslCert
, "");
1250 string_set(&Globals
.sslPrivKey
, "");
1251 string_set(&Globals
.sslClientCert
, "");
1252 string_set(&Globals
.sslClientPrivKey
, "");
1253 string_set(&Globals
.sslCiphers
, "");
1254 Globals
.sslEnabled
= False
;
1255 Globals
.sslReqClientCert
= False
;
1256 Globals
.sslReqServerCert
= False
;
1257 Globals
.sslCompatibility
= False
;
1258 #endif /* WITH_SSL */
1261 these parameters are set to defaults that are more appropriate
1262 for the increasing samba install base:
1264 as a member of the workgroup, that will possibly become a
1265 _local_ master browser (lm = True). this is opposed to a forced
1266 local master browser startup (pm = True).
1268 doesn't provide WINS server service by default (wsupp = False),
1269 and doesn't provide domain master browser services by default, either.
1272 Globals
.bMsAddPrinterWizard
= True
;
1273 Globals
.bPreferredMaster
= Auto
; /* depending on bDomainMaster */
1274 Globals
.os_level
= 20;
1275 Globals
.bLocalMaster
= True
;
1276 Globals
.bDomainMaster
= Auto
; /* depending on bDomainLogons */
1277 Globals
.bDomainLogons
= False
;
1278 Globals
.bBrowseList
= True
;
1279 Globals
.bWINSsupport
= False
;
1280 Globals
.bWINSproxy
= False
;
1282 Globals
.bDNSproxy
= True
;
1284 /* this just means to use them if they exist */
1285 Globals
.bKernelOplocks
= True
;
1287 Globals
.bAllowTrustedDomains
= True
;
1289 string_set(&Globals
.szTemplateShell
, "/bin/false");
1290 string_set(&Globals
.szTemplateHomedir
, "/home/%D/%U");
1291 string_set(&Globals
.szWinbindSeparator
, "\\");
1292 Globals
.winbind_cache_time
= 15;
1295 * This must be done last as it checks the value in
1299 interpret_coding_system(KANJI
);
1302 static TALLOC_CTX
*lp_talloc
;
1304 /******************************************************************* a
1305 free up temporary memory - called from the main loop
1306 ********************************************************************/
1307 void lp_talloc_free(void)
1311 talloc_destroy(lp_talloc
);
1315 /*******************************************************************
1316 convenience routine to grab string parameters into temporary memory
1317 and run standard_sub_basic on them. The buffers can be written to by
1318 callers without affecting the source string.
1319 ********************************************************************/
1320 static char *lp_string(const char *s
)
1322 size_t len
= s
? strlen(s
) : 0;
1326 lp_talloc
= talloc_init();
1328 ret
= (char *)talloc(lp_talloc
, len
+ 100); /* leave room for substitution */
1336 StrnCpy(ret
, s
, len
);
1338 trim_string(ret
, "\"", "\"");
1340 standard_sub_basic(ret
);
1346 In this section all the functions that are used to access the
1347 parameters from the rest of the program are defined
1350 #define FN_GLOBAL_STRING(fn_name,ptr) \
1351 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1352 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1353 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1354 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1355 char fn_name(void) {return(*(char *)(ptr));}
1356 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1357 int fn_name(void) {return(*(int *)(ptr));}
1359 #define FN_LOCAL_STRING(fn_name,val) \
1360 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1361 #define FN_LOCAL_BOOL(fn_name,val) \
1362 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1363 #define FN_LOCAL_CHAR(fn_name,val) \
1364 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1365 #define FN_LOCAL_INTEGER(fn_name,val) \
1366 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1368 FN_GLOBAL_STRING(lp_logfile
, &Globals
.szLogFile
)
1369 FN_GLOBAL_STRING(lp_smbrun
, &Globals
.szSmbrun
)
1370 FN_GLOBAL_STRING(lp_configfile
, &Globals
.szConfigFile
)
1372 FN_GLOBAL_STRING(lp_tdb_passwd_file
, &Globals
.szTDBPasswdFile
)
1374 FN_GLOBAL_STRING(lp_smb_passwd_file
, &Globals
.szSMBPasswdFile
)
1376 FN_GLOBAL_STRING(lp_passdb_module_path
, &Globals
.szPassdbModulePath
)
1377 FN_GLOBAL_STRING(lp_serverstring
, &Globals
.szServerString
)
1378 FN_GLOBAL_STRING(lp_printcapname
, &Globals
.szPrintcapname
)
1379 FN_GLOBAL_STRING(lp_enumports_cmd
, &Globals
.szEnumPortsCommand
)
1380 FN_GLOBAL_STRING(lp_addprinter_cmd
, &Globals
.szAddPrinterCommand
)
1381 FN_GLOBAL_STRING(lp_deleteprinter_cmd
, &Globals
.szDeletePrinterCommand
)
1382 FN_GLOBAL_STRING(lp_lockdir
, &Globals
.szLockDir
)
1384 FN_GLOBAL_STRING(lp_utmpdir
, &Globals
.szUtmpDir
)
1385 FN_GLOBAL_STRING(lp_wtmpdir
, &Globals
.szWtmpDir
)
1386 FN_GLOBAL_STRING(lp_utmp_hostname
, &Globals
.szUtmpHostname
)
1387 FN_GLOBAL_BOOL(lp_utmp_consolidate
, &Globals
.bUtmpConsolidate
)
1388 #endif /* WITH_UTMP */
1389 FN_GLOBAL_STRING(lp_rootdir
, &Globals
.szRootdir
)
1390 FN_GLOBAL_STRING(lp_source_environment
, &Globals
.szSourceEnv
)
1391 FN_GLOBAL_STRING(lp_defaultservice
, &Globals
.szDefaultService
)
1392 FN_GLOBAL_STRING(lp_msg_command
, &Globals
.szMsgCommand
)
1393 FN_GLOBAL_STRING(lp_dfree_command
, &Globals
.szDfree
)
1394 FN_GLOBAL_STRING(lp_hosts_equiv
, &Globals
.szHostsEquiv
)
1395 FN_GLOBAL_STRING(lp_auto_services
, &Globals
.szAutoServices
)
1396 FN_GLOBAL_STRING(lp_passwd_program
, &Globals
.szPasswdProgram
)
1397 FN_GLOBAL_STRING(lp_passwd_chat
, &Globals
.szPasswdChat
)
1398 FN_GLOBAL_STRING(lp_passwordserver
, &Globals
.szPasswordServer
)
1399 FN_GLOBAL_STRING(lp_name_resolve_order
, &Globals
.szNameResolveOrder
)
1400 FN_GLOBAL_STRING(lp_workgroup
, &Globals
.szWorkGroup
)
1401 FN_GLOBAL_STRING(lp_username_map
, &Globals
.szUsernameMap
)
1402 #ifdef USING_GROUPNAME_MAP
1403 FN_GLOBAL_STRING(lp_groupname_map
, &Globals
.szGroupnameMap
)
1404 #endif /* USING_GROUPNAME_MAP */
1405 FN_GLOBAL_STRING(lp_logon_script
, &Globals
.szLogonScript
)
1406 FN_GLOBAL_STRING(lp_logon_path
, &Globals
.szLogonPath
)
1407 FN_GLOBAL_STRING(lp_logon_drive
, &Globals
.szLogonDrive
)
1408 FN_GLOBAL_STRING(lp_logon_home
, &Globals
.szLogonHome
)
1409 FN_GLOBAL_STRING(lp_remote_announce
, &Globals
.szRemoteAnnounce
)
1410 FN_GLOBAL_STRING(lp_remote_browse_sync
, &Globals
.szRemoteBrowseSync
)
1411 FN_GLOBAL_STRING(lp_wins_server
, &Globals
.szWINSserver
)
1412 FN_GLOBAL_STRING(lp_interfaces
, &Globals
.szInterfaces
)
1413 FN_GLOBAL_STRING(lp_socket_address
, &Globals
.szSocketAddress
)
1414 FN_GLOBAL_STRING(lp_nis_home_map_name
, &Globals
.szNISHomeMapName
)
1415 static FN_GLOBAL_STRING(lp_announce_version
, &Globals
.szAnnounceVersion
)
1416 FN_GLOBAL_STRING(lp_netbios_aliases
, &Globals
.szNetbiosAliases
)
1417 FN_GLOBAL_STRING(lp_panic_action
, &Globals
.szPanicAction
)
1418 FN_GLOBAL_STRING(lp_adduser_script
, &Globals
.szAddUserScript
)
1419 FN_GLOBAL_STRING(lp_deluser_script
, &Globals
.szDelUserScript
)
1420 FN_GLOBAL_STRING(lp_wins_hook
, &Globals
.szWINSHook
)
1421 FN_GLOBAL_STRING(lp_domain_groups
, &Globals
.szDomainGroups
)
1422 FN_GLOBAL_STRING(lp_domain_admin_group
, &Globals
.szDomainAdminGroup
)
1423 FN_GLOBAL_STRING(lp_domain_guest_group
, &Globals
.szDomainGuestGroup
)
1424 FN_GLOBAL_STRING(lp_domain_admin_users
, &Globals
.szDomainAdminUsers
)
1425 FN_GLOBAL_STRING(lp_domain_guest_users
, &Globals
.szDomainGuestUsers
)
1426 FN_GLOBAL_STRING(lp_winbind_uid
, &Globals
.szWinbindUID
)
1427 FN_GLOBAL_STRING(lp_winbind_gid
, &Globals
.szWinbindGID
)
1428 FN_GLOBAL_STRING(lp_template_homedir
, &Globals
.szTemplateHomedir
)
1429 FN_GLOBAL_STRING(lp_template_shell
, &Globals
.szTemplateShell
)
1430 FN_GLOBAL_STRING(lp_winbind_separator
, &Globals
.szWinbindSeparator
)
1431 FN_GLOBAL_STRING(lp_codepagedir
,&Globals
.szCodePageDir
)
1433 FN_GLOBAL_STRING(lp_ldap_server
, &Globals
.szLdapServer
);
1434 FN_GLOBAL_STRING(lp_ldap_suffix
, &Globals
.szLdapSuffix
);
1435 FN_GLOBAL_STRING(lp_ldap_filter
, &Globals
.szLdapFilter
);
1436 FN_GLOBAL_STRING(lp_ldap_root
, &Globals
.szLdapRoot
);
1437 FN_GLOBAL_STRING(lp_ldap_rootpasswd
, &Globals
.szLdapRootPassword
);
1438 #endif /* WITH_LDAP */
1441 FN_GLOBAL_INTEGER(lp_ssl_version
, &Globals
.sslVersion
);
1442 FN_GLOBAL_STRING(lp_ssl_hosts
, &Globals
.sslHostsRequire
);
1443 FN_GLOBAL_STRING(lp_ssl_hosts_resign
, &Globals
.sslHostsResign
);
1444 FN_GLOBAL_STRING(lp_ssl_cacertdir
, &Globals
.sslCaCertDir
);
1445 FN_GLOBAL_STRING(lp_ssl_cacertfile
, &Globals
.sslCaCertFile
);
1446 FN_GLOBAL_STRING(lp_ssl_cert
, &Globals
.sslCert
);
1447 FN_GLOBAL_STRING(lp_ssl_privkey
, &Globals
.sslPrivKey
);
1448 FN_GLOBAL_STRING(lp_ssl_client_cert
, &Globals
.sslClientCert
);
1449 FN_GLOBAL_STRING(lp_ssl_client_privkey
, &Globals
.sslClientPrivKey
);
1450 FN_GLOBAL_STRING(lp_ssl_ciphers
, &Globals
.sslCiphers
);
1451 FN_GLOBAL_BOOL(lp_ssl_enabled
, &Globals
.sslEnabled
);
1452 FN_GLOBAL_BOOL(lp_ssl_reqClientCert
, &Globals
.sslReqClientCert
);
1453 FN_GLOBAL_BOOL(lp_ssl_reqServerCert
, &Globals
.sslReqServerCert
);
1454 FN_GLOBAL_BOOL(lp_ssl_compatibility
, &Globals
.sslCompatibility
);
1455 #endif /* WITH_SSL */
1457 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard
, &Globals
.bMsAddPrinterWizard
)
1458 FN_GLOBAL_BOOL(lp_dns_proxy
, &Globals
.bDNSproxy
)
1459 FN_GLOBAL_BOOL(lp_wins_support
, &Globals
.bWINSsupport
)
1460 FN_GLOBAL_BOOL(lp_we_are_a_wins_server
, &Globals
.bWINSsupport
)
1461 FN_GLOBAL_BOOL(lp_wins_proxy
, &Globals
.bWINSproxy
)
1462 FN_GLOBAL_BOOL(lp_local_master
, &Globals
.bLocalMaster
)
1463 FN_GLOBAL_BOOL(lp_domain_logons
, &Globals
.bDomainLogons
)
1464 FN_GLOBAL_BOOL(lp_load_printers
, &Globals
.bLoadPrinters
)
1465 FN_GLOBAL_BOOL(lp_use_rhosts
, &Globals
.bUseRhosts
)
1466 FN_GLOBAL_BOOL(lp_readprediction
, &Globals
.bReadPrediction
)
1467 FN_GLOBAL_BOOL(lp_readbmpx
, &Globals
.bReadbmpx
)
1468 FN_GLOBAL_BOOL(lp_readraw
, &Globals
.bReadRaw
)
1469 FN_GLOBAL_BOOL(lp_writeraw
, &Globals
.bWriteRaw
)
1470 FN_GLOBAL_BOOL(lp_null_passwords
, &Globals
.bNullPasswords
)
1471 FN_GLOBAL_BOOL(lp_strip_dot
, &Globals
.bStripDot
)
1472 FN_GLOBAL_BOOL(lp_encrypted_passwords
, &Globals
.bEncryptPasswords
)
1473 FN_GLOBAL_BOOL(lp_update_encrypted
, &Globals
.bUpdateEncrypt
)
1474 FN_GLOBAL_BOOL(lp_syslog_only
, &Globals
.bSyslogOnly
)
1475 FN_GLOBAL_BOOL(lp_timestamp_logs
, &Globals
.bTimestampLogs
)
1476 FN_GLOBAL_BOOL(lp_debug_hires_timestamp
, &Globals
.bDebugHiresTimestamp
)
1477 FN_GLOBAL_BOOL(lp_debug_pid
, &Globals
.bDebugPid
)
1478 FN_GLOBAL_BOOL(lp_debug_uid
, &Globals
.bDebugUid
)
1479 FN_GLOBAL_BOOL(lp_browse_list
, &Globals
.bBrowseList
)
1480 FN_GLOBAL_BOOL(lp_unix_realname
, &Globals
.bUnixRealname
)
1481 FN_GLOBAL_BOOL(lp_nis_home_map
, &Globals
.bNISHomeMap
)
1482 static FN_GLOBAL_BOOL(lp_time_server
, &Globals
.bTimeServer
)
1483 FN_GLOBAL_BOOL(lp_bind_interfaces_only
, &Globals
.bBindInterfacesOnly
)
1484 FN_GLOBAL_BOOL(lp_unix_password_sync
, &Globals
.bUnixPasswdSync
)
1485 FN_GLOBAL_BOOL(lp_passwd_chat_debug
, &Globals
.bPasswdChatDebug
)
1486 FN_GLOBAL_BOOL(lp_nt_smb_support
, &Globals
.bNTSmbSupport
)
1487 FN_GLOBAL_BOOL(lp_nt_pipe_support
, &Globals
.bNTPipeSupport
)
1488 FN_GLOBAL_BOOL(lp_nt_acl_support
, &Globals
.bNTAclSupport
)
1489 FN_GLOBAL_BOOL(lp_stat_cache
, &Globals
.bStatCache
)
1490 FN_GLOBAL_BOOL(lp_allow_trusted_domains
, &Globals
.bAllowTrustedDomains
)
1491 FN_GLOBAL_BOOL(lp_restrict_anonymous
, &Globals
.bRestrictAnonymous
)
1492 FN_GLOBAL_BOOL(lp_host_msdfs
, &Globals
.bHostMSDfs
)
1493 FN_GLOBAL_BOOL(lp_kernel_oplocks
, &Globals
.bKernelOplocks
)
1494 FN_GLOBAL_INTEGER(lp_os_level
, &Globals
.os_level
)
1495 FN_GLOBAL_INTEGER(lp_max_ttl
, &Globals
.max_ttl
)
1496 FN_GLOBAL_INTEGER(lp_max_wins_ttl
, &Globals
.max_wins_ttl
)
1497 FN_GLOBAL_INTEGER(lp_min_wins_ttl
, &Globals
.max_wins_ttl
)
1498 FN_GLOBAL_INTEGER(lp_max_log_size
, &Globals
.max_log_size
)
1499 FN_GLOBAL_INTEGER(lp_max_open_files
, &Globals
.max_open_files
)
1500 FN_GLOBAL_INTEGER(lp_maxxmit
, &Globals
.max_xmit
)
1501 FN_GLOBAL_INTEGER(lp_maxmux
, &Globals
.max_mux
)
1502 FN_GLOBAL_INTEGER(lp_passwordlevel
, &Globals
.pwordlevel
)
1503 FN_GLOBAL_INTEGER(lp_usernamelevel
, &Globals
.unamelevel
)
1504 FN_GLOBAL_INTEGER(lp_readsize
, &Globals
.ReadSize
)
1505 FN_GLOBAL_INTEGER(lp_deadtime
, &Globals
.deadtime
)
1506 FN_GLOBAL_INTEGER(lp_maxprotocol
, &Globals
.maxprotocol
)
1507 FN_GLOBAL_INTEGER(lp_security
, &Globals
.security
)
1508 FN_GLOBAL_INTEGER(lp_maxdisksize
, &Globals
.maxdisksize
)
1509 FN_GLOBAL_INTEGER(lp_lpqcachetime
, &Globals
.lpqcachetime
)
1510 FN_GLOBAL_INTEGER(lp_syslog
, &Globals
.syslog
)
1511 FN_GLOBAL_INTEGER(lp_client_code_page
, &Globals
.client_code_page
)
1512 static FN_GLOBAL_INTEGER(lp_announce_as
, &Globals
.announce_as
)
1513 FN_GLOBAL_INTEGER(lp_lm_announce
, &Globals
.lm_announce
)
1514 FN_GLOBAL_INTEGER(lp_lm_interval
, &Globals
.lm_interval
)
1515 FN_GLOBAL_INTEGER(lp_machine_password_timeout
, &Globals
.machine_password_timeout
)
1516 FN_GLOBAL_INTEGER(lp_change_notify_timeout
, &Globals
.change_notify_timeout
)
1517 FN_GLOBAL_INTEGER(lp_stat_cache_size
, &Globals
.stat_cache_size
)
1518 FN_GLOBAL_INTEGER(lp_map_to_guest
, &Globals
.map_to_guest
)
1519 FN_GLOBAL_INTEGER(lp_min_passwd_length
, &Globals
.min_passwd_length
)
1520 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time
, &Globals
.oplock_break_wait_time
)
1522 FN_GLOBAL_INTEGER(lp_ldap_port
, &Globals
.ldap_port
)
1523 #endif /* WITH_LDAP */
1524 FN_LOCAL_STRING(lp_preexec
, szPreExec
)
1525 FN_LOCAL_STRING(lp_postexec
, szPostExec
)
1526 FN_LOCAL_STRING(lp_rootpreexec
, szRootPreExec
)
1527 FN_LOCAL_STRING(lp_rootpostexec
, szRootPostExec
)
1528 FN_LOCAL_STRING(lp_servicename
, szService
)
1529 FN_LOCAL_STRING(lp_pathname
, szPath
)
1530 FN_LOCAL_STRING(lp_dontdescend
, szDontdescend
)
1531 FN_LOCAL_STRING(lp_username
, szUsername
)
1532 FN_LOCAL_STRING(lp_guestaccount
, szGuestaccount
)
1533 FN_LOCAL_STRING(lp_invalid_users
, szInvalidUsers
)
1534 FN_LOCAL_STRING(lp_valid_users
, szValidUsers
)
1535 FN_LOCAL_STRING(lp_admin_users
, szAdminUsers
)
1536 FN_LOCAL_STRING(lp_printcommand
, szPrintcommand
)
1537 FN_LOCAL_STRING(lp_lpqcommand
, szLpqcommand
)
1538 FN_LOCAL_STRING(lp_lprmcommand
, szLprmcommand
)
1539 FN_LOCAL_STRING(lp_lppausecommand
, szLppausecommand
)
1540 FN_LOCAL_STRING(lp_lpresumecommand
, szLpresumecommand
)
1541 FN_LOCAL_STRING(lp_queuepausecommand
, szQueuepausecommand
)
1542 FN_LOCAL_STRING(lp_queueresumecommand
, szQueueresumecommand
)
1543 static FN_LOCAL_STRING(_lp_printername
, szPrintername
)
1544 FN_LOCAL_STRING(lp_driverfile
, szDriverFile
)
1545 FN_LOCAL_STRING(lp_printerdriver
, szPrinterDriver
)
1546 FN_LOCAL_STRING(lp_hostsallow
, szHostsallow
)
1547 FN_LOCAL_STRING(lp_hostsdeny
, szHostsdeny
)
1548 FN_LOCAL_STRING(lp_magicscript
, szMagicScript
)
1549 FN_LOCAL_STRING(lp_magicoutput
, szMagicOutput
)
1550 FN_LOCAL_STRING(lp_comment
, comment
)
1551 FN_LOCAL_STRING(lp_force_user
, force_user
)
1552 FN_LOCAL_STRING(lp_force_group
, force_group
)
1553 FN_LOCAL_STRING(lp_readlist
, readlist
)
1554 FN_LOCAL_STRING(lp_writelist
, writelist
)
1555 FN_LOCAL_STRING(lp_printer_admin
, printer_admin
)
1556 FN_LOCAL_STRING(lp_fstype
, fstype
)
1557 FN_LOCAL_STRING(lp_vfsobj
, szVfsObjectFile
)
1558 static FN_LOCAL_STRING(lp_volume
, volume
)
1559 FN_LOCAL_STRING(lp_mangled_map
, szMangledMap
)
1560 FN_LOCAL_STRING(lp_veto_files
, szVetoFiles
)
1561 FN_LOCAL_STRING(lp_hide_files
, szHideFiles
)
1562 FN_LOCAL_STRING(lp_veto_oplocks
, szVetoOplockFiles
)
1563 FN_LOCAL_STRING(lp_driverlocation
, szPrinterDriverLocation
)
1564 FN_LOCAL_BOOL(lp_msdfs_root
, bMSDfsRoot
)
1565 FN_LOCAL_BOOL(lp_autoloaded
, autoloaded
)
1566 FN_LOCAL_BOOL(lp_preexec_close
, bPreexecClose
)
1567 FN_LOCAL_BOOL(lp_rootpreexec_close
, bRootpreexecClose
)
1568 FN_LOCAL_BOOL(lp_casesensitive
, bCaseSensitive
)
1569 FN_LOCAL_BOOL(lp_preservecase
, bCasePreserve
)
1570 FN_LOCAL_BOOL(lp_shortpreservecase
, bShortCasePreserve
)
1571 FN_LOCAL_BOOL(lp_casemangle
, bCaseMangle
)
1572 FN_LOCAL_BOOL(lp_status
, status
)
1573 FN_LOCAL_BOOL(lp_hide_dot_files
, bHideDotFiles
)
1574 FN_LOCAL_BOOL(lp_browseable
, bBrowseable
)
1575 FN_LOCAL_BOOL(lp_readonly
, bRead_only
)
1576 FN_LOCAL_BOOL(lp_no_set_dir
, bNo_set_dir
)
1577 FN_LOCAL_BOOL(lp_guest_ok
, bGuest_ok
)
1578 FN_LOCAL_BOOL(lp_guest_only
, bGuest_only
)
1579 FN_LOCAL_BOOL(lp_print_ok
, bPrint_ok
)
1580 FN_LOCAL_BOOL(lp_postscript
, bPostscript
)
1581 FN_LOCAL_BOOL(lp_map_hidden
, bMap_hidden
)
1582 FN_LOCAL_BOOL(lp_map_archive
, bMap_archive
)
1583 FN_LOCAL_BOOL(lp_locking
, bLocking
)
1584 FN_LOCAL_BOOL(lp_strict_locking
, bStrictLocking
)
1585 FN_LOCAL_BOOL(lp_posix_locking
, bPosixLocking
)
1587 FN_LOCAL_BOOL(lp_utmp
, bUtmp
)
1589 FN_LOCAL_BOOL(lp_share_modes
, bShareModes
)
1590 FN_LOCAL_BOOL(lp_oplocks
, bOpLocks
)
1591 FN_LOCAL_BOOL(lp_level2_oplocks
, bLevel2OpLocks
)
1592 FN_LOCAL_BOOL(lp_onlyuser
, bOnlyUser
)
1593 FN_LOCAL_BOOL(lp_manglednames
, bMangledNames
)
1594 FN_LOCAL_BOOL(lp_widelinks
, bWidelinks
)
1595 FN_LOCAL_BOOL(lp_symlinks
, bSymlinks
)
1596 FN_LOCAL_BOOL(lp_syncalways
, bSyncAlways
)
1597 FN_LOCAL_BOOL(lp_strict_sync
, bStrictSync
)
1598 FN_LOCAL_BOOL(lp_map_system
, bMap_system
)
1599 FN_LOCAL_BOOL(lp_delete_readonly
, bDeleteReadonly
)
1600 FN_LOCAL_BOOL(lp_fake_oplocks
, bFakeOplocks
)
1601 FN_LOCAL_BOOL(lp_recursive_veto_delete
, bDeleteVetoFiles
)
1602 FN_LOCAL_BOOL(lp_dos_filetimes
, bDosFiletimes
)
1603 FN_LOCAL_BOOL(lp_dos_filetime_resolution
, bDosFiletimeResolution
)
1604 FN_LOCAL_BOOL(lp_fake_dir_create_times
, bFakeDirCreateTimes
)
1605 FN_LOCAL_BOOL(lp_blocking_locks
, bBlockingLocks
)
1606 FN_LOCAL_BOOL(lp_inherit_perms
, bInheritPerms
)
1607 FN_LOCAL_INTEGER(lp_create_mask
, iCreate_mask
)
1608 FN_LOCAL_INTEGER(lp_force_create_mode
, iCreate_force_mode
)
1609 FN_LOCAL_INTEGER(_lp_security_mask
, iSecurity_mask
)
1610 FN_LOCAL_INTEGER(_lp_force_security_mode
, iSecurity_force_mode
)
1611 FN_LOCAL_INTEGER(lp_dir_mask
, iDir_mask
)
1612 FN_LOCAL_INTEGER(lp_force_dir_mode
, iDir_force_mode
)
1613 FN_LOCAL_INTEGER(_lp_dir_security_mask
, iDir_Security_mask
)
1614 FN_LOCAL_INTEGER(_lp_force_dir_security_mode
, iDir_Security_force_mode
)
1615 FN_LOCAL_INTEGER(lp_max_connections
, iMaxConnections
)
1616 FN_LOCAL_INTEGER(lp_defaultcase
, iDefaultCase
)
1617 FN_LOCAL_INTEGER(lp_minprintspace
, iMinPrintSpace
)
1618 FN_LOCAL_INTEGER(lp_maxprintjobs
, iMaxPrintJobs
)
1619 FN_LOCAL_INTEGER(lp_printing
, iPrinting
)
1620 FN_LOCAL_INTEGER(lp_oplock_contention_limit
, iOplockContentionLimit
)
1621 FN_LOCAL_INTEGER(lp_write_cache_size
, iWriteCacheSize
)
1622 FN_LOCAL_CHAR(lp_magicchar
, magic_char
)
1623 FN_GLOBAL_INTEGER(lp_winbind_cache_time
, &Globals
.winbind_cache_time
)
1624 /* local prototypes */
1625 static int map_parameter(char *pszParmName
);
1626 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
);
1627 static int getservicebyname(char *pszServiceName
,
1628 service
* pserviceDest
);
1629 static void copy_service(service
* pserviceDest
,
1630 service
* pserviceSource
, BOOL
*pcopymapDest
);
1631 static BOOL
service_ok(int iService
);
1632 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
);
1633 static BOOL
do_section(char *pszSectionName
);
1634 static void init_copymap(service
* pservice
);
1637 /***************************************************************************
1638 initialise a service to the defaults
1639 ***************************************************************************/
1640 static void init_service(service
* pservice
)
1642 memset((char *)pservice
, '\0', sizeof(service
));
1643 copy_service(pservice
, &sDefault
, NULL
);
1647 /***************************************************************************
1648 free the dynamically allocated parts of a service struct
1649 ***************************************************************************/
1650 static void free_service(service
* pservice
)
1656 if (pservice
->szService
)
1658 ("free_service: Freeing service %s\n",
1659 pservice
->szService
));
1661 string_free(&pservice
->szService
);
1662 if (pservice
->copymap
)
1664 free(pservice
->copymap
);
1665 pservice
->copymap
= NULL
;
1668 for (i
= 0; parm_table
[i
].label
; i
++)
1669 if ((parm_table
[i
].type
== P_STRING
||
1670 parm_table
[i
].type
== P_USTRING
) &&
1671 parm_table
[i
].class == P_LOCAL
)
1672 string_free((char **)
1673 (((char *)pservice
) +
1674 PTR_DIFF(parm_table
[i
].ptr
, &sDefault
)));
1677 /***************************************************************************
1678 add a new service to the services array initialising it with the given
1680 ***************************************************************************/
1681 static int add_a_service(service
* pservice
, char *name
)
1685 int num_to_alloc
= iNumServices
+ 1;
1687 tservice
= *pservice
;
1689 /* it might already exist */
1692 i
= getservicebyname(name
, NULL
);
1697 /* find an invalid one */
1698 for (i
= 0; i
< iNumServices
; i
++)
1699 if (!pSERVICE(i
)->valid
)
1702 /* if not, then create one */
1703 if (i
== iNumServices
)
1706 (service
**) Realloc(ServicePtrs
,
1710 pSERVICE(iNumServices
) =
1711 (service
*) malloc(sizeof(service
));
1713 if (!ServicePtrs
|| !pSERVICE(iNumServices
))
1719 free_service(pSERVICE(i
));
1721 pSERVICE(i
)->valid
= True
;
1723 init_service(pSERVICE(i
));
1724 copy_service(pSERVICE(i
), &tservice
, NULL
);
1727 string_set(&iSERVICE(i
).szService
, name
);
1728 unix_to_dos(iSERVICE(i
).szService
, True
);
1733 /***************************************************************************
1734 add a new home service, with the specified home directory, defaults coming
1736 ***************************************************************************/
1737 BOOL
lp_add_home(char *pszHomename
, int iDefaultService
, char *pszHomedir
)
1739 int i
= add_a_service(pSERVICE(iDefaultService
), pszHomename
);
1744 if (!(*(iSERVICE(i
).szPath
))
1745 || strequal(iSERVICE(i
).szPath
, lp_pathname(-1)))
1746 string_set(&iSERVICE(i
).szPath
, pszHomedir
);
1747 if (!(*(iSERVICE(i
).comment
)))
1750 slprintf(comment
, sizeof(comment
) - 1,
1751 "Home directory of %s", pszHomename
);
1752 string_set(&iSERVICE(i
).comment
, comment
);
1754 iSERVICE(i
).bAvailable
= sDefault
.bAvailable
;
1755 iSERVICE(i
).bBrowseable
= sDefault
.bBrowseable
;
1758 ("adding home directory %s at %s\n", pszHomename
, pszHomedir
));
1763 /***************************************************************************
1764 add a new service, based on an old one
1765 ***************************************************************************/
1766 int lp_add_service(char *pszService
, int iDefaultService
)
1768 return (add_a_service(pSERVICE(iDefaultService
), pszService
));
1772 /***************************************************************************
1774 ***************************************************************************/
1775 static BOOL
lp_add_ipc(void)
1778 int i
= add_a_service(&sDefault
, "IPC$");
1783 slprintf(comment
, sizeof(comment
) - 1,
1784 "IPC Service (%s)", Globals
.szServerString
);
1786 string_set(&iSERVICE(i
).szPath
, tmpdir());
1787 string_set(&iSERVICE(i
).szUsername
, "");
1788 string_set(&iSERVICE(i
).comment
, comment
);
1789 string_set(&iSERVICE(i
).fstype
, "IPC");
1790 iSERVICE(i
).status
= False
;
1791 iSERVICE(i
).iMaxConnections
= 0;
1792 iSERVICE(i
).bAvailable
= True
;
1793 iSERVICE(i
).bRead_only
= True
;
1794 iSERVICE(i
).bGuest_only
= False
;
1795 iSERVICE(i
).bGuest_ok
= True
;
1796 iSERVICE(i
).bPrint_ok
= False
;
1797 iSERVICE(i
).bBrowseable
= sDefault
.bBrowseable
;
1799 DEBUG(3, ("adding IPC service\n"));
1805 /***************************************************************************
1806 add a new printer service, with defaults coming from service iFrom
1807 ***************************************************************************/
1808 BOOL
lp_add_printer(char *pszPrintername
, int iDefaultService
)
1810 char *comment
= "From Printcap";
1811 int i
= add_a_service(pSERVICE(iDefaultService
), pszPrintername
);
1816 /* note that we do NOT default the availability flag to True - */
1817 /* we take it from the default service passed. This allows all */
1818 /* dynamic printers to be disabled by disabling the [printers] */
1819 /* entry (if/when the 'available' keyword is implemented!). */
1821 /* the printer name is set to the service name. */
1822 string_set(&iSERVICE(i
).szPrintername
, pszPrintername
);
1823 string_set(&iSERVICE(i
).comment
, comment
);
1824 iSERVICE(i
).bBrowseable
= sDefault
.bBrowseable
;
1825 /* Printers cannot be read_only. */
1826 iSERVICE(i
).bRead_only
= False
;
1827 /* No share modes on printer services. */
1828 iSERVICE(i
).bShareModes
= False
;
1829 /* No oplocks on printer services. */
1830 iSERVICE(i
).bOpLocks
= False
;
1831 /* Printer services must be printable. */
1832 iSERVICE(i
).bPrint_ok
= True
;
1834 DEBUG(3, ("adding printer service %s\n", pszPrintername
));
1839 /***************************************************************************
1840 Map a parameter's string representation to something we can use.
1841 Returns False if the parameter string is not recognised, else TRUE.
1842 ***************************************************************************/
1843 static int map_parameter(char *pszParmName
)
1847 if (*pszParmName
== '-')
1850 for (iIndex
= 0; parm_table
[iIndex
].label
; iIndex
++)
1851 if (strwicmp(parm_table
[iIndex
].label
, pszParmName
) == 0)
1854 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName
));
1859 /***************************************************************************
1860 Set a boolean variable from the text value stored in the passed string.
1861 Returns True in success, False if the passed string does not correctly
1862 represent a boolean.
1863 ***************************************************************************/
1864 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
)
1869 if (strwicmp(pszParmValue
, "yes") == 0 ||
1870 strwicmp(pszParmValue
, "true") == 0 ||
1871 strwicmp(pszParmValue
, "1") == 0)
1874 if (strwicmp(pszParmValue
, "no") == 0 ||
1875 strwicmp(pszParmValue
, "False") == 0 ||
1876 strwicmp(pszParmValue
, "0") == 0)
1881 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1888 /***************************************************************************
1889 Find a service by name. Otherwise works like get_service.
1890 ***************************************************************************/
1891 static int getservicebyname(char *pszServiceName
, service
* pserviceDest
)
1895 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
1896 if (VALID(iService
) &&
1897 strwicmp(iSERVICE(iService
).szService
,
1898 pszServiceName
) == 0)
1900 if (pserviceDest
!= NULL
)
1901 copy_service(pserviceDest
, pSERVICE(iService
),
1911 /***************************************************************************
1912 Copy a service structure to another
1914 If pcopymapDest is NULL then copy all fields
1915 ***************************************************************************/
1916 static void copy_service(service
* pserviceDest
,
1917 service
* pserviceSource
, BOOL
*pcopymapDest
)
1920 BOOL bcopyall
= (pcopymapDest
== NULL
);
1922 for (i
= 0; parm_table
[i
].label
; i
++)
1923 if (parm_table
[i
].ptr
&& parm_table
[i
].class == P_LOCAL
&&
1924 (bcopyall
|| pcopymapDest
[i
]))
1926 void *def_ptr
= parm_table
[i
].ptr
;
1928 ((char *)pserviceSource
) + PTR_DIFF(def_ptr
,
1931 ((char *)pserviceDest
) + PTR_DIFF(def_ptr
,
1934 switch (parm_table
[i
].type
)
1938 *(BOOL
*)dest_ptr
= *(BOOL
*)src_ptr
;
1944 *(int *)dest_ptr
= *(int *)src_ptr
;
1948 *(char *)dest_ptr
= *(char *)src_ptr
;
1952 string_set(dest_ptr
,
1957 string_set(dest_ptr
,
1959 strupper(*(char **)dest_ptr
);
1968 init_copymap(pserviceDest
);
1969 if (pserviceSource
->copymap
)
1970 memcpy((void *)pserviceDest
->copymap
,
1971 (void *)pserviceSource
->copymap
,
1972 sizeof(BOOL
) * NUMPARAMETERS
);
1976 /***************************************************************************
1977 Check a service for consistency. Return False if the service is in any way
1978 incomplete or faulty, else True.
1979 ***************************************************************************/
1980 static BOOL
service_ok(int iService
)
1985 if (iSERVICE(iService
).szService
[0] == '\0')
1988 ("The following message indicates an internal error:\n"));
1989 DEBUG(0, ("No service name in service entry.\n"));
1993 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
1994 /* I can't see why you'd want a non-printable printer service... */
1995 if (strwicmp(iSERVICE(iService
).szService
, PRINTERS_NAME
) == 0) {
1996 if (!iSERVICE(iService
).bPrint_ok
) {
1998 ("WARNING: [%s] service MUST be printable!\n",
1999 iSERVICE(iService
).szService
));
2000 iSERVICE(iService
).bPrint_ok
= True
;
2002 /* [printers] service must also be non-browsable. */
2003 if (iSERVICE(iService
).bBrowseable
)
2004 iSERVICE(iService
).bBrowseable
= False
;
2007 if (iSERVICE(iService
).szPath
[0] == '\0' &&
2008 strwicmp(iSERVICE(iService
).szService
, HOMES_NAME
) != 0)
2011 ("No path in service %s - using %s\n",
2012 iSERVICE(iService
).szService
, tmpdir()));
2013 string_set(&iSERVICE(iService
).szPath
, tmpdir());
2016 /* If a service is flagged unavailable, log the fact at level 0. */
2017 if (!iSERVICE(iService
).bAvailable
)
2018 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2019 iSERVICE(iService
).szService
));
2024 static struct file_lists
2026 struct file_lists
*next
;
2032 /*******************************************************************
2033 keep a linked list of all config files so we know when one has changed
2034 it's date and needs to be reloaded
2035 ********************************************************************/
2036 static void add_to_file_list(char *fname
)
2038 struct file_lists
*f
= file_lists
;
2042 if (f
->name
&& !strcmp(f
->name
, fname
))
2049 f
= (struct file_lists
*)malloc(sizeof(file_lists
[0]));
2052 f
->next
= file_lists
;
2053 f
->name
= strdup(fname
);
2065 standard_sub_basic(n2
);
2066 f
->modtime
= file_modtime(n2
);
2071 /*******************************************************************
2072 check if a config file has changed date
2073 ********************************************************************/
2074 BOOL
lp_file_list_changed(void)
2076 struct file_lists
*f
= file_lists
;
2077 DEBUG(6, ("lp_file_list_changed()\n"));
2084 pstrcpy(n2
, f
->name
);
2085 standard_sub_basic(n2
);
2087 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2088 f
->name
, n2
, ctime(&f
->modtime
)));
2090 mod_time
= file_modtime(n2
);
2092 if (f
->modtime
!= mod_time
)
2095 ("file %s modified: %s\n", n2
,
2097 f
->modtime
= mod_time
;
2105 /***************************************************************************
2106 Run standard_sub_basic on netbios name... needed because global_myname
2107 is not accessed through any lp_ macro.
2108 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2109 ***************************************************************************/
2111 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
)
2113 pstring netbios_name
;
2115 pstrcpy(netbios_name
, pszParmValue
);
2117 standard_sub_basic(netbios_name
);
2118 strupper(netbios_name
);
2121 * Convert from UNIX to DOS string - the UNIX to DOS converter
2122 * isn't called on the special handlers.
2124 unix_to_dos(netbios_name
, True
);
2125 pstrcpy(global_myname
, netbios_name
);
2128 ("handle_netbios_name: set global_myname to: %s\n",
2134 /***************************************************************************
2135 Do the work of sourcing in environment variable/value pairs.
2136 ***************************************************************************/
2138 static BOOL
source_env(char **lines
)
2145 for (i
= 0; lines
[i
]; i
++)
2147 char *line
= lines
[i
];
2149 if ((len
= strlen(line
)) == 0)
2152 if (line
[len
- 1] == '\n')
2155 if ((varval
= malloc(len
+ 1)) == NULL
)
2157 DEBUG(0, ("source_env: Not enough memory!\n"));
2161 DEBUG(4, ("source_env: Adding to environment: %s\n", line
));
2162 strncpy(varval
, line
, len
);
2165 p
= strchr(line
, (int)'=');
2168 DEBUG(4, ("source_env: missing '=': %s\n", line
));
2175 ("source_env: Failed to put environment variable %s\n",
2183 ("source_env: getting var %s = %s\n", line
,
2187 DEBUG(4, ("source_env: returning successfully\n"));
2191 /***************************************************************************
2192 Handle the source environment operation
2193 ***************************************************************************/
2195 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
)
2202 pstrcpy(fname
, pszParmValue
);
2204 standard_sub_basic(fname
);
2206 string_set(ptr
, pszParmValue
);
2208 DEBUG(4, ("handle_source_env: checking env type\n"));
2211 * Filename starting with '|' means popen and read from stdin.
2216 lines
= file_lines_pload(p
+ 1, NULL
);
2220 lines
= file_lines_load(fname
, NULL
);
2226 ("handle_source_env: Failed to open file %s, Error was %s\n",
2227 fname
, strerror(errno
)));
2231 result
= source_env(lines
);
2232 file_lines_free(lines
);
2237 /***************************************************************************
2238 handle the interpretation of the vfs object parameter
2239 *************************************************************************/
2240 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
)
2242 /* Set string value */
2244 string_set(ptr
, pszParmValue
);
2246 /* Do any other initialisation required for vfs. Note that
2247 anything done here may have linking repercussions in nmbd. */
2252 /***************************************************************************
2253 handle the interpretation of the coding system parameter
2254 *************************************************************************/
2255 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
)
2257 string_set(ptr
, pszParmValue
);
2258 interpret_coding_system(pszParmValue
);
2262 /***************************************************************************
2263 Handle the interpretation of the character set system parameter.
2264 ***************************************************************************/
2266 static char *saved_character_set
= NULL
;
2268 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
)
2270 /* A dependency here is that the parameter client code page should be
2271 set before this is called.
2273 string_set(ptr
, pszParmValue
);
2275 saved_character_set
= strdup(*ptr
);
2276 interpret_character_set(*ptr
, lp_client_code_page());
2280 /***************************************************************************
2281 Handle the interpretation of the client code page parameter.
2282 We handle this separately so that we can reset the character set
2283 parameter in case this came before 'client code page' in the smb.conf.
2284 ***************************************************************************/
2286 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
)
2288 Globals
.client_code_page
= atoi(pszParmValue
);
2289 if (saved_character_set
!= NULL
)
2290 interpret_character_set(saved_character_set
,
2291 lp_client_code_page());
2292 codepage_initialise(lp_client_code_page());
2296 /***************************************************************************
2297 handle the valid chars lines
2298 ***************************************************************************/
2300 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
)
2302 string_set(ptr
, pszParmValue
);
2304 /* A dependency here is that the parameter client code page must be
2305 set before this is called - as calling codepage_initialise()
2306 would overwrite the valid char lines.
2308 codepage_initialise(lp_client_code_page());
2310 add_char_string(pszParmValue
);
2314 /***************************************************************************
2315 handle the include operation
2316 ***************************************************************************/
2318 static BOOL
handle_include(char *pszParmValue
, char **ptr
)
2321 pstrcpy(fname
, pszParmValue
);
2323 add_to_file_list(fname
);
2325 standard_sub_basic(fname
);
2327 string_set(ptr
, fname
);
2329 if (file_exist(fname
, NULL
))
2330 return (pm_process(fname
, do_section
, do_parameter
));
2332 DEBUG(2, ("Can't find include file %s\n", fname
));
2338 /***************************************************************************
2339 handle the interpretation of the copy parameter
2340 ***************************************************************************/
2341 static BOOL
handle_copy(char *pszParmValue
, char **ptr
)
2345 service serviceTemp
;
2347 string_set(ptr
, pszParmValue
);
2349 init_service(&serviceTemp
);
2353 DEBUG(3, ("Copying service from service %s\n", pszParmValue
));
2355 if ((iTemp
= getservicebyname(pszParmValue
, &serviceTemp
)) >= 0)
2357 if (iTemp
== iServiceIndex
)
2360 ("Can't copy service %s - unable to copy self!\n",
2365 copy_service(pSERVICE(iServiceIndex
),
2367 iSERVICE(iServiceIndex
).copymap
);
2373 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2378 free_service(&serviceTemp
);
2382 /***************************************************************************
2383 Handle winbind uid and gid allocation parameters. The format of these
2388 winbind uid = 1000-1999
2389 winbind gid = 700-899
2391 We only do simple parsing checks here. The strings are parsed into useful
2392 structures in the winbind daemon code.
2394 ***************************************************************************/
2396 /* Do some simple checks on "winbind [ug]id" parameter value */
2398 static BOOL
handle_winbind_id(char *pszParmValue
, char **ptr
)
2402 if (sscanf(pszParmValue
, "%d-%d", &low
, &high
) != 2)
2409 string_set(ptr
, pszParmValue
);
2414 /***************************************************************************
2415 Handle the WINS SERVER list
2416 ***************************************************************************/
2417 static BOOL
handle_wins_server_list( char *pszParmValue
, char **ptr
)
2419 if( !wins_srv_load_list( pszParmValue
) )
2420 return( False
); /* Parse failed. */
2422 string_set( ptr
, pszParmValue
);
2427 /***************************************************************************
2428 initialise a copymap
2429 ***************************************************************************/
2430 static void init_copymap(service
* pservice
)
2433 if (pservice
->copymap
)
2434 free(pservice
->copymap
);
2435 pservice
->copymap
= (BOOL
*)malloc(sizeof(BOOL
) * NUMPARAMETERS
);
2436 if (!pservice
->copymap
)
2438 ("Couldn't allocate copymap!! (size %d)\n",
2439 (int)NUMPARAMETERS
));
2441 for (i
= 0; i
< NUMPARAMETERS
; i
++)
2442 pservice
->copymap
[i
] = True
;
2446 /***************************************************************************
2447 return the local pointer to a parameter given the service number and the
2448 pointer into the default structure
2449 ***************************************************************************/
2450 void *lp_local_ptr(int snum
, void *ptr
)
2452 return (void *)(((char *)pSERVICE(snum
)) + PTR_DIFF(ptr
, &sDefault
));
2455 /***************************************************************************
2456 Process a parameter for a particular service number. If snum < 0
2457 then assume we are in the globals
2458 ***************************************************************************/
2459 BOOL
lp_do_parameter(int snum
, char *pszParmName
, char *pszParmValue
)
2462 void *parm_ptr
= NULL
; /* where we are going to store the result */
2463 void *def_ptr
= NULL
;
2465 parmnum
= map_parameter(pszParmName
);
2470 ("Ignoring unknown parameter \"%s\"\n", pszParmName
));
2474 if (parm_table
[parmnum
].flags
& FLAG_DEPRECATED
)
2476 DEBUG(1, ("WARNING: The \"%s\"option is deprecated\n",
2480 def_ptr
= parm_table
[parmnum
].ptr
;
2482 /* we might point at a service, the default service or a global */
2489 if (parm_table
[parmnum
].class == P_GLOBAL
)
2492 ("Global parameter %s found in service section!\n",
2497 ((char *)pSERVICE(snum
)) + PTR_DIFF(def_ptr
,
2503 if (!iSERVICE(snum
).copymap
)
2504 init_copymap(pSERVICE(snum
));
2506 /* this handles the aliases - set the copymap for other entries with
2507 the same data pointer */
2508 for (i
= 0; parm_table
[i
].label
; i
++)
2509 if (parm_table
[i
].ptr
== parm_table
[parmnum
].ptr
)
2510 iSERVICE(snum
).copymap
[i
] = False
;
2513 /* if it is a special case then go ahead */
2514 if (parm_table
[parmnum
].special
)
2516 parm_table
[parmnum
].special(pszParmValue
, (char **)parm_ptr
);
2520 /* now switch on the type of variable it is */
2521 switch (parm_table
[parmnum
].type
)
2524 set_boolean(parm_ptr
, pszParmValue
);
2528 set_boolean(parm_ptr
, pszParmValue
);
2529 *(BOOL
*)parm_ptr
= !*(BOOL
*)parm_ptr
;
2533 *(int *)parm_ptr
= atoi(pszParmValue
);
2537 *(char *)parm_ptr
= *pszParmValue
;
2541 sscanf(pszParmValue
, "%o", (int *)parm_ptr
);
2545 string_set(parm_ptr
, pszParmValue
);
2546 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2547 unix_to_dos(*(char **)parm_ptr
, True
);
2551 string_set(parm_ptr
, pszParmValue
);
2552 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2553 unix_to_dos(*(char **)parm_ptr
, True
);
2554 strupper(*(char **)parm_ptr
);
2558 pstrcpy((char *)parm_ptr
, pszParmValue
);
2559 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2560 unix_to_dos((char *)parm_ptr
, True
);
2564 pstrcpy((char *)parm_ptr
, pszParmValue
);
2565 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2566 unix_to_dos((char *)parm_ptr
, True
);
2567 strupper((char *)parm_ptr
);
2571 for (i
= 0; parm_table
[parmnum
].enum_list
[i
].name
;
2576 parm_table
[parmnum
].enum_list
[i
].name
))
2579 parm_table
[parmnum
].
2592 /***************************************************************************
2593 Process a parameter.
2594 ***************************************************************************/
2595 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
)
2597 if (!bInGlobalSection
&& bGlobalOnly
)
2600 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName
, pszParmValue
));
2602 return (lp_do_parameter(bInGlobalSection
? -2 : iServiceIndex
,
2603 pszParmName
, pszParmValue
));
2607 /***************************************************************************
2608 print a parameter of the specified type
2609 ***************************************************************************/
2610 static void print_parameter(struct parm_struct
*p
, void *ptr
, FILE * f
)
2616 for (i
= 0; p
->enum_list
[i
].name
; i
++)
2618 if (*(int *)ptr
== p
->enum_list
[i
].value
)
2621 p
->enum_list
[i
].name
);
2628 fprintf(f
, "%s", BOOLSTR(*(BOOL
*)ptr
));
2632 fprintf(f
, "%s", BOOLSTR(!*(BOOL
*)ptr
));
2636 fprintf(f
, "%d", *(int *)ptr
);
2640 fprintf(f
, "%c", *(char *)ptr
);
2644 fprintf(f
, "%s", octal_string(*(int *)ptr
));
2650 fprintf(f
, "%s", (char *)ptr
);
2656 fprintf(f
, "%s", *(char **)ptr
);
2664 /***************************************************************************
2665 check if two parameters are equal
2666 ***************************************************************************/
2667 static BOOL
equal_parameter(parm_type type
, void *ptr1
, void *ptr2
)
2673 return (*((BOOL
*)ptr1
) == *((BOOL
*)ptr2
));
2678 return (*((int *)ptr1
) == *((int *)ptr2
));
2681 return (*((char *)ptr1
) == *((char *)ptr2
));
2686 char *p1
= (char *)ptr1
, *p2
= (char *)ptr2
;
2691 return (p1
== p2
|| strequal(p1
, p2
));
2696 char *p1
= *(char **)ptr1
, *p2
= *(char **)ptr2
;
2701 return (p1
== p2
|| strequal(p1
, p2
));
2709 /***************************************************************************
2710 Initialize any local varients in the sDefault table.
2711 ***************************************************************************/
2713 void init_locals(void)
2718 /***************************************************************************
2719 Process a new section (service). At this stage all sections are services.
2720 Later we'll have special sections that permit server parameters to be set.
2721 Returns True on success, False on failure.
2722 ***************************************************************************/
2723 static BOOL
do_section(char *pszSectionName
)
2726 BOOL isglobal
= ((strwicmp(pszSectionName
, GLOBAL_NAME
) == 0) ||
2727 (strwicmp(pszSectionName
, GLOBAL_NAME2
) == 0));
2730 /* if we were in a global section then do the local inits */
2731 if (bInGlobalSection
&& !isglobal
)
2734 /* if we've just struck a global section, note the fact. */
2735 bInGlobalSection
= isglobal
;
2737 /* check for multiple global sections */
2738 if (bInGlobalSection
)
2740 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName
));
2744 if (!bInGlobalSection
&& bGlobalOnly
)
2747 /* if we have a current service, tidy it up before moving on */
2750 if (iServiceIndex
>= 0)
2751 bRetval
= service_ok(iServiceIndex
);
2753 /* if all is still well, move to the next record in the services array */
2756 /* We put this here to avoid an odd message order if messages are */
2757 /* issued by the post-processing of a previous section. */
2758 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName
));
2760 if ((iServiceIndex
= add_a_service(&sDefault
, pszSectionName
))
2763 DEBUG(0, ("Failed to add a new service\n"));
2772 /***************************************************************************
2773 determine if a partcular base parameter is currently set to the default value.
2774 ***************************************************************************/
2775 static BOOL
is_default(int i
)
2777 if (!defaults_saved
)
2779 switch (parm_table
[i
].type
)
2783 return strequal(parm_table
[i
].def
.svalue
,
2784 *(char **)parm_table
[i
].ptr
);
2787 return strequal(parm_table
[i
].def
.svalue
,
2788 (char *)parm_table
[i
].ptr
);
2791 return parm_table
[i
].def
.bvalue
==
2792 *(BOOL
*)parm_table
[i
].ptr
;
2794 return parm_table
[i
].def
.cvalue
==
2795 *(char *)parm_table
[i
].ptr
;
2799 return parm_table
[i
].def
.ivalue
==
2800 *(int *)parm_table
[i
].ptr
;
2808 /***************************************************************************
2809 Display the contents of the global structure.
2810 ***************************************************************************/
2811 static void dump_globals(FILE * f
)
2814 fprintf(f
, "# Global parameters\n[global]\n");
2816 for (i
= 0; parm_table
[i
].label
; i
++)
2817 if (parm_table
[i
].class == P_GLOBAL
&&
2818 parm_table
[i
].ptr
&&
2819 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
2821 if (defaults_saved
&& is_default(i
))
2823 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
2824 print_parameter(&parm_table
[i
], parm_table
[i
].ptr
, f
);
2829 /***************************************************************************
2830 return True if a local parameter is currently set to the global default
2831 ***************************************************************************/
2832 BOOL
lp_is_default(int snum
, struct parm_struct
*parm
)
2834 int pdiff
= PTR_DIFF(parm
->ptr
, &sDefault
);
2836 return equal_parameter(parm
->type
,
2837 ((char *)pSERVICE(snum
)) + pdiff
,
2838 ((char *)&sDefault
) + pdiff
);
2842 /***************************************************************************
2843 Display the contents of a single services record.
2844 ***************************************************************************/
2845 static void dump_a_service(service
* pService
, FILE * f
)
2848 if (pService
!= &sDefault
)
2849 fprintf(f
, "\n[%s]\n", pService
->szService
);
2851 for (i
= 0; parm_table
[i
].label
; i
++)
2852 if (parm_table
[i
].class == P_LOCAL
&&
2853 parm_table
[i
].ptr
&&
2854 (*parm_table
[i
].label
!= '-') &&
2855 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
2857 int pdiff
= PTR_DIFF(parm_table
[i
].ptr
, &sDefault
);
2859 if (pService
== &sDefault
)
2861 if (defaults_saved
&& is_default(i
))
2866 if (equal_parameter(parm_table
[i
].type
,
2867 ((char *)pService
) +
2869 ((char *)&sDefault
) +
2874 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
2875 print_parameter(&parm_table
[i
],
2876 ((char *)pService
) + pdiff
, f
);
2882 /***************************************************************************
2883 return info about the next service in a service. snum==-1 gives the globals
2885 return NULL when out of parameters
2886 ***************************************************************************/
2887 struct parm_struct
*lp_next_parameter(int snum
, int *i
, int allparameters
)
2891 /* do the globals */
2892 for (; parm_table
[*i
].label
; (*i
)++)
2894 if (parm_table
[*i
].class == P_SEPARATOR
)
2895 return &parm_table
[(*i
)++];
2897 if (!parm_table
[*i
].ptr
2898 || (*parm_table
[*i
].label
== '-'))
2902 && (parm_table
[*i
].ptr
==
2903 parm_table
[(*i
) - 1].ptr
))
2906 return &parm_table
[(*i
)++];
2911 service
*pService
= pSERVICE(snum
);
2913 for (; parm_table
[*i
].label
; (*i
)++)
2915 if (parm_table
[*i
].class == P_SEPARATOR
)
2916 return &parm_table
[(*i
)++];
2918 if (parm_table
[*i
].class == P_LOCAL
&&
2919 parm_table
[*i
].ptr
&&
2920 (*parm_table
[*i
].label
!= '-') &&
2922 (parm_table
[*i
].ptr
!=
2923 parm_table
[(*i
) - 1].ptr
)))
2926 PTR_DIFF(parm_table
[*i
].ptr
,
2929 if (allparameters
||
2930 !equal_parameter(parm_table
[*i
].type
,
2931 ((char *)pService
) +
2933 ((char *)&sDefault
) +
2936 return &parm_table
[(*i
)++];
2947 /***************************************************************************
2948 Display the contents of a single copy structure.
2949 ***************************************************************************/
2950 static void dump_copy_map(BOOL
*pcopymap
)
2956 printf("\n\tNon-Copied parameters:\n");
2958 for (i
= 0; parm_table
[i
].label
; i
++)
2959 if (parm_table
[i
].class == P_LOCAL
&&
2960 parm_table
[i
].ptr
&& !pcopymap
[i
] &&
2961 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
2963 printf("\t\t%s\n", parm_table
[i
].label
);
2968 /***************************************************************************
2969 Return TRUE if the passed service number is within range.
2970 ***************************************************************************/
2971 BOOL
lp_snum_ok(int iService
)
2973 return (LP_SNUM_OK(iService
) && iSERVICE(iService
).bAvailable
);
2977 /***************************************************************************
2978 auto-load some home services
2979 ***************************************************************************/
2980 static void lp_add_auto_services(char *str
)
2993 homes
= lp_servicenumber(HOMES_NAME
);
2995 for (p
= strtok(s
, LIST_SEP
); p
; p
= strtok(NULL
, LIST_SEP
))
2997 char *home
= get_user_home_dir(p
);
2999 if (lp_servicenumber(p
) >= 0)
3002 if (home
&& homes
>= 0)
3004 lp_add_home(p
, homes
, home
);
3010 /***************************************************************************
3011 auto-load one printer
3012 ***************************************************************************/
3013 void lp_add_one_printer(char *name
, char *comment
)
3015 int printers
= lp_servicenumber(PRINTERS_NAME
);
3018 if (lp_servicenumber(name
) < 0)
3020 lp_add_printer(name
, printers
);
3021 if ((i
= lp_servicenumber(name
)) >= 0)
3023 string_set(&iSERVICE(i
).comment
, comment
);
3024 iSERVICE(i
).autoloaded
= True
;
3029 /***************************************************************************
3030 have we loaded a services file yet?
3031 ***************************************************************************/
3032 BOOL
lp_loaded(void)
3037 /***************************************************************************
3038 unload unused services
3039 ***************************************************************************/
3040 void lp_killunused(BOOL (*snumused
) (int))
3043 for (i
= 0; i
< iNumServices
; i
++)
3048 if (!snumused
|| !snumused(i
))
3050 iSERVICE(i
).valid
= False
;
3051 free_service(pSERVICE(i
));
3057 /***************************************************************************
3059 ***************************************************************************/
3060 void lp_killservice(int iServiceIn
)
3062 if (VALID(iServiceIn
))
3064 iSERVICE(iServiceIn
).valid
= False
;
3065 free_service(pSERVICE(iServiceIn
));
3069 /***************************************************************************
3070 save the curent values of all global and sDefault parameters into the
3071 defaults union. This allows swat and testparm to show only the
3072 changed (ie. non-default) parameters.
3073 ***************************************************************************/
3074 static void lp_save_defaults(void)
3077 for (i
= 0; parm_table
[i
].label
; i
++)
3079 if (i
> 0 && parm_table
[i
].ptr
== parm_table
[i
- 1].ptr
)
3081 switch (parm_table
[i
].type
)
3085 parm_table
[i
].def
.svalue
=
3086 strdup(*(char **)parm_table
[i
].ptr
);
3090 parm_table
[i
].def
.svalue
=
3091 strdup((char *)parm_table
[i
].ptr
);
3095 parm_table
[i
].def
.bvalue
=
3096 *(BOOL
*)parm_table
[i
].ptr
;
3099 parm_table
[i
].def
.cvalue
=
3100 *(char *)parm_table
[i
].ptr
;
3105 parm_table
[i
].def
.ivalue
=
3106 *(int *)parm_table
[i
].ptr
;
3112 defaults_saved
= True
;
3115 /*******************************************************************
3116 Set the server type we will announce as via nmbd.
3117 ********************************************************************/
3118 static void set_server_role(void)
3120 server_role
= ROLE_STANDALONE
;
3122 switch (lp_security())
3126 if (lp_domain_logons())
3129 ("Server's Role (logon server) conflicts with share-level security\n"));
3136 if (lp_domain_logons())
3138 server_role
= ROLE_DOMAIN_BDC
;
3141 server_role
= ROLE_DOMAIN_MEMBER
;
3146 if (lp_domain_logons())
3148 server_role
= ROLE_DOMAIN_PDC
;
3156 ("Server's Role undefined due to unknown security mode\n"));
3162 /***************************************************************************
3163 Load the services array from the services file. Return True on success,
3165 ***************************************************************************/
3166 BOOL
lp_load(char *pszFname
, BOOL global_only
, BOOL save_defaults
,
3172 add_to_file_list(pszFname
);
3176 bInGlobalSection
= True
;
3177 bGlobalOnly
= global_only
;
3187 pstrcpy(n2
, pszFname
);
3188 standard_sub_basic(n2
);
3190 /* We get sections first, so have to start 'behind' to make up */
3192 bRetval
= pm_process(n2
, do_section
, do_parameter
);
3194 /* finish up the last section */
3195 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval
)));
3197 if (iServiceIndex
>= 0)
3198 bRetval
= service_ok(iServiceIndex
);
3200 lp_add_auto_services(lp_auto_services());
3206 set_default_server_announce_type();
3210 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3211 /* if bWINSsupport is true and we are in the client */
3213 if (in_client
&& Globals
.bWINSsupport
)
3216 string_set(&Globals
.szWINSserver
, "127.0.0.1");
3224 /***************************************************************************
3225 reset the max number of services
3226 ***************************************************************************/
3227 void lp_resetnumservices(void)
3232 /***************************************************************************
3233 return the max number of services
3234 ***************************************************************************/
3235 int lp_numservices(void)
3237 return (iNumServices
);
3240 /***************************************************************************
3241 Display the contents of the services array in human-readable form.
3242 ***************************************************************************/
3243 void lp_dump(FILE * f
, BOOL show_defaults
, int maxtoprint
)
3249 defaults_saved
= False
;
3254 dump_a_service(&sDefault
, f
);
3256 for (iService
= 0; iService
< maxtoprint
; iService
++)
3257 lp_dump_one(f
, show_defaults
, iService
);
3260 /***************************************************************************
3261 Display the contents of one service in human-readable form.
3262 ***************************************************************************/
3263 void lp_dump_one(FILE * f
, BOOL show_defaults
, int snum
)
3267 if (iSERVICE(snum
).szService
[0] == '\0')
3269 dump_a_service(pSERVICE(snum
), f
);
3274 /***************************************************************************
3275 Return the number of the service with the given name, or -1 if it doesn't
3276 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3277 getservicebyname()! This works ONLY if all services have been loaded, and
3278 does not copy the found service.
3279 ***************************************************************************/
3280 int lp_servicenumber(char *pszServiceName
)
3284 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
3285 if (VALID(iService
) &&
3286 strequal(lp_servicename(iService
), pszServiceName
))
3291 ("lp_servicenumber: couldn't find %s\n",
3297 /*******************************************************************
3298 a useful volume label function
3299 ******************************************************************/
3300 char *volume_label(int snum
)
3302 char *ret
= lp_volume(snum
);
3304 /* lp_volume returns a unix charset - lp_servicename returns a
3305 dos codepage - convert so volume_label() always returns UNIX.
3307 return (dos_to_unix(lp_servicename(snum
), False
));
3313 /*******************************************************************
3314 Set the server type we will announce as via nmbd.
3315 ********************************************************************/
3316 static void set_default_server_announce_type(void)
3318 default_server_announce
= 0;
3319 default_server_announce
|= SV_TYPE_WORKSTATION
;
3320 default_server_announce
|= SV_TYPE_SERVER
;
3321 default_server_announce
|= SV_TYPE_SERVER_UNIX
;
3322 default_server_announce
|= SV_TYPE_PRINTQ_SERVER
;
3324 switch (lp_announce_as())
3326 case ANNOUNCE_AS_NT_SERVER
:
3328 default_server_announce
|= SV_TYPE_SERVER_NT
;
3329 /* fall through... */
3331 case ANNOUNCE_AS_NT_WORKSTATION
:
3333 default_server_announce
|= SV_TYPE_NT
;
3336 case ANNOUNCE_AS_WIN95
:
3338 default_server_announce
|= SV_TYPE_WIN95_PLUS
;
3341 case ANNOUNCE_AS_WFW
:
3343 default_server_announce
|= SV_TYPE_WFW
;
3352 switch (lp_server_role())
3354 case ROLE_DOMAIN_MEMBER
:
3356 default_server_announce
|= SV_TYPE_DOMAIN_MEMBER
;
3359 case ROLE_DOMAIN_PDC
:
3361 default_server_announce
|= SV_TYPE_DOMAIN_CTRL
;
3364 case ROLE_DOMAIN_BDC
:
3366 default_server_announce
|= SV_TYPE_DOMAIN_BAKCTRL
;
3369 case ROLE_STANDALONE
:
3376 if (lp_time_server())
3378 default_server_announce
|= SV_TYPE_TIME_SOURCE
;
3381 if (lp_host_msdfs())
3383 default_server_announce
|= SV_TYPE_DFS_SERVER
;
3387 /***********************************************************
3388 returns role of Samba server
3389 ************************************************************/
3391 int lp_server_role(void)
3396 /***********************************************************
3397 If we are PDC then prefer us as DMB
3398 ************************************************************/
3400 BOOL
lp_domain_master(void)
3402 if (Globals
.bDomainMaster
== Auto
)
3404 return (lp_server_role() == ROLE_DOMAIN_PDC
);
3407 return Globals
.bDomainMaster
;
3410 /***********************************************************
3411 If we are DMB then prefer us as LMB
3412 ************************************************************/
3414 BOOL
lp_preferred_master(void)
3416 if (Globals
.bPreferredMaster
== Auto
)
3418 return (lp_local_master() && lp_domain_master());
3421 return Globals
.bPreferredMaster
;
3426 /*******************************************************************
3428 ********************************************************************/
3429 void lp_remove_service(int snum
)
3431 pSERVICE(snum
)->valid
= False
;
3434 /*******************************************************************
3436 ********************************************************************/
3437 void lp_copy_service(int snum
, char *new_name
)
3439 char *oldname
= lp_servicename(snum
);
3440 do_section(new_name
);
3443 snum
= lp_servicenumber(new_name
);
3445 lp_do_parameter(snum
, "copy", oldname
);
3450 /*******************************************************************
3451 Get the default server type we will announce as via nmbd.
3452 ********************************************************************/
3453 int lp_default_server_announce(void)
3455 return default_server_announce
;
3458 /*******************************************************************
3459 Split the announce version into major and minor numbers.
3460 ********************************************************************/
3461 int lp_major_announce_version(void)
3463 static BOOL got_major
= False
;
3464 static int major_version
= DEFAULT_MAJOR_VERSION
;
3469 return major_version
;
3472 if ((vers
= lp_announce_version()) == NULL
)
3473 return major_version
;
3475 if ((p
= strchr(vers
, '.')) == 0)
3476 return major_version
;
3479 major_version
= atoi(vers
);
3480 return major_version
;
3483 int lp_minor_announce_version(void)
3485 static BOOL got_minor
= False
;
3486 static int minor_version
= DEFAULT_MINOR_VERSION
;
3491 return minor_version
;
3494 if ((vers
= lp_announce_version()) == NULL
)
3495 return minor_version
;
3497 if ((p
= strchr(vers
, '.')) == 0)
3498 return minor_version
;
3501 minor_version
= atoi(p
);
3502 return minor_version
;
3505 /***********************************************************
3506 Set the global name resolution order (used in smbclient).
3507 ************************************************************/
3509 void lp_set_name_resolve_order(char *new_order
)
3511 Globals
.szNameResolveOrder
= new_order
;
3514 /***********************************************************
3515 Functions to return the current security masks/modes. If
3516 set to -1 then return the create mask/mode instead.
3517 ************************************************************/
3519 int lp_security_mask(int snum
)
3521 int val
= _lp_security_mask(snum
);
3523 return lp_create_mask(snum
);
3527 int lp_force_security_mode(int snum
)
3529 int val
= _lp_force_security_mode(snum
);
3531 return lp_force_create_mode(snum
);
3535 int lp_dir_security_mask(int snum
)
3537 int val
= _lp_dir_security_mask(snum
);
3539 return lp_dir_mask(snum
);
3543 int lp_force_dir_security_mode(int snum
)
3545 int val
= _lp_force_dir_security_mode(snum
);
3547 return lp_force_dir_mode(snum
);
3551 char *lp_printername(int snum
)
3553 char *ret
= _lp_printername(snum
);
3554 if (ret
== NULL
|| (ret
!= NULL
&& *ret
== '\0'))
3555 ret
= lp_servicename(snum
);