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 extern BOOL use_getwd_cache
;
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
;
122 char *szSMBPasswdFile
;
123 char *szPasswordServer
;
124 char *szSocketOptions
;
127 char *szDomainAdminGroup
;
128 char *szDomainGuestGroup
;
129 char *szDomainAdminUsers
;
130 char *szDomainGuestUsers
;
131 char *szDomainHostsallow
;
132 char *szDomainHostsdeny
;
134 #ifdef USING_GROUPNAME_MAP
135 char *szGroupnameMap
;
136 #endif /* USING_GROUPNAME_MAP */
137 char *szCharacterSet
;
144 char *szCodingSystem
;
146 char *szRemoteAnnounce
;
147 char *szRemoteBrowseSync
;
148 char *szSocketAddress
;
149 char *szNISHomeMapName
;
150 char *szAnnounceVersion
; /* This is initialised in init_globals */
151 char *szNetbiosAliases
;
152 char *szDomainOtherSIDs
;
153 char *szDomainGroups
;
154 char *szNameResolveOrder
;
159 char *szLdapRootPassword
;
161 char *szAddUserScript
;
162 char *szDelUserScript
;
166 #endif /* WITH_UTMP */
170 char *szTemplateHomedir
;
171 char *szTemplateShell
;
172 char *szWinbindSeparator
;
194 int client_code_page
;
195 int announce_as
; /* This is initialised in init_globals */
196 int machine_password_timeout
;
197 int change_notify_timeout
;
200 int min_passwd_length
;
201 int oplock_break_wait_time
;
202 int winbind_cache_time
;
205 #endif /* WITH_LDAP */
208 char *sslHostsRequire
;
209 char *sslHostsResign
;
215 char *sslClientPrivKey
;
218 BOOL sslReqClientCert
;
219 BOOL sslReqServerCert
;
220 BOOL sslCompatibility
;
221 #endif /* WITH_SSL */
226 BOOL bPreferredMaster
;
229 BOOL bEncryptPasswords
;
237 BOOL bReadPrediction
;
244 BOOL bBindInterfacesOnly
;
245 BOOL bUnixPasswdSync
;
246 BOOL bPasswdChatDebug
;
253 BOOL bAllowTrustedDomains
;
254 BOOL bRestrictAnonymous
;
255 BOOL bDebugHiresTimestamp
;
262 static global Globals
;
267 * This structure describes a single service.
276 char *szGuestaccount
;
277 char *szInvalidUsers
;
285 char *szRootPostExec
;
286 char *szPrintcommand
;
289 char *szLppausecommand
;
290 char *szLpresumecommand
;
291 char *szQueuepausecommand
;
292 char *szQueueresumecommand
;
294 char *szPrinterDriver
;
295 char *szPrinterDriverLocation
;
305 char *szVetoOplockFiles
;
314 char *szVfsObjectFile
;
319 int iCreate_force_mode
;
321 int iSecurity_force_mode
;
324 int iDir_Security_mask
;
325 int iDir_Security_force_mode
;
329 int iOplockContentionLimit
;
332 BOOL bRootpreexecClose
;
335 BOOL bShortCasePreserve
;
367 BOOL bDeleteReadonly
;
369 BOOL bDeleteVetoFiles
;
371 BOOL bDosFiletimeResolution
;
372 BOOL bFakeDirCreateTimes
;
377 char dummy
[3]; /* for alignment */
382 /* This is a default service used to prime a services structure */
383 static service sDefault
= {
385 False
, /* not autoloaded */
386 NULL
, /* szService */
388 NULL
, /* szUsername */
389 NULL
, /* szGuestAccount - this is set in init_globals() */
390 NULL
, /* szInvalidUsers */
391 NULL
, /* szValidUsers */
392 NULL
, /* szAdminUsers */
394 NULL
, /* szInclude */
395 NULL
, /* szPreExec */
396 NULL
, /* szPostExec */
397 NULL
, /* szRootPreExec */
398 NULL
, /* szRootPostExec */
399 NULL
, /* szPrintcommand */
400 NULL
, /* szLpqcommand */
401 NULL
, /* szLprmcommand */
402 NULL
, /* szLppausecommand */
403 NULL
, /* szLpresumecommand */
404 NULL
, /* szQueuepausecommand */
405 NULL
, /* szQueueresumecommand */
406 NULL
, /* szPrintername */
407 NULL
, /* szPrinterDriver - this is set in init_globals() */
408 NULL
, /* szPrinterDriverLocation */
409 NULL
, /* szDriverFile */
410 NULL
, /* szDontdescend */
411 NULL
, /* szHostsallow */
412 NULL
, /* szHostsdeny */
413 NULL
, /* szMagicScript */
414 NULL
, /* szMagicOutput */
415 NULL
, /* szMangledMap */
416 NULL
, /* szVetoFiles */
417 NULL
, /* szHideFiles */
418 NULL
, /* szVetoOplockFiles */
420 NULL
, /* force user */
421 NULL
, /* force group */
423 NULL
, /* writelist */
424 NULL
, /* printer admin */
427 NULL
, /* vfs object */
428 NULL
, /* vfs options */
429 0, /* iMinPrintSpace */
430 0, /* iWriteCacheSize */
431 0744, /* iCreate_mask */
432 0000, /* iCreate_force_mode */
433 -1, /* iSecurity_mask */
434 -1, /* iSecurity_force_mode */
435 0755, /* iDir_mask */
436 0000, /* iDir_force_mode */
437 -1, /* iDir_Security_mask */
438 -1, /* iDir_Security_force_mode */
439 0, /* iMaxConnections */
440 CASE_LOWER
, /* iDefaultCase */
441 DEFAULT_PRINTING
, /* iPrinting */
442 2, /* iOplockContentionLimit */
443 False
, /* bAlternatePerm */
444 False
, /* bPreexecClose */
445 False
, /* bRootpreexecClose */
446 False
, /* case sensitive */
447 True
, /* case preserve */
448 True
, /* short case preserve */
449 False
, /* case mangle */
451 True
, /* bHideDotFiles */
452 True
, /* bBrowseable */
453 True
, /* bAvailable */
454 True
, /* bRead_only */
455 True
, /* bNo_set_dir */
456 False
, /* bGuest_only */
457 False
, /* bGuest_ok */
458 False
, /* bPrint_ok */
459 False
, /* bPostscript */
460 False
, /* bMap_system */
461 False
, /* bMap_hidden */
462 True
, /* bMap_archive */
464 False
, /* bStrictLocking */
465 True
, /* bPosixLocking */
469 True
, /* bShareModes */
471 True
, /* bLevel2OpLocks */
472 False
, /* bOnlyUser */
473 True
, /* bMangledNames */
474 True
, /* bWidelinks */
475 True
, /* bSymlinks */
476 False
, /* bSyncAlways */
477 False
, /* bStrictSync */
478 '~', /* magic char */
480 False
, /* bDeleteReadonly */
481 False
, /* bFakeOplocks */
482 False
, /* bDeleteVetoFiles */
483 False
, /* bDosFiletimes */
484 False
, /* bDosFiletimeResolution */
485 False
, /* bFakeDirCreateTimes */
486 True
, /* bBlockingLocks */
487 False
, /* bInheritPerms */
488 False
, /* bMSDfsRoot */
495 /* local variables */
496 static service
**ServicePtrs
= NULL
;
497 static int iNumServices
= 0;
498 static int iServiceIndex
= 0;
499 static BOOL bInGlobalSection
= True
;
500 static BOOL bGlobalOnly
= False
;
501 static int server_role
;
502 static int default_server_announce
;
504 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
506 /* prototypes for the special type handlers */
507 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
);
508 static BOOL
handle_include(char *pszParmValue
, char **ptr
);
509 static BOOL
handle_copy(char *pszParmValue
, char **ptr
);
510 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
);
511 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
);
512 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
);
513 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
);
514 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
);
515 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
);
516 static BOOL
handle_winbind_id(char *pszParmValue
, char **ptr
);
517 static BOOL
handle_wins_server_list(char *pszParmValue
, char **ptr
);
519 static void set_server_role(void);
520 static void set_default_server_announce_type(void);
522 static struct enum_list enum_protocol
[] = {
523 {PROTOCOL_NT1
, "NT1"},
524 {PROTOCOL_LANMAN2
, "LANMAN2"},
525 {PROTOCOL_LANMAN1
, "LANMAN1"},
526 {PROTOCOL_CORE
, "CORE"},
527 {PROTOCOL_COREPLUS
, "COREPLUS"},
528 {PROTOCOL_COREPLUS
, "CORE+"},
532 static struct enum_list enum_security
[] = {
533 {SEC_SHARE
, "SHARE"},
535 {SEC_SERVER
, "SERVER"},
536 {SEC_DOMAIN
, "DOMAIN"},
540 static struct enum_list enum_printing
[] = {
541 {PRINT_SYSV
, "sysv"},
543 {PRINT_HPUX
, "hpux"},
547 {PRINT_LPRNG
, "lprng"},
548 {PRINT_SOFTQ
, "softq"},
549 {PRINT_CUPS
, "cups"},
553 /* Types of machine we can announce as. */
554 #define ANNOUNCE_AS_NT_SERVER 1
555 #define ANNOUNCE_AS_WIN95 2
556 #define ANNOUNCE_AS_WFW 3
557 #define ANNOUNCE_AS_NT_WORKSTATION 4
559 static struct enum_list enum_announce_as
[] = {
560 {ANNOUNCE_AS_NT_SERVER
, "NT"},
561 {ANNOUNCE_AS_NT_SERVER
, "NT Server"},
562 {ANNOUNCE_AS_NT_WORKSTATION
, "NT Workstation"},
563 {ANNOUNCE_AS_WIN95
, "win95"},
564 {ANNOUNCE_AS_WFW
, "WfW"},
568 static struct enum_list enum_case
[] = {
569 {CASE_LOWER
, "lower"},
570 {CASE_UPPER
, "upper"},
574 static struct enum_list enum_bool_auto
[] = {
586 Do you want session setups at user level security with a invalid
587 password to be rejected or allowed in as guest? WinNT rejects them
588 but it can be a pain as it means "net view" needs to use a password
590 You have 3 choices in the setting of map_to_guest:
592 "Never" means session setups with an invalid password
593 are rejected. This is the default.
595 "Bad User" means session setups with an invalid password
596 are rejected, unless the username does not exist, in which case it
597 is treated as a guest login
599 "Bad Password" means session setups with an invalid password
600 are treated as a guest login
602 Note that map_to_guest only has an effect in user or server
606 static struct enum_list enum_map_to_guest
[] = {
607 {NEVER_MAP_TO_GUEST
, "Never"},
608 {MAP_TO_GUEST_ON_BAD_USER
, "Bad User"},
609 {MAP_TO_GUEST_ON_BAD_PASSWORD
, "Bad Password"},
614 static struct enum_list enum_ssl_version
[] = {
615 {SMB_SSL_V2
, "ssl2"},
616 {SMB_SSL_V3
, "ssl3"},
617 {SMB_SSL_V23
, "ssl2or3"},
618 {SMB_SSL_TLS1
, "tls1"},
623 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
624 static struct parm_struct parm_table
[] = {
625 {"Base Options", P_SEP
, P_SEPARATOR
},
627 {"coding system", P_STRING
, P_GLOBAL
, &Globals
.szCodingSystem
, handle_coding_system
, NULL
, 0},
628 {"client code page", P_INTEGER
, P_GLOBAL
, &Globals
.client_code_page
, handle_client_code_page
, NULL
, 0},
629 {"comment", P_STRING
, P_LOCAL
, &sDefault
.comment
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
630 {"path", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_DOS_STRING
},
631 {"directory", P_STRING
, P_LOCAL
, &sDefault
.szPath
, NULL
, NULL
, FLAG_DOS_STRING
},
632 {"workgroup", P_USTRING
, P_GLOBAL
, &Globals
.szWorkGroup
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
633 {"netbios name", P_UGSTRING
, P_GLOBAL
, global_myname
, handle_netbios_name
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
634 {"netbios aliases", P_STRING
, P_GLOBAL
, &Globals
.szNetbiosAliases
, NULL
, NULL
, FLAG_DOS_STRING
},
635 {"netbios scope", P_UGSTRING
, P_GLOBAL
, global_scope
, NULL
, NULL
, FLAG_DOS_STRING
},
636 {"server string", P_STRING
, P_GLOBAL
, &Globals
.szServerString
, NULL
, NULL
, FLAG_BASIC
| FLAG_DOS_STRING
},
637 {"interfaces", P_STRING
, P_GLOBAL
, &Globals
.szInterfaces
, NULL
, NULL
, FLAG_BASIC
},
638 {"bind interfaces only", P_BOOL
, P_GLOBAL
, &Globals
.bBindInterfacesOnly
, NULL
, NULL
, 0},
640 {"Security Options", P_SEP
, P_SEPARATOR
},
642 {"security", P_ENUM
, P_GLOBAL
, &Globals
.security
, NULL
, enum_security
, FLAG_BASIC
},
643 {"encrypt passwords", P_BOOL
, P_GLOBAL
, &Globals
.bEncryptPasswords
, NULL
, NULL
, FLAG_BASIC
},
644 {"update encrypted", P_BOOL
, P_GLOBAL
, &Globals
.bUpdateEncrypt
, NULL
, NULL
, FLAG_BASIC
},
645 {"allow trusted domains", P_BOOL
, P_GLOBAL
, &Globals
.bAllowTrustedDomains
, NULL
, NULL
, 0},
646 {"alternate permissions", P_BOOL
, P_LOCAL
, &sDefault
.bAlternatePerm
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_DEPRECATED
},
647 {"hosts equiv", P_STRING
, P_GLOBAL
, &Globals
.szHostsEquiv
, NULL
, NULL
, 0},
648 {"min passwd length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
649 {"min password length", P_INTEGER
, P_GLOBAL
, &Globals
.min_passwd_length
, NULL
, NULL
, 0},
650 {"map to guest", P_ENUM
, P_GLOBAL
, &Globals
.map_to_guest
, NULL
, enum_map_to_guest
, 0},
651 {"null passwords", P_BOOL
, P_GLOBAL
, &Globals
.bNullPasswords
, NULL
, NULL
, 0},
652 {"password server", P_STRING
, P_GLOBAL
, &Globals
.szPasswordServer
, NULL
, NULL
, 0},
653 {"smb passwd file", P_STRING
, P_GLOBAL
, &Globals
.szSMBPasswdFile
, NULL
, NULL
, 0},
654 {"root directory", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
655 {"root dir", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
656 {"root", P_STRING
, P_GLOBAL
, &Globals
.szRootdir
, NULL
, NULL
, 0},
658 {"passwd program", P_STRING
, P_GLOBAL
, &Globals
.szPasswdProgram
, NULL
, NULL
, 0},
659 {"passwd chat", P_STRING
, P_GLOBAL
, &Globals
.szPasswdChat
, NULL
, NULL
, 0},
660 {"passwd chat debug", P_BOOL
, P_GLOBAL
, &Globals
.bPasswdChatDebug
, NULL
, NULL
, 0},
661 {"username map", P_STRING
, P_GLOBAL
, &Globals
.szUsernameMap
, NULL
, NULL
, 0},
662 {"password level", P_INTEGER
, P_GLOBAL
, &Globals
.pwordlevel
, NULL
, NULL
, 0},
663 {"username level", P_INTEGER
, P_GLOBAL
, &Globals
.unamelevel
, NULL
, NULL
, 0},
664 {"unix password sync", P_BOOL
, P_GLOBAL
, &Globals
.bUnixPasswdSync
, NULL
, NULL
, 0},
665 {"restrict anonymous", P_BOOL
, P_GLOBAL
, &Globals
.bRestrictAnonymous
, NULL
, NULL
, 0},
666 {"use rhosts", P_BOOL
, P_GLOBAL
, &Globals
.bUseRhosts
, NULL
, NULL
, 0},
668 {"username", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
669 {"user", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
670 {"users", P_STRING
, P_LOCAL
, &sDefault
.szUsername
, NULL
, NULL
, 0},
672 {"guest account", P_STRING
, P_LOCAL
, &sDefault
.szGuestaccount
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
| FLAG_GLOBAL
},
673 {"invalid users", P_STRING
, P_LOCAL
, &sDefault
.szInvalidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
674 {"valid users", P_STRING
, P_LOCAL
, &sDefault
.szValidUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
675 {"admin users", P_STRING
, P_LOCAL
, &sDefault
.szAdminUsers
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
676 {"read list", P_STRING
, P_LOCAL
, &sDefault
.readlist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
677 {"write list", P_STRING
, P_LOCAL
, &sDefault
.writelist
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
678 {"printer admin", P_STRING
, P_LOCAL
, &sDefault
.printer_admin
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
679 {"force user", P_STRING
, P_LOCAL
, &sDefault
.force_user
, NULL
, NULL
, FLAG_SHARE
},
680 {"force group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, FLAG_SHARE
},
681 {"group", P_STRING
, P_LOCAL
, &sDefault
.force_group
, NULL
, NULL
, 0},
683 {"read only", P_BOOL
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
},
684 {"write ok", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
685 {"writeable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
686 {"writable", P_BOOLREV
, P_LOCAL
, &sDefault
.bRead_only
, NULL
, NULL
, 0},
688 {"create mask", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
689 {"create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_mask
, NULL
, NULL
, FLAG_GLOBAL
},
690 {"force create mode", P_OCTAL
, P_LOCAL
, &sDefault
.iCreate_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
691 {"security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
692 {"force security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iSecurity_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
693 {"directory mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
694 {"directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_mask
, NULL
, NULL
, FLAG_GLOBAL
},
695 {"force directory mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
696 {"directory security mask", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_mask
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
697 {"force directory security mode", P_OCTAL
, P_LOCAL
, &sDefault
.iDir_Security_force_mode
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
},
698 {"inherit permissions", P_BOOL
, P_LOCAL
, &sDefault
.bInheritPerms
, NULL
, NULL
, FLAG_SHARE
},
699 {"guest only", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, FLAG_SHARE
},
700 {"only guest", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_only
, NULL
, NULL
, 0},
702 {"guest ok", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
703 {"public", P_BOOL
, P_LOCAL
, &sDefault
.bGuest_ok
, NULL
, NULL
, 0},
705 {"only user", P_BOOL
, P_LOCAL
, &sDefault
.bOnlyUser
, NULL
, NULL
, FLAG_SHARE
},
706 {"hosts allow", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
707 {"allow hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsallow
, NULL
, NULL
, 0},
708 {"hosts deny", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
709 {"deny hosts", P_STRING
, P_LOCAL
, &sDefault
.szHostsdeny
, NULL
, NULL
, 0},
712 {"Secure Socket Layer Options", P_SEP
, P_SEPARATOR
},
713 {"ssl", P_BOOL
, P_GLOBAL
, &Globals
.sslEnabled
, NULL
, NULL
, 0},
715 {"ssl hosts", P_STRING
, P_GLOBAL
, &Globals
.sslHostsRequire
, NULL
, NULL
, 0},
716 {"ssl hosts resign", P_STRING
, P_GLOBAL
, &Globals
.sslHostsResign
, NULL
, NULL
, 0},
717 {"ssl CA certDir", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertDir
, NULL
, NULL
, 0},
718 {"ssl CA certFile", P_STRING
, P_GLOBAL
, &Globals
.sslCaCertFile
, NULL
, NULL
, 0},
719 {"ssl server cert", P_STRING
, P_GLOBAL
, &Globals
.sslCert
, NULL
, NULL
, 0},
720 {"ssl server key", P_STRING
, P_GLOBAL
, &Globals
.sslPrivKey
, NULL
, NULL
, 0},
721 {"ssl client cert", P_STRING
, P_GLOBAL
, &Globals
.sslClientCert
, NULL
, NULL
, 0},
722 {"ssl client key", P_STRING
, P_GLOBAL
, &Globals
.sslClientPrivKey
, NULL
, NULL
, 0},
723 {"ssl require clientcert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqClientCert
, NULL
, NULL
, 0},
724 {"ssl require servercert", P_BOOL
, P_GLOBAL
, &Globals
.sslReqServerCert
, NULL
, NULL
, 0},
725 {"ssl ciphers", P_STRING
, P_GLOBAL
, &Globals
.sslCiphers
, NULL
, NULL
, 0},
726 {"ssl version", P_ENUM
, P_GLOBAL
, &Globals
.sslVersion
, NULL
, enum_ssl_version
, 0},
727 {"ssl compatibility", P_BOOL
, P_GLOBAL
, &Globals
.sslCompatibility
, NULL
, NULL
, 0},
728 #endif /* WITH_SSL */
730 {"Logging Options", P_SEP
, P_SEPARATOR
},
731 {"log level", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL
, NULL
, NULL
, FLAG_BASIC
},
732 {"debuglevel", P_INTEGER
, P_GLOBAL
, &DEBUGLEVEL
, NULL
, NULL
, 0},
733 {"syslog", P_INTEGER
, P_GLOBAL
, &Globals
.syslog
, NULL
, NULL
, 0},
734 {"syslog only", P_BOOL
, P_GLOBAL
, &Globals
.bSyslogOnly
, NULL
, NULL
, 0},
735 {"log file", P_STRING
, P_GLOBAL
, &Globals
.szLogFile
, NULL
, NULL
, 0},
737 {"max log size", P_INTEGER
, P_GLOBAL
, &Globals
.max_log_size
, NULL
, NULL
, 0},
738 {"timestamp logs", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
739 {"debug timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bTimestampLogs
, NULL
, NULL
, 0},
740 {"debug hires timestamp", P_BOOL
, P_GLOBAL
, &Globals
.bDebugHiresTimestamp
, NULL
, NULL
, 0},
741 {"debug pid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugPid
, NULL
, NULL
, 0},
742 {"debug uid", P_BOOL
, P_GLOBAL
, &Globals
.bDebugUid
, NULL
, NULL
, 0},
744 {"status", P_BOOL
, P_LOCAL
, &sDefault
.status
, NULL
, NULL
, FLAG_GLOBAL
| FLAG_SHARE
| FLAG_PRINT
},
746 {"Protocol Options", P_SEP
, P_SEPARATOR
},
748 {"protocol", P_ENUM
, P_GLOBAL
, &Globals
.maxprotocol
, NULL
, enum_protocol
, 0},
749 {"read bmpx", P_BOOL
, P_GLOBAL
, &Globals
.bReadbmpx
, NULL
, NULL
, 0},
750 {"read raw", P_BOOL
, P_GLOBAL
, &Globals
.bReadRaw
, NULL
, NULL
, 0},
751 {"write raw", P_BOOL
, P_GLOBAL
, &Globals
.bWriteRaw
, NULL
, NULL
, 0},
753 {"nt smb support", P_BOOL
, P_GLOBAL
, &Globals
.bNTSmbSupport
, NULL
, NULL
, 0},
754 {"nt pipe support", P_BOOL
, P_GLOBAL
, &Globals
.bNTPipeSupport
, NULL
, NULL
, 0},
755 {"nt acl support", P_BOOL
, P_GLOBAL
, &Globals
.bNTAclSupport
, NULL
, NULL
, 0},
756 {"announce version", P_STRING
, P_GLOBAL
, &Globals
.szAnnounceVersion
, NULL
, NULL
, 0},
757 {"announce as", P_ENUM
, P_GLOBAL
, &Globals
.announce_as
, NULL
, enum_announce_as
, 0},
758 {"max mux", P_INTEGER
, P_GLOBAL
, &Globals
.max_mux
, NULL
, NULL
, 0},
759 {"max xmit", P_INTEGER
, P_GLOBAL
, &Globals
.max_xmit
, NULL
, NULL
, 0},
761 {"name resolve order", P_STRING
, P_GLOBAL
, &Globals
.szNameResolveOrder
, NULL
, NULL
, 0},
762 {"max packet", P_INTEGER
, P_GLOBAL
, &Globals
.max_packet
, NULL
, NULL
, 0},
763 {"packet size", P_INTEGER
, P_GLOBAL
, &Globals
.max_packet
, NULL
, NULL
, 0},
764 {"max ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_ttl
, NULL
, NULL
, 0},
765 {"max wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.max_wins_ttl
, NULL
, NULL
, 0},
766 {"min wins ttl", P_INTEGER
, P_GLOBAL
, &Globals
.min_wins_ttl
, NULL
, NULL
, 0},
767 {"time server", P_BOOL
, P_GLOBAL
, &Globals
.bTimeServer
, NULL
, NULL
, 0},
769 {"Tuning Options", P_SEP
, P_SEPARATOR
},
771 {"change notify timeout", P_INTEGER
, P_GLOBAL
, &Globals
.change_notify_timeout
, NULL
, NULL
, 0},
772 {"deadtime", P_INTEGER
, P_GLOBAL
, &Globals
.deadtime
, NULL
, NULL
, 0},
773 {"getwd cache", P_BOOL
, P_GLOBAL
, &use_getwd_cache
, NULL
, NULL
, 0},
774 {"keepalive", P_INTEGER
, P_GLOBAL
, &keepalive
, NULL
, NULL
, 0},
776 {"lpq cache time", P_INTEGER
, P_GLOBAL
, &Globals
.lpqcachetime
, NULL
, NULL
, 0},
777 {"max connections", P_INTEGER
, P_LOCAL
, &sDefault
.iMaxConnections
, NULL
, NULL
, FLAG_SHARE
},
778 {"max disk size", P_INTEGER
, P_GLOBAL
, &Globals
.maxdisksize
, NULL
, NULL
, 0},
779 {"max open files", P_INTEGER
, P_GLOBAL
, &Globals
.max_open_files
, NULL
, NULL
, 0},
780 {"min print space", P_INTEGER
, P_LOCAL
, &sDefault
.iMinPrintSpace
, NULL
, NULL
, FLAG_PRINT
},
781 {"read size", P_INTEGER
, P_GLOBAL
, &Globals
.ReadSize
, NULL
, NULL
, 0},
783 {"socket options", P_GSTRING
, P_GLOBAL
, user_socket_options
, NULL
, NULL
, 0},
784 {"stat cache size", P_INTEGER
, P_GLOBAL
, &Globals
.stat_cache_size
, NULL
, NULL
, 0},
785 {"strict sync", P_BOOL
, P_LOCAL
, &sDefault
.bStrictSync
, NULL
, NULL
, FLAG_SHARE
},
786 {"sync always", P_BOOL
, P_LOCAL
, &sDefault
.bSyncAlways
, NULL
, NULL
, FLAG_SHARE
},
787 {"write cache size", P_INTEGER
, P_LOCAL
, &sDefault
.iWriteCacheSize
, NULL
, NULL
, FLAG_SHARE
},
789 {"Printing Options", P_SEP
, P_SEPARATOR
},
791 {"load printers", P_BOOL
, P_GLOBAL
, &Globals
.bLoadPrinters
, NULL
, NULL
, FLAG_PRINT
},
792 {"printcap name", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, FLAG_PRINT
},
793 {"printcap", P_STRING
, P_GLOBAL
, &Globals
.szPrintcapname
, NULL
, NULL
, 0},
794 {"printable", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, FLAG_PRINT
},
795 {"print ok", P_BOOL
, P_LOCAL
, &sDefault
.bPrint_ok
, NULL
, NULL
, 0},
796 {"postscript", P_BOOL
, P_LOCAL
, &sDefault
.bPostscript
, NULL
, NULL
, FLAG_PRINT
},
797 {"printing", P_ENUM
, P_LOCAL
, &sDefault
.iPrinting
, NULL
, enum_printing
, FLAG_PRINT
| FLAG_GLOBAL
},
798 {"print command", P_STRING
, P_LOCAL
, &sDefault
.szPrintcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
799 {"lpq command", P_STRING
, P_LOCAL
, &sDefault
.szLpqcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
800 {"lprm command", P_STRING
, P_LOCAL
, &sDefault
.szLprmcommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
801 {"lppause command", P_STRING
, P_LOCAL
, &sDefault
.szLppausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
802 {"lpresume command", P_STRING
, P_LOCAL
, &sDefault
.szLpresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
803 {"queuepause command", P_STRING
, P_LOCAL
, &sDefault
.szQueuepausecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
804 {"queueresume command", P_STRING
, P_LOCAL
, &sDefault
.szQueueresumecommand
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
806 {"enumports command", P_STRING
, P_GLOBAL
, &Globals
.szEnumPortsCommand
, NULL
, NULL
, 0},
807 {"addprinter command", P_STRING
, P_GLOBAL
, &Globals
.szAddPrinterCommand
, NULL
, NULL
, 0},
808 {"deleteprinter command", P_STRING
, P_GLOBAL
, &Globals
.szDeletePrinterCommand
, NULL
, NULL
, 0},
810 {"printer name", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, FLAG_PRINT
},
811 {"printer", P_STRING
, P_LOCAL
, &sDefault
.szPrintername
, NULL
, NULL
, 0},
812 {"printer driver", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriver
, NULL
, NULL
, FLAG_PRINT
},
813 {"printer driver file", P_STRING
, P_LOCAL
, &sDefault
.szDriverFile
, NULL
, NULL
, FLAG_PRINT
},
814 {"printer driver location", P_STRING
, P_LOCAL
, &sDefault
.szPrinterDriverLocation
, NULL
, NULL
, FLAG_PRINT
| FLAG_GLOBAL
},
816 {"Filename Handling", P_SEP
, P_SEPARATOR
},
817 {"strip dot", P_BOOL
, P_GLOBAL
, &Globals
.bStripDot
, NULL
, NULL
, 0},
819 {"character set", P_STRING
, P_GLOBAL
, &Globals
.szCharacterSet
, handle_character_set
, NULL
, 0},
820 {"mangled stack", P_INTEGER
, P_GLOBAL
, &Globals
.mangled_stack
, NULL
, NULL
, 0},
821 {"default case", P_ENUM
, P_LOCAL
, &sDefault
.iDefaultCase
, NULL
, enum_case
, FLAG_SHARE
},
822 {"case sensitive", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
823 {"casesignames", P_BOOL
, P_LOCAL
, &sDefault
.bCaseSensitive
, NULL
, NULL
, 0},
824 {"preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
825 {"short preserve case", P_BOOL
, P_LOCAL
, &sDefault
.bShortCasePreserve
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
826 {"mangle case", P_BOOL
, P_LOCAL
, &sDefault
.bCaseMangle
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
827 {"mangling char", P_CHAR
, P_LOCAL
, &sDefault
.magic_char
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
828 {"hide dot files", P_BOOL
, P_LOCAL
, &sDefault
.bHideDotFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
829 {"delete veto files", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
830 {"veto files", P_STRING
, P_LOCAL
, &sDefault
.szVetoFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
831 {"hide files", P_STRING
, P_LOCAL
, &sDefault
.szHideFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
832 {"veto oplock files", P_STRING
, P_LOCAL
, &sDefault
.szVetoOplockFiles
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
| FLAG_DOS_STRING
},
833 {"map system", P_BOOL
, P_LOCAL
, &sDefault
.bMap_system
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
834 {"map hidden", P_BOOL
, P_LOCAL
, &sDefault
.bMap_hidden
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
835 {"map archive", P_BOOL
, P_LOCAL
, &sDefault
.bMap_archive
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
836 {"mangled names", P_BOOL
, P_LOCAL
, &sDefault
.bMangledNames
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
837 {"mangled map", P_STRING
, P_LOCAL
, &sDefault
.szMangledMap
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
838 {"stat cache", P_BOOL
, P_GLOBAL
, &Globals
.bStatCache
, NULL
, NULL
, 0},
840 {"Domain Options", P_SEP
, P_SEPARATOR
},
842 {"domain groups", P_STRING
, P_GLOBAL
, &Globals
.szDomainGroups
, NULL
, NULL
, 0},
843 {"domain admin group", P_STRING
, P_GLOBAL
, &Globals
.szDomainAdminGroup
, NULL
, NULL
, 0},
844 {"domain guest group", P_STRING
, P_GLOBAL
, &Globals
.szDomainGuestGroup
, NULL
, NULL
, 0},
845 {"domain admin users", P_STRING
, P_GLOBAL
, &Globals
.szDomainAdminUsers
, NULL
, NULL
, 0},
846 {"domain guest users", P_STRING
, P_GLOBAL
, &Globals
.szDomainGuestUsers
, NULL
, NULL
, 0},
847 #ifdef USING_GROUPNAME_MAP
849 {"groupname map", P_STRING
, P_GLOBAL
, &Globals
.szGroupnameMap
, NULL
, NULL
, 0},
850 #endif /* USING_GROUPNAME_MAP */
852 {"machine password timeout", P_INTEGER
, P_GLOBAL
, &Globals
.machine_password_timeout
, NULL
, NULL
, 0},
854 {"Logon Options", P_SEP
, P_SEPARATOR
},
856 {"add user script", P_STRING
, P_GLOBAL
, &Globals
.szAddUserScript
, NULL
, NULL
, 0},
857 {"delete user script", P_STRING
, P_GLOBAL
, &Globals
.szDelUserScript
, NULL
, NULL
, 0},
858 {"logon script", P_STRING
, P_GLOBAL
, &Globals
.szLogonScript
, NULL
, NULL
, FLAG_DOS_STRING
},
859 {"logon path", P_STRING
, P_GLOBAL
, &Globals
.szLogonPath
, NULL
, NULL
, FLAG_DOS_STRING
},
860 {"logon drive", P_STRING
, P_GLOBAL
, &Globals
.szLogonDrive
, NULL
, NULL
, 0},
861 {"logon home", P_STRING
, P_GLOBAL
, &Globals
.szLogonHome
, NULL
, NULL
, FLAG_DOS_STRING
},
862 {"domain logons", P_BOOL
, P_GLOBAL
, &Globals
.bDomainLogons
, NULL
, NULL
, 0},
864 {"Browse Options", P_SEP
, P_SEPARATOR
},
866 {"os level", P_INTEGER
, P_GLOBAL
, &Globals
.os_level
, NULL
, NULL
, FLAG_BASIC
},
867 {"lm announce", P_ENUM
, P_GLOBAL
, &Globals
.lm_announce
, NULL
, enum_bool_auto
, 0},
868 {"lm interval", P_INTEGER
, P_GLOBAL
, &Globals
.lm_interval
, NULL
, NULL
, 0},
869 {"preferred master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
870 {"prefered master", P_ENUM
, P_GLOBAL
, &Globals
.bPreferredMaster
, NULL
, enum_bool_auto
, FLAG_HIDE
},
871 {"local master", P_BOOL
, P_GLOBAL
, &Globals
.bLocalMaster
, NULL
, NULL
, FLAG_BASIC
},
872 {"domain master", P_ENUM
, P_GLOBAL
, &Globals
.bDomainMaster
, NULL
, enum_bool_auto
, FLAG_BASIC
},
873 {"browse list", P_BOOL
, P_GLOBAL
, &Globals
.bBrowseList
, NULL
, NULL
, 0},
874 {"browseable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
875 {"browsable", P_BOOL
, P_LOCAL
, &sDefault
.bBrowseable
, NULL
, NULL
, 0},
877 {"WINS Options", P_SEP
, P_SEPARATOR
},
878 {"dns proxy", P_BOOL
, P_GLOBAL
, &Globals
.bDNSproxy
, NULL
, NULL
, 0},
879 {"wins proxy", P_BOOL
, P_GLOBAL
, &Globals
.bWINSproxy
, NULL
, NULL
, 0},
881 {"wins server", P_STRING
, P_GLOBAL
, &Globals
.szWINSserver
, handle_wins_server_list
, NULL
, FLAG_BASIC
},
882 {"wins support", P_BOOL
, P_GLOBAL
, &Globals
.bWINSsupport
, NULL
, NULL
, FLAG_BASIC
},
883 {"wins hook", P_STRING
, P_GLOBAL
, &Globals
.szWINSHook
, NULL
, NULL
, 0},
885 {"Locking Options", P_SEP
, P_SEPARATOR
},
887 {"blocking locks", P_BOOL
, P_LOCAL
, &sDefault
.bBlockingLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
888 {"fake oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bFakeOplocks
, NULL
, NULL
, FLAG_SHARE
},
889 {"kernel oplocks", P_BOOL
, P_GLOBAL
, &Globals
.bKernelOplocks
, NULL
, NULL
, FLAG_GLOBAL
},
890 {"locking", P_BOOL
, P_LOCAL
, &sDefault
.bLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
892 {"utmp", P_BOOL
, P_LOCAL
, &sDefault
.bUtmp
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
895 {"oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bOpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
896 {"level2 oplocks", P_BOOL
, P_LOCAL
, &sDefault
.bLevel2OpLocks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
897 {"oplock break wait time", P_INTEGER
, P_GLOBAL
, &Globals
.oplock_break_wait_time
, NULL
, NULL
, FLAG_GLOBAL
},
898 {"oplock contention limit", P_INTEGER
, P_LOCAL
, &sDefault
.iOplockContentionLimit
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
899 {"posix locking", P_BOOL
, P_LOCAL
, &sDefault
.bPosixLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
900 {"strict locking", P_BOOL
, P_LOCAL
, &sDefault
.bStrictLocking
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
901 {"share modes", P_BOOL
, P_LOCAL
, &sDefault
.bShareModes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
904 {"Ldap Options", P_SEP
, P_SEPARATOR
},
906 {"ldap server", P_STRING
, P_GLOBAL
, &Globals
.szLdapServer
, NULL
, NULL
, 0},
907 {"ldap port", P_INTEGER
, P_GLOBAL
, &Globals
.ldap_port
, NULL
, NULL
, 0},
908 {"ldap suffix", P_STRING
, P_GLOBAL
, &Globals
.szLdapSuffix
, NULL
, NULL
, 0},
909 {"ldap filter", P_STRING
, P_GLOBAL
, &Globals
.szLdapFilter
, NULL
, NULL
, 0},
910 {"ldap root", P_STRING
, P_GLOBAL
, &Globals
.szLdapRoot
, NULL
, NULL
, 0},
911 {"ldap root passwd", P_STRING
, P_GLOBAL
, &Globals
.szLdapRootPassword
, NULL
, NULL
, 0},
912 #endif /* WITH_LDAP */
914 {"Miscellaneous Options", P_SEP
, P_SEPARATOR
},
915 {"smbrun", P_STRING
, P_GLOBAL
, &Globals
.szSmbrun
, NULL
, NULL
, 0},
917 {"config file", P_STRING
, P_GLOBAL
, &Globals
.szConfigFile
, NULL
, NULL
, FLAG_HIDE
},
918 {"preload", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, 0},
919 {"auto services", P_STRING
, P_GLOBAL
, &Globals
.szAutoServices
, NULL
, NULL
, 0},
920 {"lock dir", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
921 {"lock directory", P_STRING
, P_GLOBAL
, &Globals
.szLockDir
, NULL
, NULL
, 0},
923 {"utmp dir", P_STRING
, P_GLOBAL
, &Globals
.szUtmpDir
, NULL
, NULL
, 0},
924 {"utmp directory", P_STRING
, P_GLOBAL
, &Globals
.szUtmpDir
, NULL
, NULL
, 0},
925 #endif /* WITH_UTMP */
927 {"default service", P_STRING
, P_GLOBAL
,
928 &Globals
.szDefaultService
, NULL
, NULL
, 0},
929 {"default", P_STRING
, P_GLOBAL
, &Globals
.szDefaultService
, NULL
, NULL
, 0},
930 {"message command", P_STRING
, P_GLOBAL
, &Globals
.szMsgCommand
, NULL
, NULL
, 0},
931 {"dfree command", P_STRING
, P_GLOBAL
, &Globals
.szDfree
, NULL
, NULL
, 0},
932 {"valid chars", P_STRING
, P_GLOBAL
, &Globals
.szValidChars
, handle_valid_chars
, NULL
, 0},
933 {"remote announce", P_STRING
, P_GLOBAL
, &Globals
.szRemoteAnnounce
, NULL
, NULL
, 0},
934 {"remote browse sync", P_STRING
, P_GLOBAL
, &Globals
.szRemoteBrowseSync
, NULL
, NULL
, 0},
935 {"socket address", P_STRING
, P_GLOBAL
, &Globals
.szSocketAddress
, NULL
, NULL
, 0},
936 {"homedir map", P_STRING
, P_GLOBAL
, &Globals
.szNISHomeMapName
, NULL
, NULL
, 0},
937 {"time offset", P_INTEGER
, P_GLOBAL
, &extra_time_offset
, NULL
, NULL
, 0},
938 {"unix realname", P_BOOL
, P_GLOBAL
, &Globals
.bUnixRealname
, NULL
, NULL
, 0},
939 {"NIS homedir", P_BOOL
, P_GLOBAL
, &Globals
.bNISHomeMap
, NULL
, NULL
, 0},
940 {"-valid", P_BOOL
, P_LOCAL
, &sDefault
.valid
, NULL
, NULL
, FLAG_HIDE
},
942 {"copy", P_STRING
, P_LOCAL
, &sDefault
.szCopy
, handle_copy
, NULL
, FLAG_HIDE
},
943 {"include", P_STRING
, P_LOCAL
, &sDefault
.szInclude
, handle_include
, NULL
, FLAG_HIDE
},
944 {"exec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
945 {"preexec", P_STRING
, P_LOCAL
, &sDefault
.szPreExec
, NULL
, NULL
, 0},
947 {"preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bPreexecClose
, NULL
, NULL
, FLAG_SHARE
},
948 {"postexec", P_STRING
, P_LOCAL
, &sDefault
.szPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
949 {"root preexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPreExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
950 {"root preexec close", P_BOOL
, P_LOCAL
, &sDefault
.bRootpreexecClose
, NULL
, NULL
, FLAG_SHARE
},
951 {"root postexec", P_STRING
, P_LOCAL
, &sDefault
.szRootPostExec
, NULL
, NULL
, FLAG_SHARE
| FLAG_PRINT
},
952 {"available", P_BOOL
, P_LOCAL
, &sDefault
.bAvailable
, NULL
, NULL
, FLAG_BASIC
| FLAG_SHARE
| FLAG_PRINT
},
953 {"volume", P_STRING
, P_LOCAL
, &sDefault
.volume
, NULL
, NULL
, FLAG_SHARE
},
954 {"fstype", P_STRING
, P_LOCAL
, &sDefault
.fstype
, NULL
, NULL
, FLAG_SHARE
},
955 {"set directory", P_BOOLREV
, P_LOCAL
, &sDefault
.bNo_set_dir
, NULL
, NULL
, FLAG_SHARE
},
956 {"source environment", P_STRING
, P_GLOBAL
, &Globals
.szSourceEnv
, handle_source_env
, NULL
, 0},
957 {"wide links", P_BOOL
, P_LOCAL
, &sDefault
.bWidelinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
958 {"follow symlinks", P_BOOL
, P_LOCAL
, &sDefault
.bSymlinks
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
959 {"dont descend", P_STRING
, P_LOCAL
, &sDefault
.szDontdescend
, NULL
, NULL
, FLAG_SHARE
},
960 {"magic script", P_STRING
, P_LOCAL
, &sDefault
.szMagicScript
, NULL
, NULL
, FLAG_SHARE
},
961 {"magic output", P_STRING
, P_LOCAL
, &sDefault
.szMagicOutput
, NULL
, NULL
, FLAG_SHARE
},
962 {"delete readonly", P_BOOL
, P_LOCAL
, &sDefault
.bDeleteReadonly
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
963 {"dos filetimes", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
964 {"dos filetime resolution", P_BOOL
, P_LOCAL
, &sDefault
.bDosFiletimeResolution
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
966 {"fake directory create times", P_BOOL
, P_LOCAL
, &sDefault
.bFakeDirCreateTimes
, NULL
, NULL
, FLAG_SHARE
| FLAG_GLOBAL
},
967 {"panic action", P_STRING
, P_GLOBAL
, &Globals
.szPanicAction
, NULL
, NULL
, 0},
969 {"VFS options", P_SEP
, P_SEPARATOR
},
971 {"vfs object", P_STRING
, P_LOCAL
, &sDefault
.szVfsObjectFile
, handle_vfs_object
, NULL
, 0},
972 {"vfs options", P_STRING
, P_LOCAL
, &sDefault
.szVfsOptions
, NULL
, NULL
, 0},
975 {"msdfs root", P_BOOL
, P_LOCAL
, &sDefault
.bMSDfsRoot
, NULL
, NULL
, FLAG_SHARE
},
976 {"host msdfs", P_BOOL
, P_GLOBAL
, &Globals
.bHostMSDfs
, NULL
, NULL
, FLAG_GLOBAL
},
978 {"Winbind options", P_SEP
, P_SEPARATOR
},
980 {"winbind uid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindUID
, handle_winbind_id
, NULL
, 0},
981 {"winbind gid", P_STRING
, P_GLOBAL
, &Globals
.szWinbindGID
, handle_winbind_id
, NULL
, 0},
982 {"template homedir", P_STRING
, P_GLOBAL
, &Globals
.szTemplateHomedir
, NULL
, NULL
, 0},
983 {"template shell", P_STRING
, P_GLOBAL
, &Globals
.szTemplateShell
, NULL
, NULL
, 0},
984 {"winbind separator", P_STRING
, P_GLOBAL
, &Globals
.szWinbindSeparator
, NULL
, NULL
, 0},
985 {"winbind cache time", P_INTEGER
, P_GLOBAL
, &Globals
.winbind_cache_time
, NULL
, NULL
, 0},
987 {NULL
, P_BOOL
, P_NONE
, NULL
, NULL
, NULL
, 0}
992 /***************************************************************************
993 Initialise the global parameter structure.
994 ***************************************************************************/
995 static void init_globals(void)
997 static BOOL done_init
= False
;
1003 memset((void *)&Globals
, '\0', sizeof(Globals
));
1005 for (i
= 0; parm_table
[i
].label
; i
++)
1006 if ((parm_table
[i
].type
== P_STRING
||
1007 parm_table
[i
].type
== P_USTRING
) &&
1009 string_set(parm_table
[i
].ptr
, "");
1011 string_set(&sDefault
.szGuestaccount
, GUEST_ACCOUNT
);
1012 string_set(&sDefault
.szPrinterDriver
, "");
1013 string_set(&sDefault
.fstype
, FSTYPE_STRING
);
1019 DEBUG(3, ("Initialising global parameters\n"));
1021 string_set(&Globals
.szSMBPasswdFile
, SMB_PASSWD_FILE
);
1023 * Allow the default PASSWD_CHAT to be overridden in local.h.
1025 string_set(&Globals
.szPasswdChat
, DEFAULT_PASSWD_CHAT
);
1026 string_set(&Globals
.szWorkGroup
, WORKGROUP
);
1027 string_set(&Globals
.szPasswdProgram
, PASSWD_PROGRAM
);
1028 string_set(&Globals
.szPrintcapname
, PRINTCAP_NAME
);
1029 string_set(&Globals
.szLockDir
, LOCKDIR
);
1031 string_set(&Globals
.szUtmpDir
, "");
1032 #endif /* WITH_UTMP */
1033 string_set(&Globals
.szSmbrun
, SMBRUN
);
1034 string_set(&Globals
.szSocketAddress
, "0.0.0.0");
1035 pstrcpy(s
, "Samba ");
1036 pstrcat(s
, VERSION
);
1037 string_set(&Globals
.szServerString
, s
);
1038 slprintf(s
, sizeof(s
) - 1, "%d.%d", DEFAULT_MAJOR_VERSION
,
1039 DEFAULT_MINOR_VERSION
);
1040 string_set(&Globals
.szAnnounceVersion
, s
);
1042 pstrcpy(user_socket_options
, DEFAULT_SOCKET_OPTIONS
);
1044 string_set(&Globals
.szLogonDrive
, "");
1045 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1046 string_set(&Globals
.szLogonHome
, "\\\\%N\\%U");
1047 string_set(&Globals
.szLogonPath
, "\\\\%N\\%U\\profile");
1049 string_set(&Globals
.szNameResolveOrder
, "lmhosts host wins bcast");
1051 Globals
.bLoadPrinters
= True
;
1052 Globals
.bUseRhosts
= False
;
1053 Globals
.max_packet
= 65535;
1054 Globals
.mangled_stack
= 50;
1055 Globals
.max_xmit
= 65535;
1056 Globals
.max_mux
= 50; /* This is *needed* for profile support. */
1057 Globals
.lpqcachetime
= 10;
1058 Globals
.pwordlevel
= 0;
1059 Globals
.unamelevel
= 0;
1060 Globals
.deadtime
= 0;
1061 Globals
.max_log_size
= 5000;
1062 Globals
.max_open_files
= MAX_OPEN_FILES
;
1063 Globals
.maxprotocol
= PROTOCOL_NT1
;
1064 Globals
.security
= SEC_USER
;
1065 Globals
.bEncryptPasswords
= False
;
1066 Globals
.bUpdateEncrypt
= False
;
1067 Globals
.bReadRaw
= True
;
1068 Globals
.bWriteRaw
= True
;
1069 Globals
.bReadPrediction
= False
;
1070 Globals
.bReadbmpx
= False
;
1071 Globals
.bNullPasswords
= False
;
1072 Globals
.bStripDot
= False
;
1074 Globals
.bSyslogOnly
= False
;
1075 Globals
.bTimestampLogs
= False
;
1076 Globals
.bDebugHiresTimestamp
= False
;
1077 Globals
.bDebugPid
= False
;
1078 Globals
.bDebugUid
= False
;
1079 Globals
.max_ttl
= 60 * 60 * 24 * 3; /* 3 days default. */
1080 Globals
.max_wins_ttl
= 60 * 60 * 24 * 6; /* 6 days default. */
1081 Globals
.min_wins_ttl
= 60 * 60 * 6; /* 6 hours default. */
1082 Globals
.machine_password_timeout
= 60 * 60 * 24 * 7; /* 7 days default. */
1083 Globals
.change_notify_timeout
= 60; /* 1 minute default. */
1084 Globals
.ReadSize
= 16 * 1024;
1085 Globals
.lm_announce
= 2; /* = Auto: send only if LM clients found */
1086 Globals
.lm_interval
= 60;
1087 Globals
.stat_cache_size
= 50; /* Number of stat translations we'll keep */
1088 Globals
.announce_as
= ANNOUNCE_AS_NT_SERVER
;
1089 Globals
.bUnixRealname
= True
;
1090 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1091 Globals
.bNISHomeMap
= False
;
1092 #ifdef WITH_NISPLUS_HOME
1093 string_set(&Globals
.szNISHomeMapName
, "auto_home.org_dir");
1095 string_set(&Globals
.szNISHomeMapName
, "auto.home");
1098 Globals
.client_code_page
= DEFAULT_CLIENT_CODE_PAGE
;
1099 Globals
.bTimeServer
= False
;
1100 Globals
.bBindInterfacesOnly
= False
;
1101 Globals
.bUnixPasswdSync
= False
;
1102 Globals
.bPasswdChatDebug
= False
;
1103 Globals
.bNTSmbSupport
= True
; /* Do NT SMB's by default. */
1104 Globals
.bNTPipeSupport
= True
; /* Do NT pipes by default. */
1105 Globals
.bNTAclSupport
= True
; /* Use NT ACLs by default. */
1106 Globals
.bStatCache
= True
; /* use stat cache by default */
1107 Globals
.bRestrictAnonymous
= False
;
1108 Globals
.map_to_guest
= 0; /* By Default, "Never" */
1109 Globals
.min_passwd_length
= MINPASSWDLENGTH
; /* By Default, 5. */
1110 Globals
.oplock_break_wait_time
= 10; /* By Default, 10 msecs. */
1113 /* default values for ldap */
1114 string_set(&Globals
.szLdapServer
, "localhost");
1115 Globals
.ldap_port
= 389;
1116 #endif /* WITH_LDAP */
1119 Globals
.sslVersion
= SMB_SSL_V23
;
1120 string_set(&Globals
.sslHostsRequire
, "");
1121 string_set(&Globals
.sslHostsResign
, "");
1122 string_set(&Globals
.sslCaCertDir
, "");
1123 string_set(&Globals
.sslCaCertFile
, "");
1124 string_set(&Globals
.sslCert
, "");
1125 string_set(&Globals
.sslPrivKey
, "");
1126 string_set(&Globals
.sslClientCert
, "");
1127 string_set(&Globals
.sslClientPrivKey
, "");
1128 string_set(&Globals
.sslCiphers
, "");
1129 Globals
.sslEnabled
= False
;
1130 Globals
.sslReqClientCert
= False
;
1131 Globals
.sslReqServerCert
= False
;
1132 Globals
.sslCompatibility
= False
;
1133 #endif /* WITH_SSL */
1135 /* these parameters are set to defaults that are more appropriate
1136 for the increasing samba install base:
1138 as a member of the workgroup, that will possibly become a
1139 _local_ master browser (lm = True). this is opposed to a forced
1140 local master browser startup (pm = True).
1142 doesn't provide WINS server service by default (wsupp = False),
1143 and doesn't provide domain master browser services by default, either.
1147 Globals
.bPreferredMaster
= Auto
; /* depending on bDomainMaster */
1148 Globals
.os_level
= 20;
1149 Globals
.bLocalMaster
= True
;
1150 Globals
.bDomainMaster
= Auto
; /* depending on bDomainLogons */
1151 Globals
.bDomainLogons
= False
;
1152 Globals
.bBrowseList
= True
;
1153 Globals
.bWINSsupport
= False
;
1154 Globals
.bWINSproxy
= False
;
1156 Globals
.bDNSproxy
= True
;
1158 /* this just means to use them if they exist */
1159 Globals
.bKernelOplocks
= True
;
1161 Globals
.bAllowTrustedDomains
= True
;
1163 string_set(&Globals
.szTemplateShell
, "/bin/false");
1164 string_set(&Globals
.szTemplateHomedir
, "/home/%D/%U");
1165 string_set(&Globals
.szWinbindSeparator
, "\\");
1166 Globals
.winbind_cache_time
= 15;
1169 * This must be done last as it checks the value in
1173 interpret_coding_system(KANJI
);
1176 /***************************************************************************
1177 Initialise the sDefault parameter structure.
1178 ***************************************************************************/
1179 static void init_locals(void)
1181 string_set(&sDefault
.szDriverFile
, DRIVERFILE
);
1183 /* choose defaults depending on the type of printing */
1184 switch (sDefault
.iPrinting
)
1188 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1189 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1190 string_set(&sDefault
.szPrintcommand
,
1196 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1197 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1198 string_set(&sDefault
.szPrintcommand
,
1200 string_set(&sDefault
.szQueuepausecommand
,
1202 string_set(&sDefault
.szQueueresumecommand
,
1204 string_set(&sDefault
.szLppausecommand
,
1206 string_set(&sDefault
.szLpresumecommand
,
1207 "lpc release %p %j");
1211 string_set(&sDefault
.szLpqcommand
,
1212 "/usr/bin/lpstat -o%p");
1213 string_set(&sDefault
.szLprmcommand
,
1214 "/usr/bin/cancel %p-%j");
1215 string_set(&sDefault
.szPrintcommand
,
1216 "/usr/bin/lp -d%p -oraw %s; rm %s");
1217 string_set(&sDefault
.szQueuepausecommand
,
1218 "/usr/bin/disable %p");
1219 string_set(&sDefault
.szQueueresumecommand
,
1220 "/usr/bin/enable %p");
1225 string_set(&sDefault
.szLpqcommand
, "lpstat -o%p");
1226 string_set(&sDefault
.szLprmcommand
, "cancel %p-%j");
1227 string_set(&sDefault
.szPrintcommand
,
1228 "lp -c -d%p %s; rm %s");
1229 string_set(&sDefault
.szQueuepausecommand
,
1231 string_set(&sDefault
.szQueueresumecommand
,
1234 string_set(&sDefault
.szLppausecommand
,
1235 "lp -i %p-%j -H hold");
1236 string_set(&sDefault
.szLpresumecommand
,
1237 "lp -i %p-%j -H resume");
1242 string_set(&sDefault
.szLpqcommand
, "lpq -P%p");
1243 string_set(&sDefault
.szLprmcommand
, "lprm -P%p %j");
1244 string_set(&sDefault
.szPrintcommand
, "lp -r -P%p %s");
1248 string_set(&sDefault
.szLpqcommand
, "qstat -l -d%p");
1249 string_set(&sDefault
.szLprmcommand
,
1250 "qstat -s -j%j -c");
1251 string_set(&sDefault
.szPrintcommand
,
1252 "lp -d%p -s %s; rm %s");
1253 string_set(&sDefault
.szLppausecommand
,
1254 "qstat -s -j%j -h");
1255 string_set(&sDefault
.szLpresumecommand
,
1256 "qstat -s -j%j -r");
1262 static TALLOC_CTX
*lp_talloc
;
1264 /******************************************************************* a
1265 free up temporary memory - called from the main loop
1266 ********************************************************************/
1267 void lp_talloc_free(void)
1271 talloc_destroy(lp_talloc
);
1275 /*******************************************************************
1276 convenience routine to grab string parameters into temporary memory
1277 and run standard_sub_basic on them. The buffers can be written to by
1278 callers without affecting the source string.
1279 ********************************************************************/
1280 static char *lp_string(const char *s
)
1282 size_t len
= s
? strlen(s
) : 0;
1286 lp_talloc
= talloc_init();
1288 ret
= (char *)talloc(lp_talloc
, len
+ 100); /* leave room for substitution */
1296 StrnCpy(ret
, s
, len
);
1298 trim_string(ret
, "\"", "\"");
1300 standard_sub_basic(ret
);
1306 In this section all the functions that are used to access the
1307 parameters from the rest of the program are defined
1310 #define FN_GLOBAL_STRING(fn_name,ptr) \
1311 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1312 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1313 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1314 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1315 char fn_name(void) {return(*(char *)(ptr));}
1316 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1317 int fn_name(void) {return(*(int *)(ptr));}
1319 #define FN_LOCAL_STRING(fn_name,val) \
1320 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1321 #define FN_LOCAL_BOOL(fn_name,val) \
1322 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1323 #define FN_LOCAL_CHAR(fn_name,val) \
1324 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1325 #define FN_LOCAL_INTEGER(fn_name,val) \
1326 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1328 FN_GLOBAL_STRING(lp_logfile
, &Globals
.szLogFile
)
1329 FN_GLOBAL_STRING(lp_smbrun
, &Globals
.szSmbrun
)
1330 FN_GLOBAL_STRING(lp_configfile
, &Globals
.szConfigFile
)
1331 FN_GLOBAL_STRING(lp_smb_passwd_file
, &Globals
.szSMBPasswdFile
)
1332 FN_GLOBAL_STRING(lp_serverstring
, &Globals
.szServerString
)
1333 FN_GLOBAL_STRING(lp_printcapname
, &Globals
.szPrintcapname
)
1334 FN_GLOBAL_STRING(lp_enumports_cmd
, &Globals
.szEnumPortsCommand
)
1335 FN_GLOBAL_STRING(lp_addprinter_cmd
, &Globals
.szAddPrinterCommand
)
1336 FN_GLOBAL_STRING(lp_deleteprinter_cmd
, &Globals
.szDeletePrinterCommand
)
1337 FN_GLOBAL_STRING(lp_lockdir
, &Globals
.szLockDir
)
1339 FN_GLOBAL_STRING(lp_utmpdir
, &Globals
.szUtmpDir
)
1340 #endif /* WITH_UTMP */
1341 FN_GLOBAL_STRING(lp_rootdir
, &Globals
.szRootdir
)
1342 FN_GLOBAL_STRING(lp_source_environment
, &Globals
.szSourceEnv
)
1343 FN_GLOBAL_STRING(lp_defaultservice
, &Globals
.szDefaultService
)
1344 FN_GLOBAL_STRING(lp_msg_command
, &Globals
.szMsgCommand
)
1345 FN_GLOBAL_STRING(lp_dfree_command
, &Globals
.szDfree
)
1346 FN_GLOBAL_STRING(lp_hosts_equiv
, &Globals
.szHostsEquiv
)
1347 FN_GLOBAL_STRING(lp_auto_services
, &Globals
.szAutoServices
)
1348 FN_GLOBAL_STRING(lp_passwd_program
, &Globals
.szPasswdProgram
)
1349 FN_GLOBAL_STRING(lp_passwd_chat
, &Globals
.szPasswdChat
)
1350 FN_GLOBAL_STRING(lp_passwordserver
, &Globals
.szPasswordServer
)
1351 FN_GLOBAL_STRING(lp_name_resolve_order
, &Globals
.szNameResolveOrder
)
1352 FN_GLOBAL_STRING(lp_workgroup
, &Globals
.szWorkGroup
)
1353 FN_GLOBAL_STRING(lp_username_map
, &Globals
.szUsernameMap
)
1354 #ifdef USING_GROUPNAME_MAP
1355 FN_GLOBAL_STRING(lp_groupname_map
, &Globals
.szGroupnameMap
)
1356 #endif /* USING_GROUPNAME_MAP */
1357 FN_GLOBAL_STRING(lp_logon_script
, &Globals
.szLogonScript
)
1358 FN_GLOBAL_STRING(lp_logon_path
, &Globals
.szLogonPath
)
1359 FN_GLOBAL_STRING(lp_logon_drive
, &Globals
.szLogonDrive
)
1360 FN_GLOBAL_STRING(lp_logon_home
, &Globals
.szLogonHome
)
1361 FN_GLOBAL_STRING(lp_remote_announce
, &Globals
.szRemoteAnnounce
)
1362 FN_GLOBAL_STRING(lp_remote_browse_sync
, &Globals
.szRemoteBrowseSync
)
1363 FN_GLOBAL_STRING(lp_wins_server
, &Globals
.szWINSserver
)
1364 FN_GLOBAL_STRING(lp_interfaces
, &Globals
.szInterfaces
)
1365 FN_GLOBAL_STRING(lp_socket_address
, &Globals
.szSocketAddress
)
1366 FN_GLOBAL_STRING(lp_nis_home_map_name
, &Globals
.szNISHomeMapName
)
1367 static FN_GLOBAL_STRING(lp_announce_version
, &Globals
.szAnnounceVersion
)
1368 FN_GLOBAL_STRING(lp_netbios_aliases
, &Globals
.szNetbiosAliases
)
1369 FN_GLOBAL_STRING(lp_panic_action
, &Globals
.szPanicAction
)
1370 FN_GLOBAL_STRING(lp_adduser_script
, &Globals
.szAddUserScript
)
1371 FN_GLOBAL_STRING(lp_deluser_script
, &Globals
.szDelUserScript
)
1372 FN_GLOBAL_STRING(lp_wins_hook
, &Globals
.szWINSHook
)
1373 FN_GLOBAL_STRING(lp_domain_groups
, &Globals
.szDomainGroups
)
1374 FN_GLOBAL_STRING(lp_domain_admin_group
, &Globals
.szDomainAdminGroup
)
1375 FN_GLOBAL_STRING(lp_domain_guest_group
, &Globals
.szDomainGuestGroup
)
1376 FN_GLOBAL_STRING(lp_domain_admin_users
, &Globals
.szDomainAdminUsers
)
1377 FN_GLOBAL_STRING(lp_domain_guest_users
, &Globals
.szDomainGuestUsers
)
1378 FN_GLOBAL_STRING(lp_winbind_uid
, &Globals
.szWinbindUID
)
1379 FN_GLOBAL_STRING(lp_winbind_gid
, &Globals
.szWinbindGID
)
1380 FN_GLOBAL_STRING(lp_template_homedir
, &Globals
.szTemplateHomedir
)
1381 FN_GLOBAL_STRING(lp_template_shell
, &Globals
.szTemplateShell
)
1382 FN_GLOBAL_STRING(lp_winbind_separator
, &Globals
.szWinbindSeparator
)
1384 FN_GLOBAL_STRING(lp_ldap_server
, &Globals
.szLdapServer
);
1385 FN_GLOBAL_STRING(lp_ldap_suffix
, &Globals
.szLdapSuffix
);
1386 FN_GLOBAL_STRING(lp_ldap_filter
, &Globals
.szLdapFilter
);
1387 FN_GLOBAL_STRING(lp_ldap_root
, &Globals
.szLdapRoot
);
1388 FN_GLOBAL_STRING(lp_ldap_rootpasswd
, &Globals
.szLdapRootPassword
);
1389 #endif /* WITH_LDAP */
1392 FN_GLOBAL_INTEGER(lp_ssl_version
, &Globals
.sslVersion
);
1393 FN_GLOBAL_STRING(lp_ssl_hosts
, &Globals
.sslHostsRequire
);
1394 FN_GLOBAL_STRING(lp_ssl_hosts_resign
, &Globals
.sslHostsResign
);
1395 FN_GLOBAL_STRING(lp_ssl_cacertdir
, &Globals
.sslCaCertDir
);
1396 FN_GLOBAL_STRING(lp_ssl_cacertfile
, &Globals
.sslCaCertFile
);
1397 FN_GLOBAL_STRING(lp_ssl_cert
, &Globals
.sslCert
);
1398 FN_GLOBAL_STRING(lp_ssl_privkey
, &Globals
.sslPrivKey
);
1399 FN_GLOBAL_STRING(lp_ssl_client_cert
, &Globals
.sslClientCert
);
1400 FN_GLOBAL_STRING(lp_ssl_client_privkey
, &Globals
.sslClientPrivKey
);
1401 FN_GLOBAL_STRING(lp_ssl_ciphers
, &Globals
.sslCiphers
);
1402 FN_GLOBAL_BOOL(lp_ssl_enabled
, &Globals
.sslEnabled
);
1403 FN_GLOBAL_BOOL(lp_ssl_reqClientCert
, &Globals
.sslReqClientCert
);
1404 FN_GLOBAL_BOOL(lp_ssl_reqServerCert
, &Globals
.sslReqServerCert
);
1405 FN_GLOBAL_BOOL(lp_ssl_compatibility
, &Globals
.sslCompatibility
);
1406 #endif /* WITH_SSL */
1408 FN_GLOBAL_BOOL(lp_dns_proxy
, &Globals
.bDNSproxy
)
1409 FN_GLOBAL_BOOL(lp_wins_support
, &Globals
.bWINSsupport
)
1410 FN_GLOBAL_BOOL(lp_we_are_a_wins_server
, &Globals
.bWINSsupport
)
1411 FN_GLOBAL_BOOL(lp_wins_proxy
, &Globals
.bWINSproxy
)
1412 FN_GLOBAL_BOOL(lp_local_master
, &Globals
.bLocalMaster
)
1413 FN_GLOBAL_BOOL(lp_domain_logons
, &Globals
.bDomainLogons
)
1414 FN_GLOBAL_BOOL(lp_load_printers
, &Globals
.bLoadPrinters
)
1415 FN_GLOBAL_BOOL(lp_use_rhosts
, &Globals
.bUseRhosts
)
1416 FN_GLOBAL_BOOL(lp_readprediction
, &Globals
.bReadPrediction
)
1417 FN_GLOBAL_BOOL(lp_readbmpx
, &Globals
.bReadbmpx
)
1418 FN_GLOBAL_BOOL(lp_readraw
, &Globals
.bReadRaw
)
1419 FN_GLOBAL_BOOL(lp_writeraw
, &Globals
.bWriteRaw
)
1420 FN_GLOBAL_BOOL(lp_null_passwords
, &Globals
.bNullPasswords
)
1421 FN_GLOBAL_BOOL(lp_strip_dot
, &Globals
.bStripDot
)
1422 FN_GLOBAL_BOOL(lp_encrypted_passwords
, &Globals
.bEncryptPasswords
)
1423 FN_GLOBAL_BOOL(lp_update_encrypted
, &Globals
.bUpdateEncrypt
)
1424 FN_GLOBAL_BOOL(lp_syslog_only
, &Globals
.bSyslogOnly
)
1425 FN_GLOBAL_BOOL(lp_timestamp_logs
, &Globals
.bTimestampLogs
)
1426 FN_GLOBAL_BOOL(lp_debug_hires_timestamp
, &Globals
.bDebugHiresTimestamp
)
1427 FN_GLOBAL_BOOL(lp_debug_pid
, &Globals
.bDebugPid
)
1428 FN_GLOBAL_BOOL(lp_debug_uid
, &Globals
.bDebugUid
)
1429 FN_GLOBAL_BOOL(lp_browse_list
, &Globals
.bBrowseList
)
1430 FN_GLOBAL_BOOL(lp_unix_realname
, &Globals
.bUnixRealname
)
1431 FN_GLOBAL_BOOL(lp_nis_home_map
, &Globals
.bNISHomeMap
)
1432 static FN_GLOBAL_BOOL(lp_time_server
, &Globals
.bTimeServer
)
1433 FN_GLOBAL_BOOL(lp_bind_interfaces_only
, &Globals
.bBindInterfacesOnly
)
1434 FN_GLOBAL_BOOL(lp_unix_password_sync
, &Globals
.bUnixPasswdSync
)
1435 FN_GLOBAL_BOOL(lp_passwd_chat_debug
, &Globals
.bPasswdChatDebug
)
1436 FN_GLOBAL_BOOL(lp_nt_smb_support
, &Globals
.bNTSmbSupport
)
1437 FN_GLOBAL_BOOL(lp_nt_pipe_support
, &Globals
.bNTPipeSupport
)
1438 FN_GLOBAL_BOOL(lp_nt_acl_support
, &Globals
.bNTAclSupport
)
1439 FN_GLOBAL_BOOL(lp_stat_cache
, &Globals
.bStatCache
)
1440 FN_GLOBAL_BOOL(lp_allow_trusted_domains
, &Globals
.bAllowTrustedDomains
)
1441 FN_GLOBAL_BOOL(lp_restrict_anonymous
, &Globals
.bRestrictAnonymous
)
1442 FN_GLOBAL_BOOL(lp_host_msdfs
, &Globals
.bHostMSDfs
)
1443 FN_GLOBAL_BOOL(lp_kernel_oplocks
, &Globals
.bKernelOplocks
)
1444 FN_GLOBAL_INTEGER(lp_os_level
, &Globals
.os_level
)
1445 FN_GLOBAL_INTEGER(lp_max_ttl
, &Globals
.max_ttl
)
1446 FN_GLOBAL_INTEGER(lp_max_wins_ttl
, &Globals
.max_wins_ttl
)
1447 FN_GLOBAL_INTEGER(lp_min_wins_ttl
, &Globals
.max_wins_ttl
)
1448 FN_GLOBAL_INTEGER(lp_max_log_size
, &Globals
.max_log_size
)
1449 FN_GLOBAL_INTEGER(lp_max_open_files
, &Globals
.max_open_files
)
1450 FN_GLOBAL_INTEGER(lp_maxxmit
, &Globals
.max_xmit
)
1451 FN_GLOBAL_INTEGER(lp_maxmux
, &Globals
.max_mux
)
1452 FN_GLOBAL_INTEGER(lp_passwordlevel
, &Globals
.pwordlevel
)
1453 FN_GLOBAL_INTEGER(lp_usernamelevel
, &Globals
.unamelevel
)
1454 FN_GLOBAL_INTEGER(lp_readsize
, &Globals
.ReadSize
)
1455 FN_GLOBAL_INTEGER(lp_deadtime
, &Globals
.deadtime
)
1456 FN_GLOBAL_INTEGER(lp_maxprotocol
, &Globals
.maxprotocol
)
1457 FN_GLOBAL_INTEGER(lp_security
, &Globals
.security
)
1458 FN_GLOBAL_INTEGER(lp_maxdisksize
, &Globals
.maxdisksize
)
1459 FN_GLOBAL_INTEGER(lp_lpqcachetime
, &Globals
.lpqcachetime
)
1460 FN_GLOBAL_INTEGER(lp_syslog
, &Globals
.syslog
)
1461 FN_GLOBAL_INTEGER(lp_client_code_page
, &Globals
.client_code_page
)
1462 static FN_GLOBAL_INTEGER(lp_announce_as
, &Globals
.announce_as
)
1463 FN_GLOBAL_INTEGER(lp_lm_announce
, &Globals
.lm_announce
)
1464 FN_GLOBAL_INTEGER(lp_lm_interval
, &Globals
.lm_interval
)
1465 FN_GLOBAL_INTEGER(lp_machine_password_timeout
, &Globals
.machine_password_timeout
)
1466 FN_GLOBAL_INTEGER(lp_change_notify_timeout
, &Globals
.change_notify_timeout
)
1467 FN_GLOBAL_INTEGER(lp_stat_cache_size
, &Globals
.stat_cache_size
)
1468 FN_GLOBAL_INTEGER(lp_map_to_guest
, &Globals
.map_to_guest
)
1469 FN_GLOBAL_INTEGER(lp_min_passwd_length
, &Globals
.min_passwd_length
)
1470 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time
, &Globals
.oplock_break_wait_time
)
1472 FN_GLOBAL_INTEGER(lp_ldap_port
, &Globals
.ldap_port
)
1473 #endif /* WITH_LDAP */
1474 FN_LOCAL_STRING(lp_preexec
, szPreExec
)
1475 FN_LOCAL_STRING(lp_postexec
, szPostExec
)
1476 FN_LOCAL_STRING(lp_rootpreexec
, szRootPreExec
)
1477 FN_LOCAL_STRING(lp_rootpostexec
, szRootPostExec
)
1478 FN_LOCAL_STRING(lp_servicename
, szService
)
1479 FN_LOCAL_STRING(lp_pathname
, szPath
)
1480 FN_LOCAL_STRING(lp_dontdescend
, szDontdescend
)
1481 FN_LOCAL_STRING(lp_username
, szUsername
)
1482 FN_LOCAL_STRING(lp_guestaccount
, szGuestaccount
)
1483 FN_LOCAL_STRING(lp_invalid_users
, szInvalidUsers
)
1484 FN_LOCAL_STRING(lp_valid_users
, szValidUsers
)
1485 FN_LOCAL_STRING(lp_admin_users
, szAdminUsers
)
1486 FN_LOCAL_STRING(lp_printcommand
, szPrintcommand
)
1487 FN_LOCAL_STRING(lp_lpqcommand
, szLpqcommand
)
1488 FN_LOCAL_STRING(lp_lprmcommand
, szLprmcommand
)
1489 FN_LOCAL_STRING(lp_lppausecommand
, szLppausecommand
)
1490 FN_LOCAL_STRING(lp_lpresumecommand
, szLpresumecommand
)
1491 FN_LOCAL_STRING(lp_queuepausecommand
, szQueuepausecommand
)
1492 FN_LOCAL_STRING(lp_queueresumecommand
, szQueueresumecommand
)
1493 static FN_LOCAL_STRING(_lp_printername
, szPrintername
)
1494 FN_LOCAL_STRING(lp_driverfile
, szDriverFile
)
1495 FN_LOCAL_STRING(lp_printerdriver
, szPrinterDriver
)
1496 FN_LOCAL_STRING(lp_hostsallow
, szHostsallow
)
1497 FN_LOCAL_STRING(lp_hostsdeny
, szHostsdeny
)
1498 FN_LOCAL_STRING(lp_magicscript
, szMagicScript
)
1499 FN_LOCAL_STRING(lp_magicoutput
, szMagicOutput
)
1500 FN_LOCAL_STRING(lp_comment
, comment
)
1501 FN_LOCAL_STRING(lp_force_user
, force_user
)
1502 FN_LOCAL_STRING(lp_force_group
, force_group
)
1503 FN_LOCAL_STRING(lp_readlist
, readlist
)
1504 FN_LOCAL_STRING(lp_writelist
, writelist
)
1505 FN_LOCAL_STRING(lp_printer_admin
, printer_admin
)
1506 FN_LOCAL_STRING(lp_fstype
, fstype
)
1507 FN_LOCAL_STRING(lp_vfsobj
, szVfsObjectFile
)
1508 static FN_LOCAL_STRING(lp_volume
, volume
)
1509 FN_LOCAL_STRING(lp_mangled_map
, szMangledMap
)
1510 FN_LOCAL_STRING(lp_veto_files
, szVetoFiles
)
1511 FN_LOCAL_STRING(lp_hide_files
, szHideFiles
)
1512 FN_LOCAL_STRING(lp_veto_oplocks
, szVetoOplockFiles
)
1513 FN_LOCAL_STRING(lp_driverlocation
, szPrinterDriverLocation
)
1514 FN_LOCAL_BOOL(lp_msdfs_root
, bMSDfsRoot
)
1515 FN_LOCAL_BOOL(lp_autoloaded
, autoloaded
)
1516 FN_LOCAL_BOOL(lp_preexec_close
, bPreexecClose
)
1517 FN_LOCAL_BOOL(lp_rootpreexec_close
, bRootpreexecClose
)
1518 FN_LOCAL_BOOL(lp_casesensitive
, bCaseSensitive
)
1519 FN_LOCAL_BOOL(lp_preservecase
, bCasePreserve
)
1520 FN_LOCAL_BOOL(lp_shortpreservecase
, bShortCasePreserve
)
1521 FN_LOCAL_BOOL(lp_casemangle
, bCaseMangle
)
1522 FN_LOCAL_BOOL(lp_status
, status
)
1523 FN_LOCAL_BOOL(lp_hide_dot_files
, bHideDotFiles
)
1524 FN_LOCAL_BOOL(lp_browseable
, bBrowseable
)
1525 FN_LOCAL_BOOL(lp_readonly
, bRead_only
)
1526 FN_LOCAL_BOOL(lp_no_set_dir
, bNo_set_dir
)
1527 FN_LOCAL_BOOL(lp_guest_ok
, bGuest_ok
)
1528 FN_LOCAL_BOOL(lp_guest_only
, bGuest_only
)
1529 FN_LOCAL_BOOL(lp_print_ok
, bPrint_ok
)
1530 FN_LOCAL_BOOL(lp_postscript
, bPostscript
)
1531 FN_LOCAL_BOOL(lp_map_hidden
, bMap_hidden
)
1532 FN_LOCAL_BOOL(lp_map_archive
, bMap_archive
)
1533 FN_LOCAL_BOOL(lp_locking
, bLocking
)
1534 FN_LOCAL_BOOL(lp_strict_locking
, bStrictLocking
)
1535 FN_LOCAL_BOOL(lp_posix_locking
, bPosixLocking
)
1537 FN_LOCAL_BOOL(lp_utmp
, bUtmp
)
1539 FN_LOCAL_BOOL(lp_share_modes
, bShareModes
)
1540 FN_LOCAL_BOOL(lp_oplocks
, bOpLocks
)
1541 FN_LOCAL_BOOL(lp_level2_oplocks
, bLevel2OpLocks
)
1542 FN_LOCAL_BOOL(lp_onlyuser
, bOnlyUser
)
1543 FN_LOCAL_BOOL(lp_manglednames
, bMangledNames
)
1544 FN_LOCAL_BOOL(lp_widelinks
, bWidelinks
)
1545 FN_LOCAL_BOOL(lp_symlinks
, bSymlinks
)
1546 FN_LOCAL_BOOL(lp_syncalways
, bSyncAlways
)
1547 FN_LOCAL_BOOL(lp_strict_sync
, bStrictSync
)
1548 FN_LOCAL_BOOL(lp_map_system
, bMap_system
)
1549 FN_LOCAL_BOOL(lp_delete_readonly
, bDeleteReadonly
)
1550 FN_LOCAL_BOOL(lp_fake_oplocks
, bFakeOplocks
)
1551 FN_LOCAL_BOOL(lp_recursive_veto_delete
, bDeleteVetoFiles
)
1552 FN_LOCAL_BOOL(lp_dos_filetimes
, bDosFiletimes
)
1553 FN_LOCAL_BOOL(lp_dos_filetime_resolution
, bDosFiletimeResolution
)
1554 FN_LOCAL_BOOL(lp_fake_dir_create_times
, bFakeDirCreateTimes
)
1555 FN_LOCAL_BOOL(lp_blocking_locks
, bBlockingLocks
)
1556 FN_LOCAL_BOOL(lp_inherit_perms
, bInheritPerms
)
1557 FN_LOCAL_INTEGER(lp_create_mask
, iCreate_mask
)
1558 FN_LOCAL_INTEGER(lp_force_create_mode
, iCreate_force_mode
)
1559 FN_LOCAL_INTEGER(_lp_security_mask
, iSecurity_mask
)
1560 FN_LOCAL_INTEGER(_lp_force_security_mode
, iSecurity_force_mode
)
1561 FN_LOCAL_INTEGER(lp_dir_mask
, iDir_mask
)
1562 FN_LOCAL_INTEGER(lp_force_dir_mode
, iDir_force_mode
)
1563 FN_LOCAL_INTEGER(_lp_dir_security_mask
, iDir_Security_mask
)
1564 FN_LOCAL_INTEGER(_lp_force_dir_security_mode
, iDir_Security_force_mode
)
1565 FN_LOCAL_INTEGER(lp_max_connections
, iMaxConnections
)
1566 FN_LOCAL_INTEGER(lp_defaultcase
, iDefaultCase
)
1567 FN_LOCAL_INTEGER(lp_minprintspace
, iMinPrintSpace
)
1568 FN_LOCAL_INTEGER(lp_printing
, iPrinting
)
1569 FN_LOCAL_INTEGER(lp_oplock_contention_limit
, iOplockContentionLimit
)
1570 FN_LOCAL_INTEGER(lp_write_cache_size
, iWriteCacheSize
)
1571 FN_LOCAL_CHAR(lp_magicchar
, magic_char
)
1572 FN_GLOBAL_INTEGER(lp_winbind_cache_time
, &Globals
.winbind_cache_time
)
1573 /* local prototypes */
1574 static int map_parameter(char *pszParmName
);
1575 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
);
1576 static int getservicebyname(char *pszServiceName
,
1577 service
* pserviceDest
);
1578 static void copy_service(service
* pserviceDest
,
1579 service
* pserviceSource
, BOOL
*pcopymapDest
);
1580 static BOOL
service_ok(int iService
);
1581 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
);
1582 static BOOL
do_section(char *pszSectionName
);
1583 static void init_copymap(service
* pservice
);
1586 /***************************************************************************
1587 initialise a service to the defaults
1588 ***************************************************************************/
1589 static void init_service(service
* pservice
)
1591 memset((char *)pservice
, '\0', sizeof(service
));
1592 copy_service(pservice
, &sDefault
, NULL
);
1596 /***************************************************************************
1597 free the dynamically allocated parts of a service struct
1598 ***************************************************************************/
1599 static void free_service(service
* pservice
)
1605 if (pservice
->szService
)
1607 ("free_service: Freeing service %s\n",
1608 pservice
->szService
));
1610 string_free(&pservice
->szService
);
1611 if (pservice
->copymap
)
1613 free(pservice
->copymap
);
1614 pservice
->copymap
= NULL
;
1617 for (i
= 0; parm_table
[i
].label
; i
++)
1618 if ((parm_table
[i
].type
== P_STRING
||
1619 parm_table
[i
].type
== P_USTRING
) &&
1620 parm_table
[i
].class == P_LOCAL
)
1621 string_free((char **)
1622 (((char *)pservice
) +
1623 PTR_DIFF(parm_table
[i
].ptr
, &sDefault
)));
1626 /***************************************************************************
1627 add a new service to the services array initialising it with the given
1629 ***************************************************************************/
1630 static int add_a_service(service
* pservice
, char *name
)
1634 int num_to_alloc
= iNumServices
+ 1;
1636 tservice
= *pservice
;
1638 /* it might already exist */
1641 i
= getservicebyname(name
, NULL
);
1646 /* find an invalid one */
1647 for (i
= 0; i
< iNumServices
; i
++)
1648 if (!pSERVICE(i
)->valid
)
1651 /* if not, then create one */
1652 if (i
== iNumServices
)
1655 (service
**) Realloc(ServicePtrs
,
1659 pSERVICE(iNumServices
) =
1660 (service
*) malloc(sizeof(service
));
1662 if (!ServicePtrs
|| !pSERVICE(iNumServices
))
1668 free_service(pSERVICE(i
));
1670 pSERVICE(i
)->valid
= True
;
1672 init_service(pSERVICE(i
));
1673 copy_service(pSERVICE(i
), &tservice
, NULL
);
1676 string_set(&iSERVICE(i
).szService
, name
);
1677 unix_to_dos(iSERVICE(i
).szService
, True
);
1682 /***************************************************************************
1683 add a new home service, with the specified home directory, defaults coming
1685 ***************************************************************************/
1686 BOOL
lp_add_home(char *pszHomename
, int iDefaultService
, char *pszHomedir
)
1688 int i
= add_a_service(pSERVICE(iDefaultService
), pszHomename
);
1693 if (!(*(iSERVICE(i
).szPath
))
1694 || strequal(iSERVICE(i
).szPath
, lp_pathname(-1)))
1695 string_set(&iSERVICE(i
).szPath
, pszHomedir
);
1696 if (!(*(iSERVICE(i
).comment
)))
1699 slprintf(comment
, sizeof(comment
) - 1,
1700 "Home directory of %s", pszHomename
);
1701 string_set(&iSERVICE(i
).comment
, comment
);
1703 iSERVICE(i
).bAvailable
= sDefault
.bAvailable
;
1704 iSERVICE(i
).bBrowseable
= sDefault
.bBrowseable
;
1707 ("adding home directory %s at %s\n", pszHomename
, pszHomedir
));
1712 /***************************************************************************
1713 add a new service, based on an old one
1714 ***************************************************************************/
1715 int lp_add_service(char *pszService
, int iDefaultService
)
1717 return (add_a_service(pSERVICE(iDefaultService
), pszService
));
1721 /***************************************************************************
1723 ***************************************************************************/
1724 static BOOL
lp_add_ipc(void)
1727 int i
= add_a_service(&sDefault
, "IPC$");
1732 slprintf(comment
, sizeof(comment
) - 1,
1733 "IPC Service (%s)", Globals
.szServerString
);
1735 string_set(&iSERVICE(i
).szPath
, tmpdir());
1736 string_set(&iSERVICE(i
).szUsername
, "");
1737 string_set(&iSERVICE(i
).comment
, comment
);
1738 string_set(&iSERVICE(i
).fstype
, "IPC");
1739 iSERVICE(i
).status
= False
;
1740 iSERVICE(i
).iMaxConnections
= 0;
1741 iSERVICE(i
).bAvailable
= True
;
1742 iSERVICE(i
).bRead_only
= True
;
1743 iSERVICE(i
).bGuest_only
= False
;
1744 iSERVICE(i
).bGuest_ok
= True
;
1745 iSERVICE(i
).bPrint_ok
= False
;
1746 iSERVICE(i
).bBrowseable
= sDefault
.bBrowseable
;
1748 DEBUG(3, ("adding IPC service\n"));
1754 /***************************************************************************
1755 add a new printer service, with defaults coming from service iFrom
1756 ***************************************************************************/
1757 BOOL
lp_add_printer(char *pszPrintername
, int iDefaultService
)
1759 char *comment
= "From Printcap";
1760 int i
= add_a_service(pSERVICE(iDefaultService
), pszPrintername
);
1765 /* note that we do NOT default the availability flag to True - */
1766 /* we take it from the default service passed. This allows all */
1767 /* dynamic printers to be disabled by disabling the [printers] */
1768 /* entry (if/when the 'available' keyword is implemented!). */
1770 /* the printer name is set to the service name. */
1771 string_set(&iSERVICE(i
).szPrintername
, pszPrintername
);
1772 string_set(&iSERVICE(i
).comment
, comment
);
1773 iSERVICE(i
).bBrowseable
= sDefault
.bBrowseable
;
1774 /* Printers cannot be read_only. */
1775 iSERVICE(i
).bRead_only
= False
;
1776 /* No share modes on printer services. */
1777 iSERVICE(i
).bShareModes
= False
;
1778 /* No oplocks on printer services. */
1779 iSERVICE(i
).bOpLocks
= False
;
1780 /* Printer services must be printable. */
1781 iSERVICE(i
).bPrint_ok
= True
;
1783 DEBUG(3, ("adding printer service %s\n", pszPrintername
));
1788 /***************************************************************************
1789 Map a parameter's string representation to something we can use.
1790 Returns False if the parameter string is not recognised, else TRUE.
1791 ***************************************************************************/
1792 static int map_parameter(char *pszParmName
)
1796 if (*pszParmName
== '-')
1799 for (iIndex
= 0; parm_table
[iIndex
].label
; iIndex
++)
1800 if (strwicmp(parm_table
[iIndex
].label
, pszParmName
) == 0)
1803 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName
));
1808 /***************************************************************************
1809 Set a boolean variable from the text value stored in the passed string.
1810 Returns True in success, False if the passed string does not correctly
1811 represent a boolean.
1812 ***************************************************************************/
1813 static BOOL
set_boolean(BOOL
*pb
, char *pszParmValue
)
1818 if (strwicmp(pszParmValue
, "yes") == 0 ||
1819 strwicmp(pszParmValue
, "true") == 0 ||
1820 strwicmp(pszParmValue
, "1") == 0)
1823 if (strwicmp(pszParmValue
, "no") == 0 ||
1824 strwicmp(pszParmValue
, "False") == 0 ||
1825 strwicmp(pszParmValue
, "0") == 0)
1830 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1837 /***************************************************************************
1838 Find a service by name. Otherwise works like get_service.
1839 ***************************************************************************/
1840 static int getservicebyname(char *pszServiceName
, service
* pserviceDest
)
1844 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
1845 if (VALID(iService
) &&
1846 strwicmp(iSERVICE(iService
).szService
,
1847 pszServiceName
) == 0)
1849 if (pserviceDest
!= NULL
)
1850 copy_service(pserviceDest
, pSERVICE(iService
),
1860 /***************************************************************************
1861 Copy a service structure to another
1863 If pcopymapDest is NULL then copy all fields
1864 ***************************************************************************/
1865 static void copy_service(service
* pserviceDest
,
1866 service
* pserviceSource
, BOOL
*pcopymapDest
)
1869 BOOL bcopyall
= (pcopymapDest
== NULL
);
1871 for (i
= 0; parm_table
[i
].label
; i
++)
1872 if (parm_table
[i
].ptr
&& parm_table
[i
].class == P_LOCAL
&&
1873 (bcopyall
|| pcopymapDest
[i
]))
1875 void *def_ptr
= parm_table
[i
].ptr
;
1877 ((char *)pserviceSource
) + PTR_DIFF(def_ptr
,
1880 ((char *)pserviceDest
) + PTR_DIFF(def_ptr
,
1883 switch (parm_table
[i
].type
)
1887 *(BOOL
*)dest_ptr
= *(BOOL
*)src_ptr
;
1893 *(int *)dest_ptr
= *(int *)src_ptr
;
1897 *(char *)dest_ptr
= *(char *)src_ptr
;
1901 string_set(dest_ptr
,
1906 string_set(dest_ptr
,
1908 strupper(*(char **)dest_ptr
);
1917 init_copymap(pserviceDest
);
1918 if (pserviceSource
->copymap
)
1919 memcpy((void *)pserviceDest
->copymap
,
1920 (void *)pserviceSource
->copymap
,
1921 sizeof(BOOL
) * NUMPARAMETERS
);
1925 /***************************************************************************
1926 Check a service for consistency. Return False if the service is in any way
1927 incomplete or faulty, else True.
1928 ***************************************************************************/
1929 static BOOL
service_ok(int iService
)
1934 if (iSERVICE(iService
).szService
[0] == '\0')
1937 ("The following message indicates an internal error:\n"));
1938 DEBUG(0, ("No service name in service entry.\n"));
1942 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
1943 /* I can't see why you'd want a non-printable printer service... */
1944 if (strwicmp(iSERVICE(iService
).szService
, PRINTERS_NAME
) == 0) {
1945 if (!iSERVICE(iService
).bPrint_ok
) {
1947 ("WARNING: [%s] service MUST be printable!\n",
1948 iSERVICE(iService
).szService
));
1949 iSERVICE(iService
).bPrint_ok
= True
;
1951 /* [printers] service must also be non-browsable. */
1952 if (iSERVICE(iService
).bBrowseable
)
1953 iSERVICE(iService
).bBrowseable
= False
;
1956 if (iSERVICE(iService
).szPath
[0] == '\0' &&
1957 strwicmp(iSERVICE(iService
).szService
, HOMES_NAME
) != 0)
1960 ("No path in service %s - using %s\n",
1961 iSERVICE(iService
).szService
, tmpdir()));
1962 string_set(&iSERVICE(iService
).szPath
, tmpdir());
1965 /* If a service is flagged unavailable, log the fact at level 0. */
1966 if (!iSERVICE(iService
).bAvailable
)
1967 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
1968 iSERVICE(iService
).szService
));
1973 static struct file_lists
1975 struct file_lists
*next
;
1981 /*******************************************************************
1982 keep a linked list of all config files so we know when one has changed
1983 it's date and needs to be reloaded
1984 ********************************************************************/
1985 static void add_to_file_list(char *fname
)
1987 struct file_lists
*f
= file_lists
;
1991 if (f
->name
&& !strcmp(f
->name
, fname
))
1998 f
= (struct file_lists
*)malloc(sizeof(file_lists
[0]));
2001 f
->next
= file_lists
;
2002 f
->name
= strdup(fname
);
2014 standard_sub_basic(n2
);
2015 f
->modtime
= file_modtime(n2
);
2020 /*******************************************************************
2021 check if a config file has changed date
2022 ********************************************************************/
2023 BOOL
lp_file_list_changed(void)
2025 struct file_lists
*f
= file_lists
;
2026 DEBUG(6, ("lp_file_list_changed()\n"));
2033 pstrcpy(n2
, f
->name
);
2034 standard_sub_basic(n2
);
2036 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2037 f
->name
, n2
, ctime(&f
->modtime
)));
2039 mod_time
= file_modtime(n2
);
2041 if (f
->modtime
!= mod_time
)
2044 ("file %s modified: %s\n", n2
,
2046 f
->modtime
= mod_time
;
2054 /***************************************************************************
2055 Run standard_sub_basic on netbios name... needed because global_myname
2056 is not accessed through any lp_ macro.
2057 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2058 ***************************************************************************/
2060 static BOOL
handle_netbios_name(char *pszParmValue
, char **ptr
)
2062 pstring netbios_name
;
2064 pstrcpy(netbios_name
, pszParmValue
);
2066 standard_sub_basic(netbios_name
);
2067 strupper(netbios_name
);
2070 * Convert from UNIX to DOS string - the UNIX to DOS converter
2071 * isn't called on the special handlers.
2073 unix_to_dos(netbios_name
, True
);
2074 pstrcpy(global_myname
, netbios_name
);
2077 ("handle_netbios_name: set global_myname to: %s\n",
2083 /***************************************************************************
2084 Do the work of sourcing in environment variable/value pairs.
2085 ***************************************************************************/
2087 static BOOL
source_env(char **lines
)
2094 for (i
= 0; lines
[i
]; i
++)
2096 char *line
= lines
[i
];
2098 if ((len
= strlen(line
)) == 0)
2101 if (line
[len
- 1] == '\n')
2104 if ((varval
= malloc(len
+ 1)) == NULL
)
2106 DEBUG(0, ("source_env: Not enough memory!\n"));
2110 DEBUG(4, ("source_env: Adding to environment: %s\n", line
));
2111 strncpy(varval
, line
, len
);
2114 p
= strchr(line
, (int)'=');
2117 DEBUG(4, ("source_env: missing '=': %s\n", line
));
2124 ("source_env: Failed to put environment variable %s\n",
2132 ("source_env: getting var %s = %s\n", line
,
2136 DEBUG(4, ("source_env: returning successfully\n"));
2140 /***************************************************************************
2141 Handle the source environment operation
2142 ***************************************************************************/
2144 static BOOL
handle_source_env(char *pszParmValue
, char **ptr
)
2151 pstrcpy(fname
, pszParmValue
);
2153 standard_sub_basic(fname
);
2155 string_set(ptr
, pszParmValue
);
2157 DEBUG(4, ("handle_source_env: checking env type\n"));
2160 * Filename starting with '|' means popen and read from stdin.
2165 lines
= file_lines_pload(p
+ 1, NULL
);
2169 lines
= file_lines_load(fname
, NULL
);
2175 ("handle_source_env: Failed to open file %s, Error was %s\n",
2176 fname
, strerror(errno
)));
2180 result
= source_env(lines
);
2181 file_lines_free(lines
);
2186 /***************************************************************************
2187 handle the interpretation of the vfs object parameter
2188 *************************************************************************/
2189 static BOOL
handle_vfs_object(char *pszParmValue
, char **ptr
)
2191 /* Set string value */
2193 string_set(ptr
, pszParmValue
);
2195 /* Do any other initialisation required for vfs. Note that
2196 anything done here may have linking repercussions in nmbd. */
2201 /***************************************************************************
2202 handle the interpretation of the coding system parameter
2203 *************************************************************************/
2204 static BOOL
handle_coding_system(char *pszParmValue
, char **ptr
)
2206 string_set(ptr
, pszParmValue
);
2207 interpret_coding_system(pszParmValue
);
2211 /***************************************************************************
2212 Handle the interpretation of the character set system parameter.
2213 ***************************************************************************/
2215 static char *saved_character_set
= NULL
;
2217 static BOOL
handle_character_set(char *pszParmValue
, char **ptr
)
2219 /* A dependency here is that the parameter client code page should be
2220 set before this is called.
2222 string_set(ptr
, pszParmValue
);
2224 saved_character_set
= strdup(*ptr
);
2225 interpret_character_set(*ptr
, lp_client_code_page());
2229 /***************************************************************************
2230 Handle the interpretation of the client code page parameter.
2231 We handle this separately so that we can reset the character set
2232 parameter in case this came before 'client code page' in the smb.conf.
2233 ***************************************************************************/
2235 static BOOL
handle_client_code_page(char *pszParmValue
, char **ptr
)
2237 Globals
.client_code_page
= atoi(pszParmValue
);
2238 if (saved_character_set
!= NULL
)
2239 interpret_character_set(saved_character_set
,
2240 lp_client_code_page());
2244 /***************************************************************************
2245 handle the valid chars lines
2246 ***************************************************************************/
2248 static BOOL
handle_valid_chars(char *pszParmValue
, char **ptr
)
2250 string_set(ptr
, pszParmValue
);
2252 /* A dependency here is that the parameter client code page must be
2253 set before this is called - as calling codepage_initialise()
2254 would overwrite the valid char lines.
2256 codepage_initialise(lp_client_code_page());
2258 add_char_string(pszParmValue
);
2262 /***************************************************************************
2263 handle the include operation
2264 ***************************************************************************/
2266 static BOOL
handle_include(char *pszParmValue
, char **ptr
)
2269 pstrcpy(fname
, pszParmValue
);
2271 add_to_file_list(fname
);
2273 standard_sub_basic(fname
);
2275 string_set(ptr
, fname
);
2277 if (file_exist(fname
, NULL
))
2278 return (pm_process(fname
, do_section
, do_parameter
));
2280 DEBUG(2, ("Can't find include file %s\n", fname
));
2286 /***************************************************************************
2287 handle the interpretation of the copy parameter
2288 ***************************************************************************/
2289 static BOOL
handle_copy(char *pszParmValue
, char **ptr
)
2293 service serviceTemp
;
2295 string_set(ptr
, pszParmValue
);
2297 init_service(&serviceTemp
);
2301 DEBUG(3, ("Copying service from service %s\n", pszParmValue
));
2303 if ((iTemp
= getservicebyname(pszParmValue
, &serviceTemp
)) >= 0)
2305 if (iTemp
== iServiceIndex
)
2308 ("Can't copy service %s - unable to copy self!\n",
2313 copy_service(pSERVICE(iServiceIndex
),
2315 iSERVICE(iServiceIndex
).copymap
);
2321 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2326 free_service(&serviceTemp
);
2330 /***************************************************************************
2331 Handle winbind uid and gid allocation parameters. The format of these
2336 winbind uid = 1000-1999
2337 winbind gid = 700-899
2339 We only do simple parsing checks here. The strings are parsed into useful
2340 structures in the winbind daemon code.
2342 ***************************************************************************/
2344 /* Do some simple checks on "winbind [ug]id" parameter value */
2346 static BOOL
handle_winbind_id(char *pszParmValue
, char **ptr
)
2350 if (sscanf(pszParmValue
, "%d-%d", &low
, &high
) != 2)
2357 string_set(ptr
, pszParmValue
);
2362 /***************************************************************************
2363 Handle the WINS SERVER list
2364 ***************************************************************************/
2365 static BOOL
handle_wins_server_list( char *pszParmValue
, char **ptr
)
2367 if( !wins_srv_load_list( pszParmValue
) )
2368 return( False
); /* Parse failed. */
2370 string_set( ptr
, pszParmValue
);
2375 /***************************************************************************
2376 initialise a copymap
2377 ***************************************************************************/
2378 static void init_copymap(service
* pservice
)
2381 if (pservice
->copymap
)
2382 free(pservice
->copymap
);
2383 pservice
->copymap
= (BOOL
*)malloc(sizeof(BOOL
) * NUMPARAMETERS
);
2384 if (!pservice
->copymap
)
2386 ("Couldn't allocate copymap!! (size %d)\n",
2387 (int)NUMPARAMETERS
));
2389 for (i
= 0; i
< NUMPARAMETERS
; i
++)
2390 pservice
->copymap
[i
] = True
;
2394 /***************************************************************************
2395 return the local pointer to a parameter given the service number and the
2396 pointer into the default structure
2397 ***************************************************************************/
2398 void *lp_local_ptr(int snum
, void *ptr
)
2400 return (void *)(((char *)pSERVICE(snum
)) + PTR_DIFF(ptr
, &sDefault
));
2403 /***************************************************************************
2404 Process a parameter for a particular service number. If snum < 0
2405 then assume we are in the globals
2406 ***************************************************************************/
2407 BOOL
lp_do_parameter(int snum
, char *pszParmName
, char *pszParmValue
)
2410 void *parm_ptr
= NULL
; /* where we are going to store the result */
2411 void *def_ptr
= NULL
;
2413 parmnum
= map_parameter(pszParmName
);
2418 ("Ignoring unknown parameter \"%s\"\n", pszParmName
));
2422 if (parm_table
[parmnum
].flags
& FLAG_DEPRECATED
)
2424 DEBUG(1, ("WARNING: The \"%s\"option is deprecated\n",
2428 def_ptr
= parm_table
[parmnum
].ptr
;
2430 /* we might point at a service, the default service or a global */
2437 if (parm_table
[parmnum
].class == P_GLOBAL
)
2440 ("Global parameter %s found in service section!\n",
2445 ((char *)pSERVICE(snum
)) + PTR_DIFF(def_ptr
,
2451 if (!iSERVICE(snum
).copymap
)
2452 init_copymap(pSERVICE(snum
));
2454 /* this handles the aliases - set the copymap for other entries with
2455 the same data pointer */
2456 for (i
= 0; parm_table
[i
].label
; i
++)
2457 if (parm_table
[i
].ptr
== parm_table
[parmnum
].ptr
)
2458 iSERVICE(snum
).copymap
[i
] = False
;
2461 /* if it is a special case then go ahead */
2462 if (parm_table
[parmnum
].special
)
2464 parm_table
[parmnum
].special(pszParmValue
, (char **)parm_ptr
);
2468 /* now switch on the type of variable it is */
2469 switch (parm_table
[parmnum
].type
)
2472 set_boolean(parm_ptr
, pszParmValue
);
2476 set_boolean(parm_ptr
, pszParmValue
);
2477 *(BOOL
*)parm_ptr
= !*(BOOL
*)parm_ptr
;
2481 *(int *)parm_ptr
= atoi(pszParmValue
);
2485 *(char *)parm_ptr
= *pszParmValue
;
2489 sscanf(pszParmValue
, "%o", (int *)parm_ptr
);
2493 string_set(parm_ptr
, pszParmValue
);
2494 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2495 unix_to_dos(*(char **)parm_ptr
, True
);
2499 string_set(parm_ptr
, pszParmValue
);
2500 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2501 unix_to_dos(*(char **)parm_ptr
, True
);
2502 strupper(*(char **)parm_ptr
);
2506 pstrcpy((char *)parm_ptr
, pszParmValue
);
2507 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2508 unix_to_dos((char *)parm_ptr
, True
);
2512 pstrcpy((char *)parm_ptr
, pszParmValue
);
2513 if (parm_table
[parmnum
].flags
& FLAG_DOS_STRING
)
2514 unix_to_dos((char *)parm_ptr
, True
);
2515 strupper((char *)parm_ptr
);
2519 for (i
= 0; parm_table
[parmnum
].enum_list
[i
].name
;
2524 parm_table
[parmnum
].enum_list
[i
].name
))
2527 parm_table
[parmnum
].
2540 /***************************************************************************
2541 Process a parameter.
2542 ***************************************************************************/
2543 static BOOL
do_parameter(char *pszParmName
, char *pszParmValue
)
2545 if (!bInGlobalSection
&& bGlobalOnly
)
2548 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName
, pszParmValue
));
2550 return (lp_do_parameter(bInGlobalSection
? -2 : iServiceIndex
,
2551 pszParmName
, pszParmValue
));
2555 /***************************************************************************
2556 print a parameter of the specified type
2557 ***************************************************************************/
2558 static void print_parameter(struct parm_struct
*p
, void *ptr
, FILE * f
)
2564 for (i
= 0; p
->enum_list
[i
].name
; i
++)
2566 if (*(int *)ptr
== p
->enum_list
[i
].value
)
2569 p
->enum_list
[i
].name
);
2576 fprintf(f
, "%s", BOOLSTR(*(BOOL
*)ptr
));
2580 fprintf(f
, "%s", BOOLSTR(!*(BOOL
*)ptr
));
2584 fprintf(f
, "%d", *(int *)ptr
);
2588 fprintf(f
, "%c", *(char *)ptr
);
2592 fprintf(f
, "%s", octal_string(*(int *)ptr
));
2598 fprintf(f
, "%s", (char *)ptr
);
2604 fprintf(f
, "%s", *(char **)ptr
);
2612 /***************************************************************************
2613 check if two parameters are equal
2614 ***************************************************************************/
2615 static BOOL
equal_parameter(parm_type type
, void *ptr1
, void *ptr2
)
2621 return (*((BOOL
*)ptr1
) == *((BOOL
*)ptr2
));
2626 return (*((int *)ptr1
) == *((int *)ptr2
));
2629 return (*((char *)ptr1
) == *((char *)ptr2
));
2634 char *p1
= (char *)ptr1
, *p2
= (char *)ptr2
;
2639 return (p1
== p2
|| strequal(p1
, p2
));
2644 char *p1
= *(char **)ptr1
, *p2
= *(char **)ptr2
;
2649 return (p1
== p2
|| strequal(p1
, p2
));
2657 /***************************************************************************
2658 Process a new section (service). At this stage all sections are services.
2659 Later we'll have special sections that permit server parameters to be set.
2660 Returns True on success, False on failure.
2661 ***************************************************************************/
2662 static BOOL
do_section(char *pszSectionName
)
2665 BOOL isglobal
= ((strwicmp(pszSectionName
, GLOBAL_NAME
) == 0) ||
2666 (strwicmp(pszSectionName
, GLOBAL_NAME2
) == 0));
2669 /* if we were in a global section then do the local inits */
2670 if (bInGlobalSection
&& !isglobal
)
2673 /* if we've just struck a global section, note the fact. */
2674 bInGlobalSection
= isglobal
;
2676 /* check for multiple global sections */
2677 if (bInGlobalSection
)
2679 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName
));
2683 if (!bInGlobalSection
&& bGlobalOnly
)
2686 /* if we have a current service, tidy it up before moving on */
2689 if (iServiceIndex
>= 0)
2690 bRetval
= service_ok(iServiceIndex
);
2692 /* if all is still well, move to the next record in the services array */
2695 /* We put this here to avoid an odd message order if messages are */
2696 /* issued by the post-processing of a previous section. */
2697 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName
));
2699 if ((iServiceIndex
= add_a_service(&sDefault
, pszSectionName
))
2702 DEBUG(0, ("Failed to add a new service\n"));
2711 /***************************************************************************
2712 determine if a partcular base parameter is currently set to the default value.
2713 ***************************************************************************/
2714 static BOOL
is_default(int i
)
2716 if (!defaults_saved
)
2718 switch (parm_table
[i
].type
)
2722 return strequal(parm_table
[i
].def
.svalue
,
2723 *(char **)parm_table
[i
].ptr
);
2726 return strequal(parm_table
[i
].def
.svalue
,
2727 (char *)parm_table
[i
].ptr
);
2730 return parm_table
[i
].def
.bvalue
==
2731 *(BOOL
*)parm_table
[i
].ptr
;
2733 return parm_table
[i
].def
.cvalue
==
2734 *(char *)parm_table
[i
].ptr
;
2738 return parm_table
[i
].def
.ivalue
==
2739 *(int *)parm_table
[i
].ptr
;
2747 /***************************************************************************
2748 Display the contents of the global structure.
2749 ***************************************************************************/
2750 static void dump_globals(FILE * f
)
2753 fprintf(f
, "# Global parameters\n[global]\n");
2755 for (i
= 0; parm_table
[i
].label
; i
++)
2756 if (parm_table
[i
].class == P_GLOBAL
&&
2757 parm_table
[i
].ptr
&&
2758 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
2760 if (defaults_saved
&& is_default(i
))
2762 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
2763 print_parameter(&parm_table
[i
], parm_table
[i
].ptr
, f
);
2768 /***************************************************************************
2769 return True if a local parameter is currently set to the global default
2770 ***************************************************************************/
2771 BOOL
lp_is_default(int snum
, struct parm_struct
*parm
)
2773 int pdiff
= PTR_DIFF(parm
->ptr
, &sDefault
);
2775 return equal_parameter(parm
->type
,
2776 ((char *)pSERVICE(snum
)) + pdiff
,
2777 ((char *)&sDefault
) + pdiff
);
2781 /***************************************************************************
2782 Display the contents of a single services record.
2783 ***************************************************************************/
2784 static void dump_a_service(service
* pService
, FILE * f
)
2787 if (pService
!= &sDefault
)
2788 fprintf(f
, "\n[%s]\n", pService
->szService
);
2790 for (i
= 0; parm_table
[i
].label
; i
++)
2791 if (parm_table
[i
].class == P_LOCAL
&&
2792 parm_table
[i
].ptr
&&
2793 (*parm_table
[i
].label
!= '-') &&
2794 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
2796 int pdiff
= PTR_DIFF(parm_table
[i
].ptr
, &sDefault
);
2798 if (pService
== &sDefault
)
2800 if (defaults_saved
&& is_default(i
))
2805 if (equal_parameter(parm_table
[i
].type
,
2806 ((char *)pService
) +
2808 ((char *)&sDefault
) +
2813 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
2814 print_parameter(&parm_table
[i
],
2815 ((char *)pService
) + pdiff
, f
);
2821 /***************************************************************************
2822 return info about the next service in a service. snum==-1 gives the globals
2824 return NULL when out of parameters
2825 ***************************************************************************/
2826 struct parm_struct
*lp_next_parameter(int snum
, int *i
, int allparameters
)
2830 /* do the globals */
2831 for (; parm_table
[*i
].label
; (*i
)++)
2833 if (parm_table
[*i
].class == P_SEPARATOR
)
2834 return &parm_table
[(*i
)++];
2836 if (!parm_table
[*i
].ptr
2837 || (*parm_table
[*i
].label
== '-'))
2841 && (parm_table
[*i
].ptr
==
2842 parm_table
[(*i
) - 1].ptr
))
2845 return &parm_table
[(*i
)++];
2850 service
*pService
= pSERVICE(snum
);
2852 for (; parm_table
[*i
].label
; (*i
)++)
2854 if (parm_table
[*i
].class == P_SEPARATOR
)
2855 return &parm_table
[(*i
)++];
2857 if (parm_table
[*i
].class == P_LOCAL
&&
2858 parm_table
[*i
].ptr
&&
2859 (*parm_table
[*i
].label
!= '-') &&
2861 (parm_table
[*i
].ptr
!=
2862 parm_table
[(*i
) - 1].ptr
)))
2865 PTR_DIFF(parm_table
[*i
].ptr
,
2868 if (allparameters
||
2869 !equal_parameter(parm_table
[*i
].type
,
2870 ((char *)pService
) +
2872 ((char *)&sDefault
) +
2875 return &parm_table
[(*i
)++];
2886 /***************************************************************************
2887 Display the contents of a single copy structure.
2888 ***************************************************************************/
2889 static void dump_copy_map(BOOL
*pcopymap
)
2895 printf("\n\tNon-Copied parameters:\n");
2897 for (i
= 0; parm_table
[i
].label
; i
++)
2898 if (parm_table
[i
].class == P_LOCAL
&&
2899 parm_table
[i
].ptr
&& !pcopymap
[i
] &&
2900 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
2902 printf("\t\t%s\n", parm_table
[i
].label
);
2907 /***************************************************************************
2908 Return TRUE if the passed service number is within range.
2909 ***************************************************************************/
2910 BOOL
lp_snum_ok(int iService
)
2912 return (LP_SNUM_OK(iService
) && iSERVICE(iService
).bAvailable
);
2916 /***************************************************************************
2917 auto-load some home services
2918 ***************************************************************************/
2919 static void lp_add_auto_services(char *str
)
2932 homes
= lp_servicenumber(HOMES_NAME
);
2934 for (p
= strtok(s
, LIST_SEP
); p
; p
= strtok(NULL
, LIST_SEP
))
2936 char *home
= get_user_home_dir(p
);
2938 if (lp_servicenumber(p
) >= 0)
2941 if (home
&& homes
>= 0)
2943 lp_add_home(p
, homes
, home
);
2949 /***************************************************************************
2950 auto-load one printer
2951 ***************************************************************************/
2952 void lp_add_one_printer(char *name
, char *comment
)
2954 int printers
= lp_servicenumber(PRINTERS_NAME
);
2957 if (lp_servicenumber(name
) < 0)
2959 lp_add_printer(name
, printers
);
2960 if ((i
= lp_servicenumber(name
)) >= 0)
2962 string_set(&iSERVICE(i
).comment
, comment
);
2963 iSERVICE(i
).autoloaded
= True
;
2968 /***************************************************************************
2969 have we loaded a services file yet?
2970 ***************************************************************************/
2971 BOOL
lp_loaded(void)
2976 /***************************************************************************
2977 unload unused services
2978 ***************************************************************************/
2979 void lp_killunused(BOOL (*snumused
) (int))
2982 for (i
= 0; i
< iNumServices
; i
++)
2987 if (!snumused
|| !snumused(i
))
2989 iSERVICE(i
).valid
= False
;
2990 free_service(pSERVICE(i
));
2996 /***************************************************************************
2998 ***************************************************************************/
2999 void lp_killservice(int iServiceIn
)
3001 if (VALID(iServiceIn
))
3003 iSERVICE(iServiceIn
).valid
= False
;
3004 free_service(pSERVICE(iServiceIn
));
3008 /***************************************************************************
3009 save the curent values of all global and sDefault parameters into the
3010 defaults union. This allows swat and testparm to show only the
3011 changed (ie. non-default) parameters.
3012 ***************************************************************************/
3013 static void lp_save_defaults(void)
3016 for (i
= 0; parm_table
[i
].label
; i
++)
3018 if (i
> 0 && parm_table
[i
].ptr
== parm_table
[i
- 1].ptr
)
3020 switch (parm_table
[i
].type
)
3024 parm_table
[i
].def
.svalue
=
3025 strdup(*(char **)parm_table
[i
].ptr
);
3029 parm_table
[i
].def
.svalue
=
3030 strdup((char *)parm_table
[i
].ptr
);
3034 parm_table
[i
].def
.bvalue
=
3035 *(BOOL
*)parm_table
[i
].ptr
;
3038 parm_table
[i
].def
.cvalue
=
3039 *(char *)parm_table
[i
].ptr
;
3044 parm_table
[i
].def
.ivalue
=
3045 *(int *)parm_table
[i
].ptr
;
3051 defaults_saved
= True
;
3054 /*******************************************************************
3055 Set the server type we will announce as via nmbd.
3056 ********************************************************************/
3057 static void set_server_role(void)
3059 server_role
= ROLE_STANDALONE
;
3061 switch (lp_security())
3065 if (lp_domain_logons())
3068 ("Server's Role (logon server) conflicts with share-level security\n"));
3075 if (lp_domain_logons())
3077 server_role
= ROLE_DOMAIN_BDC
;
3080 server_role
= ROLE_DOMAIN_MEMBER
;
3085 if (lp_domain_logons())
3087 server_role
= ROLE_DOMAIN_PDC
;
3095 ("Server's Role undefined due to unknown security mode\n"));
3101 /***************************************************************************
3102 Load the services array from the services file. Return True on success,
3104 ***************************************************************************/
3105 BOOL
lp_load(char *pszFname
, BOOL global_only
, BOOL save_defaults
,
3111 add_to_file_list(pszFname
);
3115 bInGlobalSection
= True
;
3116 bGlobalOnly
= global_only
;
3126 pstrcpy(n2
, pszFname
);
3127 standard_sub_basic(n2
);
3129 /* We get sections first, so have to start 'behind' to make up */
3131 bRetval
= pm_process(n2
, do_section
, do_parameter
);
3133 /* finish up the last section */
3134 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval
)));
3136 if (iServiceIndex
>= 0)
3137 bRetval
= service_ok(iServiceIndex
);
3139 lp_add_auto_services(lp_auto_services());
3145 set_default_server_announce_type();
3149 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3150 /* if bWINSsupport is true and we are in the client */
3152 if (in_client
&& Globals
.bWINSsupport
)
3155 string_set(&Globals
.szWINSserver
, "127.0.0.1");
3163 /***************************************************************************
3164 reset the max number of services
3165 ***************************************************************************/
3166 void lp_resetnumservices(void)
3171 /***************************************************************************
3172 return the max number of services
3173 ***************************************************************************/
3174 int lp_numservices(void)
3176 return (iNumServices
);
3179 /***************************************************************************
3180 Display the contents of the services array in human-readable form.
3181 ***************************************************************************/
3182 void lp_dump(FILE * f
, BOOL show_defaults
, int maxtoprint
)
3188 defaults_saved
= False
;
3193 dump_a_service(&sDefault
, f
);
3195 for (iService
= 0; iService
< maxtoprint
; iService
++)
3196 lp_dump_one(f
, show_defaults
, iService
);
3199 /***************************************************************************
3200 Display the contents of one service in human-readable form.
3201 ***************************************************************************/
3202 void lp_dump_one(FILE * f
, BOOL show_defaults
, int snum
)
3206 if (iSERVICE(snum
).szService
[0] == '\0')
3208 dump_a_service(pSERVICE(snum
), f
);
3213 /***************************************************************************
3214 Return the number of the service with the given name, or -1 if it doesn't
3215 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3216 getservicebyname()! This works ONLY if all services have been loaded, and
3217 does not copy the found service.
3218 ***************************************************************************/
3219 int lp_servicenumber(char *pszServiceName
)
3223 for (iService
= iNumServices
- 1; iService
>= 0; iService
--)
3224 if (VALID(iService
) &&
3225 strequal(lp_servicename(iService
), pszServiceName
))
3230 ("lp_servicenumber: couldn't find %s\n",
3236 /*******************************************************************
3237 a useful volume label function
3238 ******************************************************************/
3239 char *volume_label(int snum
)
3241 char *ret
= lp_volume(snum
);
3243 /* lp_volume returns a unix charset - lp_servicename returns a
3244 dos codepage - convert so volume_label() always returns UNIX.
3246 return (dos_to_unix(lp_servicename(snum
), False
));
3252 /*******************************************************************
3253 Set the server type we will announce as via nmbd.
3254 ********************************************************************/
3255 static void set_default_server_announce_type(void)
3257 default_server_announce
= 0;
3258 default_server_announce
|= SV_TYPE_WORKSTATION
;
3259 default_server_announce
|= SV_TYPE_SERVER
;
3260 default_server_announce
|= SV_TYPE_SERVER_UNIX
;
3261 default_server_announce
|= SV_TYPE_PRINTQ_SERVER
;
3263 switch (lp_announce_as())
3265 case ANNOUNCE_AS_NT_SERVER
:
3267 default_server_announce
|= SV_TYPE_SERVER_NT
;
3268 /* fall through... */
3270 case ANNOUNCE_AS_NT_WORKSTATION
:
3272 default_server_announce
|= SV_TYPE_NT
;
3275 case ANNOUNCE_AS_WIN95
:
3277 default_server_announce
|= SV_TYPE_WIN95_PLUS
;
3280 case ANNOUNCE_AS_WFW
:
3282 default_server_announce
|= SV_TYPE_WFW
;
3291 switch (lp_server_role())
3293 case ROLE_DOMAIN_MEMBER
:
3295 default_server_announce
|= SV_TYPE_DOMAIN_MEMBER
;
3298 case ROLE_DOMAIN_PDC
:
3300 default_server_announce
|= SV_TYPE_DOMAIN_CTRL
;
3303 case ROLE_DOMAIN_BDC
:
3305 default_server_announce
|= SV_TYPE_DOMAIN_BAKCTRL
;
3308 case ROLE_STANDALONE
:
3315 if (lp_time_server())
3317 default_server_announce
|= SV_TYPE_TIME_SOURCE
;
3320 if (lp_host_msdfs())
3322 default_server_announce
|= SV_TYPE_DFS_SERVER
;
3326 /***********************************************************
3327 returns role of Samba server
3328 ************************************************************/
3330 int lp_server_role(void)
3335 /***********************************************************
3336 If we are PDC then prefer us as DMB
3337 ************************************************************/
3339 BOOL
lp_domain_master(void)
3341 if (Globals
.bDomainMaster
== Auto
)
3343 return (lp_server_role() == ROLE_DOMAIN_PDC
);
3346 return Globals
.bDomainMaster
;
3349 /***********************************************************
3350 If we are DMB then prefer us as LMB
3351 ************************************************************/
3353 BOOL
lp_preferred_master(void)
3355 if (Globals
.bPreferredMaster
== Auto
)
3357 return (lp_local_master() && lp_domain_master());
3360 return Globals
.bPreferredMaster
;
3365 /*******************************************************************
3367 ********************************************************************/
3368 void lp_remove_service(int snum
)
3370 pSERVICE(snum
)->valid
= False
;
3373 /*******************************************************************
3375 ********************************************************************/
3376 void lp_copy_service(int snum
, char *new_name
)
3378 char *oldname
= lp_servicename(snum
);
3379 do_section(new_name
);
3382 snum
= lp_servicenumber(new_name
);
3384 lp_do_parameter(snum
, "copy", oldname
);
3389 /*******************************************************************
3390 Get the default server type we will announce as via nmbd.
3391 ********************************************************************/
3392 int lp_default_server_announce(void)
3394 return default_server_announce
;
3397 /*******************************************************************
3398 Split the announce version into major and minor numbers.
3399 ********************************************************************/
3400 int lp_major_announce_version(void)
3402 static BOOL got_major
= False
;
3403 static int major_version
= DEFAULT_MAJOR_VERSION
;
3408 return major_version
;
3411 if ((vers
= lp_announce_version()) == NULL
)
3412 return major_version
;
3414 if ((p
= strchr(vers
, '.')) == 0)
3415 return major_version
;
3418 major_version
= atoi(vers
);
3419 return major_version
;
3422 int lp_minor_announce_version(void)
3424 static BOOL got_minor
= False
;
3425 static int minor_version
= DEFAULT_MINOR_VERSION
;
3430 return minor_version
;
3433 if ((vers
= lp_announce_version()) == NULL
)
3434 return minor_version
;
3436 if ((p
= strchr(vers
, '.')) == 0)
3437 return minor_version
;
3440 minor_version
= atoi(p
);
3441 return minor_version
;
3444 /***********************************************************
3445 Set the global name resolution order (used in smbclient).
3446 ************************************************************/
3448 void lp_set_name_resolve_order(char *new_order
)
3450 Globals
.szNameResolveOrder
= new_order
;
3453 /***********************************************************
3454 Functions to return the current security masks/modes. If
3455 set to -1 then return the create mask/mode instead.
3456 ************************************************************/
3458 int lp_security_mask(int snum
)
3460 int val
= _lp_security_mask(snum
);
3462 return lp_create_mask(snum
);
3466 int lp_force_security_mode(int snum
)
3468 int val
= _lp_force_security_mode(snum
);
3470 return lp_force_create_mode(snum
);
3474 int lp_dir_security_mask(int snum
)
3476 int val
= _lp_dir_security_mask(snum
);
3478 return lp_dir_mask(snum
);
3482 int lp_force_dir_security_mode(int snum
)
3484 int val
= _lp_force_dir_security_mode(snum
);
3486 return lp_force_dir_mode(snum
);
3490 char *lp_printername(int snum
)
3492 char *ret
= _lp_printername(snum
);
3493 if (ret
== NULL
|| (ret
!= NULL
&& *ret
== '\0'))
3494 ret
= lp_servicename(snum
);