2 Unix SMB/Netbios implementation.
4 Parameter loading functions
5 Copyright (C) Karl Auer 1993-1998
7 Largely re-written by Andrew Tridgell, September 1994
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 * This module provides suitable callback functions for the params
28 * module. It builds the internal table of service details which is
29 * then used by the rest of the server.
33 * 1) add it to the global or service structure definition
34 * 2) add it to the parm_table
35 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
36 * 4) If it's a global then initialise it in init_globals. If a local
37 * (ie. service) parameter then initialise it in the sDefault structure
41 * The configuration file is processed sequentially for speed. It is NOT
42 * accessed randomly as happens in 'real' Windows. For this reason, there
43 * is a fair bit of sequence-dependent code here - ie., code which assumes
44 * that certain things happen before others. In particular, the code which
45 * happens at the boundary between sections is delicately poised, so be
52 /* Set default coding system for KANJI if none specified in Makefile. */
54 * We treat KANJI specially due to historical precedent (it was the
55 * first non-english codepage added to Samba). With the new dynamic
56 * codepage support this is not needed anymore.
58 * The define 'KANJI' is being overloaded to mean 'use kanji codepage
59 * by default' and also 'this is the filename-to-disk conversion
60 * method to use'. This really should be removed and all control
61 * over this left in the smb.conf parameters 'client codepage'
62 * and 'coding system'.
68 BOOL in_client = False; /* Not in the client by default */
71 extern int DEBUGLEVEL_CLASS[DBGC_LAST];
72 extern pstring user_socket_options;
73 extern pstring global_myname;
74 pstring global_scope = "";
77 #define GLOBAL_NAME "global"
81 #define PRINTERS_NAME "printers"
85 #define HOMES_NAME "homes"
88 /* some helpful bits */
89 #define pSERVICE(i) ServicePtrs[i]
90 #define iSERVICE(i) (*pSERVICE(i))
91 #define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
92 #define VALID(i) iSERVICE(i).valid
94 int keepalive = DEFAULT_KEEPALIVE;
95 BOOL use_getwd_cache = True;
97 extern int extra_time_offset;
99 static BOOL defaults_saved = False;
102 * This structure describes global (ie., server-wide) parameters.
106 char *szPrintcapname;
107 char *szEnumPortsCommand;
108 char *szAddPrinterCommand;
109 char *szDeletePrinterCommand;
112 char *szDefaultService;
116 char *szServerString;
117 char *szAutoServices;
118 char *szPasswdProgram;
122 char *szSMBPasswdFile;
124 char *szPassdbModulePath;
125 char *szPasswordServer;
126 char *szSocketOptions;
129 char *szDomainAdminGroup;
130 char *szDomainGuestGroup;
131 char *szDomainAdminUsers;
132 char *szDomainGuestUsers;
133 char *szDomainHostsallow;
134 char *szDomainHostsdeny;
136 #ifdef USING_GROUPNAME_MAP
137 char *szGroupnameMap;
138 #endif /* USING_GROUPNAME_MAP */
139 char *szCharacterSet;
147 char *szCodingSystem;
149 char *szRemoteAnnounce;
150 char *szRemoteBrowseSync;
151 char *szSocketAddress;
152 char *szNISHomeMapName;
153 char *szAnnounceVersion; /* This is initialised in init_globals */
154 char *szNetbiosAliases;
155 char *szDomainOtherSIDs;
156 char *szDomainGroups;
157 char *szNameResolveOrder;
162 char *szLdapRootPassword;
164 char *szAddUserScript;
165 char *szDelUserScript;
166 char *szAddGroupScript;
167 char *szDelGroupScript;
168 char *szAddUserToGroupScript;
169 char *szDelUserToGroupScript;
174 char *szUtmpHostname;
175 BOOL bUtmpConsolidate;
176 #endif /* WITH_UTMP */
180 char *szTemplateHomedir;
181 char *szTemplateShell;
182 char *szWinbindSeparator;
197 int iMaxSmbdProcesses;
201 int enhanced_browsing;
208 int client_code_page;
209 int announce_as; /* This is initialised in init_globals */
210 int machine_password_timeout;
211 int change_notify_timeout;
214 int min_passwd_length;
215 int oplock_break_wait_time;
216 int winbind_cache_time;
219 #endif /* WITH_LDAP */
222 char *sslHostsRequire;
223 char *sslHostsResign;
229 char *sslClientPrivKey;
232 BOOL sslReqClientCert;
233 BOOL sslReqServerCert;
234 BOOL sslCompatibility;
235 #endif /* WITH_SSL */
236 BOOL bMsAddPrinterWizard;
241 BOOL bPreferredMaster;
244 BOOL bEncryptPasswords;
252 BOOL bReadPrediction;
259 BOOL bBindInterfacesOnly;
260 BOOL bUnixPasswdSync;
261 BOOL bPasswdChatDebug;
268 BOOL bAllowTrustedDomains;
269 BOOL bRestrictAnonymous;
271 BOOL bDebugHiresTimestamp;
275 BOOL bHideLocalUsers;
280 static global Globals;
285 * This structure describes a single service.
294 char *szGuestaccount;
295 char *szInvalidUsers;
303 char *szRootPostExec;
304 char *szPrintcommand;
307 char *szLppausecommand;
308 char *szLpresumecommand;
309 char *szQueuepausecommand;
310 char *szQueueresumecommand;
312 char *szPrinterDriver;
313 char *szPrinterDriverLocation;
323 char *szVetoOplockFiles;
332 char *szVfsObjectFile;
338 int iCreate_force_mode;
340 int iSecurity_force_mode;
343 int iDir_Security_mask;
344 int iDir_Security_force_mode;
348 int iOplockContentionLimit;
351 BOOL bRootpreexecClose;
354 BOOL bShortCasePreserve;
386 BOOL bDeleteReadonly;
388 BOOL bDeleteVetoFiles;
391 BOOL bDosFiletimeResolution;
392 BOOL bFakeDirCreateTimes;
397 char dummy[3]; /* for alignment */
402 /* This is a default service used to prime a services structure */
403 static service sDefault = {
405 False, /* not autoloaded */
406 NULL, /* szService */
408 NULL, /* szUsername */
409 NULL, /* szGuestAccount - this is set in init_globals() */
410 NULL, /* szInvalidUsers */
411 NULL, /* szValidUsers */
412 NULL, /* szAdminUsers */
414 NULL, /* szInclude */
415 NULL, /* szPreExec */
416 NULL, /* szPostExec */
417 NULL, /* szRootPreExec */
418 NULL, /* szRootPostExec */
419 NULL, /* szPrintcommand */
420 NULL, /* szLpqcommand */
421 NULL, /* szLprmcommand */
422 NULL, /* szLppausecommand */
423 NULL, /* szLpresumecommand */
424 NULL, /* szQueuepausecommand */
425 NULL, /* szQueueresumecommand */
426 NULL, /* szPrintername */
427 NULL, /* szPrinterDriver - this is set in init_globals() */
428 NULL, /* szPrinterDriverLocation */
429 NULL, /* szDriverFile */
430 NULL, /* szDontdescend */
431 NULL, /* szHostsallow */
432 NULL, /* szHostsdeny */
433 NULL, /* szMagicScript */
434 NULL, /* szMagicOutput */
435 NULL, /* szMangledMap */
436 NULL, /* szVetoFiles */
437 NULL, /* szHideFiles */
438 NULL, /* szVetoOplockFiles */
440 NULL, /* force user */
441 NULL, /* force group */
443 NULL, /* writelist */
444 NULL, /* printer admin */
447 NULL, /* vfs object */
448 NULL, /* vfs options */
449 0, /* iMinPrintSpace */
450 1000, /* iMaxPrintJobs */
451 0, /* iWriteCacheSize */
452 0744, /* iCreate_mask */
453 0000, /* iCreate_force_mode */
454 -1, /* iSecurity_mask */
455 -1, /* iSecurity_force_mode */
456 0755, /* iDir_mask */
457 0000, /* iDir_force_mode */
458 -1, /* iDir_Security_mask */
459 -1, /* iDir_Security_force_mode */
460 0, /* iMaxConnections */
461 CASE_LOWER, /* iDefaultCase */
462 DEFAULT_PRINTING, /* iPrinting */
463 2, /* iOplockContentionLimit */
464 False, /* bAlternatePerm */
465 False, /* bPreexecClose */
466 False, /* bRootpreexecClose */
467 False, /* case sensitive */
468 True, /* case preserve */
469 True, /* short case preserve */
470 False, /* case mangle */
472 True, /* bHideDotFiles */
473 True, /* bBrowseable */
474 True, /* bAvailable */
475 True, /* bRead_only */
476 True, /* bNo_set_dir */
477 False, /* bGuest_only */
478 False, /* bGuest_ok */
479 False, /* bPrint_ok */
480 False, /* bPostscript */
481 False, /* bMap_system */
482 False, /* bMap_hidden */
483 True, /* bMap_archive */
485 False, /* bStrictLocking */
486 True, /* bPosixLocking */
490 True, /* bShareModes */
492 True, /* bLevel2OpLocks */
493 False, /* bOnlyUser */
494 True, /* bMangledNames */
495 True, /* bWidelinks */
496 True, /* bSymlinks */
497 False, /* bSyncAlways */
498 False, /* bStrictSync */
499 '~', /* magic char */
501 False, /* bDeleteReadonly */
502 False, /* bFakeOplocks */
503 False, /* bDeleteVetoFiles */
504 False, /* bDosFilemode */
505 False, /* bDosFiletimes */
506 False, /* bDosFiletimeResolution */
507 False, /* bFakeDirCreateTimes */
508 True, /* bBlockingLocks */
509 False, /* bInheritPerms */
510 False, /* bMSDfsRoot */
517 /* local variables */
518 static service **ServicePtrs = NULL;
519 static int iNumServices = 0;
520 static int iServiceIndex = 0;
521 static BOOL bInGlobalSection = True;
522 static BOOL bGlobalOnly = False;
523 static int server_role;
524 static int default_server_announce;
526 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
528 /* prototypes for the special type handlers */
529 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
530 static BOOL handle_include(char *pszParmValue, char **ptr);
531 static BOOL handle_copy(char *pszParmValue, char **ptr);
532 static BOOL handle_character_set(char *pszParmValue, char **ptr);
533 static BOOL handle_coding_system(char *pszParmValue, char **ptr);
534 static BOOL handle_client_code_page(char *pszParmValue, char **ptr);
535 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
536 static BOOL handle_source_env(char *pszParmValue, char **ptr);
537 static BOOL handle_netbios_name(char *pszParmValue, char **ptr);
538 static BOOL handle_winbind_id(char *pszParmValue, char **ptr);
539 static BOOL handle_wins_server_list(char *pszParmValue, char **ptr);
540 static BOOL handle_debug_list( char *pszParmValue, char **ptr );
542 static void set_server_role(void);
543 static void set_default_server_announce_type(void);
545 static struct enum_list enum_protocol[] = {
546 {PROTOCOL_NT1, "NT1"},
547 {PROTOCOL_LANMAN2, "LANMAN2"},
548 {PROTOCOL_LANMAN1, "LANMAN1"},
549 {PROTOCOL_CORE, "CORE"},
550 {PROTOCOL_COREPLUS, "COREPLUS"},
551 {PROTOCOL_COREPLUS, "CORE+"},
555 static struct enum_list enum_security[] = {
556 {SEC_SHARE, "SHARE"},
558 {SEC_SERVER, "SERVER"},
559 {SEC_DOMAIN, "DOMAIN"},
563 static struct enum_list enum_printing[] = {
564 {PRINT_SYSV, "sysv"},
566 {PRINT_HPUX, "hpux"},
570 {PRINT_LPRNG, "lprng"},
571 {PRINT_SOFTQ, "softq"},
572 {PRINT_CUPS, "cups"},
574 {PRINT_LPROS2, "os2"},
576 {PRINT_TEST, "test"},
578 #endif /* DEVELOPER */
582 /* Types of machine we can announce as. */
583 #define ANNOUNCE_AS_NT_SERVER 1
584 #define ANNOUNCE_AS_WIN95 2
585 #define ANNOUNCE_AS_WFW 3
586 #define ANNOUNCE_AS_NT_WORKSTATION 4
588 static struct enum_list enum_announce_as[] = {
589 {ANNOUNCE_AS_NT_SERVER, "NT"},
590 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
591 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
592 {ANNOUNCE_AS_WIN95, "win95"},
593 {ANNOUNCE_AS_WFW, "WfW"},
597 static struct enum_list enum_case[] = {
598 {CASE_LOWER, "lower"},
599 {CASE_UPPER, "upper"},
603 static struct enum_list enum_bool_auto[] = {
615 Do you want session setups at user level security with a invalid
616 password to be rejected or allowed in as guest? WinNT rejects them
617 but it can be a pain as it means "net view" needs to use a password
619 You have 3 choices in the setting of map_to_guest:
621 "Never" means session setups with an invalid password
622 are rejected. This is the default.
624 "Bad User" means session setups with an invalid password
625 are rejected, unless the username does not exist, in which case it
626 is treated as a guest login
628 "Bad Password" means session setups with an invalid password
629 are treated as a guest login
631 Note that map_to_guest only has an effect in user or server
635 static struct enum_list enum_map_to_guest[] = {
636 {NEVER_MAP_TO_GUEST, "Never"},
637 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
638 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
643 static struct enum_list enum_ssl_version[] = {
644 {SMB_SSL_V2, "ssl2"},
645 {SMB_SSL_V3, "ssl3"},
646 {SMB_SSL_V23, "ssl2or3"},
647 {SMB_SSL_TLS1, "tls1"},
652 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
653 static struct parm_struct parm_table[] = {
654 {"Base Options", P_SEP, P_SEPARATOR},
656 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
657 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, handle_client_code_page, NULL, 0},
658 {"code page directory", P_STRING, P_GLOBAL, &Globals.szCodePageDir, NULL, NULL, 0},
659 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
660 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
661 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING},
662 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
663 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC | FLAG_DOS_STRING},
664 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING},
665 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, FLAG_DOS_STRING},
666 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
667 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC},
668 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, 0},
670 {"Security Options", P_SEP, P_SEPARATOR},
672 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC},
673 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC},
674 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
675 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, 0},
676 {"alternate permissions", P_BOOL, P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL | FLAG_DEPRECATED},
677 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
678 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
679 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
680 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
681 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
682 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
683 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
684 {"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, 0},
685 {"passdb module path", P_STRING, P_GLOBAL, &Globals.szPassdbModulePath, NULL, NULL, 0},
686 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
687 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
688 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
690 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
691 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
692 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
693 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
694 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
695 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
696 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
697 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0},
698 {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, 0},
699 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
701 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
702 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
703 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
705 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
706 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
707 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
708 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
709 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
710 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
711 {"printer admin", P_STRING, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
712 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
713 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
714 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
716 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE},
717 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
718 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
719 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
721 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
722 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
723 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
724 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
725 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
726 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
727 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
728 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
729 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
730 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
731 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
732 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
733 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
735 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
736 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
738 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
739 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
740 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
741 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
742 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
745 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
746 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0},
748 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0},
749 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
750 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0},
751 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0},
752 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0},
753 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0},
754 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0},
755 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0},
756 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0},
757 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0},
758 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0},
759 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
760 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0},
761 #endif /* WITH_SSL */
763 {"Logging Options", P_SEP, P_SEPARATOR},
764 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
765 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
766 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
767 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
768 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
770 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
771 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
772 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
773 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
774 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
775 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
777 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT},
779 {"Protocol Options", P_SEP, P_SEPARATOR},
781 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
782 {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
783 {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, 0},
784 {"unicode", P_BOOL, P_GLOBAL, &Globals.bUnicode, NULL, NULL, 0},
785 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
786 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
787 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
789 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
790 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
791 {"nt acl support", P_BOOL, P_GLOBAL, &Globals.bNTAclSupport, NULL, NULL, 0},
792 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
793 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
794 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
795 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
797 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
798 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
799 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
800 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
801 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
802 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
803 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
805 {"Tuning Options", P_SEP, P_SEPARATOR},
807 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
808 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
809 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
810 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
812 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
813 {"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, 0},
814 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
815 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
816 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
817 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
818 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
820 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
821 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
822 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
823 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
824 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
826 {"Printing Options", P_SEP, P_SEPARATOR},
828 {"total print jobs", P_INTEGER, P_GLOBAL, &Globals.iTotalPrintJobs, NULL, NULL, FLAG_PRINT},
829 {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_PRINT},
830 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
831 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
832 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
833 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
834 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
835 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
836 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
837 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
838 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
839 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
840 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
841 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
842 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
843 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
845 {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, 0},
846 {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, 0},
847 {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, 0},
848 {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, 0},
850 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT|FLAG_DOS_STRING},
851 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_DOS_STRING},
852 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT},
853 {"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT},
854 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
856 {"Filename Handling", P_SEP, P_SEPARATOR},
857 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
859 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
860 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
861 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
862 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
863 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
864 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
865 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
866 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
867 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
868 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
869 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
870 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
871 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
872 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
873 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
874 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
875 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
876 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
877 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
878 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
880 {"Domain Options", P_SEP, P_SEPARATOR},
882 {"domain groups", P_STRING, P_GLOBAL, &Globals.szDomainGroups, NULL, NULL, 0},
883 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
884 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
885 {"domain admin users", P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL, NULL, 0},
886 {"domain guest users", P_STRING, P_GLOBAL, &Globals.szDomainGuestUsers, NULL, NULL, 0},
887 #ifdef USING_GROUPNAME_MAP
889 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
890 #endif /* USING_GROUPNAME_MAP */
892 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
894 {"Logon Options", P_SEP, P_SEPARATOR},
896 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
897 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
898 {"add group script", P_STRING, P_GLOBAL, &Globals.szAddGroupScript, NULL, NULL, 0},
899 {"delete group script", P_STRING, P_GLOBAL, &Globals.szDelGroupScript, NULL, NULL, 0},
900 {"add user to group script", P_STRING, P_GLOBAL, &Globals.szAddUserToGroupScript, NULL, NULL, 0},
901 {"delete user from group script", P_STRING, P_GLOBAL, &Globals.szDelUserToGroupScript, NULL, NULL, 0},
903 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
904 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
905 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
906 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
907 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
909 {"Browse Options", P_SEP, P_SEPARATOR},
911 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
912 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, 0},
913 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
914 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
915 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
916 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
917 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
918 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
919 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
920 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
921 {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL},
923 {"WINS Options", P_SEP, P_SEPARATOR},
924 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
925 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
927 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, handle_wins_server_list, NULL, FLAG_BASIC},
928 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
929 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
931 {"Locking Options", P_SEP, P_SEPARATOR},
933 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
934 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
935 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
936 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
938 {"utmp", P_BOOL, P_LOCAL, &sDefault.bUtmp, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
941 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
942 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
943 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
944 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
945 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
946 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
947 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
950 {"Ldap Options", P_SEP, P_SEPARATOR},
952 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
953 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
954 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
955 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0},
956 {"ldap root", P_STRING, P_GLOBAL, &Globals.szLdapRoot, NULL, NULL, 0},
957 {"ldap root passwd", P_STRING, P_GLOBAL, &Globals.szLdapRootPassword, NULL, NULL, 0},
958 #endif /* WITH_LDAP */
960 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
961 {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
963 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
964 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
965 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
966 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
967 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
969 {"utmp dir", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
970 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
971 {"wtmp dir", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
972 {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
973 {"utmp hostname", P_STRING, P_GLOBAL, &Globals.szUtmpHostname, NULL, NULL, 0},
974 {"utmp consolidate", P_BOOL, P_GLOBAL, &Globals.bUtmpConsolidate, NULL, NULL, 0},
975 #endif /* WITH_UTMP */
977 {"default service", P_STRING, P_GLOBAL,
978 &Globals.szDefaultService, NULL, NULL, 0},
979 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
980 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
981 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
982 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
983 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
984 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0},
985 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
986 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
987 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
988 {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0},
989 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
990 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
992 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
993 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
994 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
995 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
997 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
998 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
999 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1000 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
1001 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1002 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
1003 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE},
1004 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
1005 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
1006 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0},
1007 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1008 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1009 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
1010 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
1011 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
1012 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1013 {"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1014 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1015 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1017 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1018 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
1019 {"hide local users", P_BOOL, P_GLOBAL, &Globals.bHideLocalUsers, NULL,
1022 {"VFS options", P_SEP, P_SEPARATOR},
1024 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, 0},
1025 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, 0},
1028 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
1029 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_GLOBAL},
1031 {"Winbind options", P_SEP, P_SEPARATOR},
1033 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_id, NULL, 0},
1034 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_id, NULL, 0},
1035 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, 0},
1036 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, 0},
1037 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, 0},
1038 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
1040 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
1044 /***************************************************************************
1045 Initialise the sDefault parameter structure for the printer values.
1046 ***************************************************************************/
1047 static void init_printer_values(void)
1049 string_set(&sDefault.szPrinterDriver, "");
1050 string_set(&sDefault.szDriverFile, DRIVERFILE);
1052 /* choose defaults depending on the type of printing */
1053 switch (sDefault.iPrinting)
1059 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1060 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1061 string_set(&sDefault.szPrintcommand,
1067 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1068 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1069 string_set(&sDefault.szPrintcommand,
1071 string_set(&sDefault.szQueuepausecommand,
1073 string_set(&sDefault.szQueueresumecommand,
1075 string_set(&sDefault.szLppausecommand,
1077 string_set(&sDefault.szLpresumecommand,
1078 "lpc release %p %j");
1083 string_set(&sDefault.szLpqcommand, "");
1084 string_set(&sDefault.szLprmcommand, "");
1085 string_set(&sDefault.szPrintcommand, "");
1086 string_set(&sDefault.szLppausecommand, "");
1087 string_set(&sDefault.szLpresumecommand, "");
1088 string_set(&sDefault.szQueuepausecommand, "");
1089 string_set(&sDefault.szQueueresumecommand, "");
1091 string_set(&Globals.szPrintcapname, "cups");
1093 string_set(&sDefault.szLpqcommand,
1094 "/usr/bin/lpstat -o %p");
1095 string_set(&sDefault.szLprmcommand,
1096 "/usr/bin/cancel %p-%j");
1097 string_set(&sDefault.szPrintcommand,
1098 "/usr/bin/lp -d %p %s; rm %s");
1099 string_set(&sDefault.szLppausecommand,
1100 "lp -i %p-%j -H hold");
1101 string_set(&sDefault.szLpresumecommand,
1102 "lp -i %p-%j -H resume");
1103 string_set(&sDefault.szQueuepausecommand,
1104 "/usr/bin/disable %p");
1105 string_set(&sDefault.szQueueresumecommand,
1106 "/usr/bin/enable %p");
1107 string_set(&Globals.szPrintcapname, "lpstat");
1108 #endif /* HAVE_LIBCUPS */
1113 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1114 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1115 string_set(&sDefault.szPrintcommand,
1116 "lp -c -d%p %s; rm %s");
1117 string_set(&sDefault.szQueuepausecommand,
1119 string_set(&sDefault.szQueueresumecommand,
1122 string_set(&sDefault.szLppausecommand,
1123 "lp -i %p-%j -H hold");
1124 string_set(&sDefault.szLpresumecommand,
1125 "lp -i %p-%j -H resume");
1130 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1131 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1132 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1136 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1137 string_set(&sDefault.szLprmcommand,
1138 "qstat -s -j%j -c");
1139 string_set(&sDefault.szPrintcommand,
1140 "lp -d%p -s %s; rm %s");
1141 string_set(&sDefault.szLppausecommand,
1142 "qstat -s -j%j -h");
1143 string_set(&sDefault.szLpresumecommand,
1144 "qstat -s -j%j -r");
1149 string_set(&sDefault.szPrintcommand, "vlp print %p %s");
1150 string_set(&sDefault.szLpqcommand, "vlp lpq %p");
1151 string_set(&sDefault.szLprmcommand, "vlp lprm %p %j");
1152 string_set(&sDefault.szLppausecommand, "vlp lppause %p %j");
1153 string_set(&sDefault.szLpresumecommand, "vlp lpresum %p %j");
1154 string_set(&sDefault.szQueuepausecommand, "vlp queuepause %p");
1155 string_set(&sDefault.szQueueresumecommand, "vlp queueresume %p");
1157 #endif /* DEVELOPER */
1162 /***************************************************************************
1163 Initialise the global parameter structure.
1164 ***************************************************************************/
1165 static void init_globals(void)
1167 static BOOL done_init = False;
1173 memset((void *)&Globals, '\0', sizeof(Globals));
1175 for (i = 0; parm_table[i].label; i++)
1176 if ((parm_table[i].type == P_STRING ||
1177 parm_table[i].type == P_USTRING) &&
1179 string_set(parm_table[i].ptr, "");
1181 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
1182 string_set(&sDefault.fstype, FSTYPE_STRING);
1184 init_printer_values();
1190 DEBUG(3, ("Initialising global parameters\n"));
1192 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
1193 string_set(&Globals.szPrivateDir, PRIVATE_DIR);
1194 string_set(&Globals.szPassdbModulePath, "");
1197 * Allow the default PASSWD_CHAT to be overridden in local.h.
1199 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1200 string_set(&Globals.szWorkGroup, WORKGROUP);
1201 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1202 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1203 string_set(&Globals.szLockDir, LOCKDIR);
1205 string_set(&Globals.szUtmpDir, "");
1206 string_set(&Globals.szWtmpDir, "");
1207 string_set(&Globals.szUtmpHostname, "%m");
1208 Globals.bUtmpConsolidate = False;
1209 #endif /* WITH_UTMP */
1210 string_set(&Globals.szSmbrun, SMBRUN);
1211 string_set(&Globals.szSocketAddress, "0.0.0.0");
1212 pstrcpy(s, "Samba ");
1213 pstrcat(s, VERSION);
1214 string_set(&Globals.szServerString, s);
1215 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1216 DEFAULT_MINOR_VERSION);
1217 string_set(&Globals.szAnnounceVersion, s);
1219 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1221 string_set(&Globals.szLogonDrive, "");
1222 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1223 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1224 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1226 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1227 string_set(&Globals.szCodePageDir, CODEPAGEDIR);
1229 Globals.bLoadPrinters = True;
1230 Globals.bUseRhosts = False;
1231 Globals.max_packet = 65535;
1232 Globals.mangled_stack = 50;
1233 Globals.max_xmit = 65535;
1234 Globals.max_mux = 50; /* This is *needed* for profile support. */
1235 Globals.lpqcachetime = 10;
1236 Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1237 Globals.iTotalPrintJobs = 0; /* no limit specified */
1238 Globals.pwordlevel = 0;
1239 Globals.unamelevel = 0;
1240 Globals.deadtime = 0;
1241 Globals.max_log_size = 5000;
1242 Globals.max_open_files = MAX_OPEN_FILES;
1243 Globals.maxprotocol = PROTOCOL_NT1;
1244 Globals.minprotocol = PROTOCOL_CORE;
1245 Globals.security = SEC_USER;
1246 Globals.bEncryptPasswords = False;
1247 Globals.bUpdateEncrypt = False;
1248 Globals.bReadRaw = True;
1249 Globals.bWriteRaw = True;
1250 Globals.bReadPrediction = False;
1251 Globals.bReadbmpx = False;
1252 Globals.bNullPasswords = False;
1253 Globals.bStripDot = False;
1255 Globals.bSyslogOnly = False;
1256 Globals.bTimestampLogs = True;
1257 Globals.bDebugHiresTimestamp = False;
1258 Globals.bDebugPid = False;
1259 Globals.bDebugUid = False;
1260 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1261 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1262 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1263 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1264 Globals.change_notify_timeout = 60; /* 1 minute default. */
1265 Globals.ReadSize = 16 * 1024;
1266 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1267 Globals.lm_interval = 60;
1268 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1269 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1270 Globals.bUnixRealname = True;
1271 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1272 Globals.bNISHomeMap = False;
1273 #ifdef WITH_NISPLUS_HOME
1274 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1276 string_set(&Globals.szNISHomeMapName, "auto.home");
1279 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1280 Globals.bTimeServer = False;
1281 Globals.bBindInterfacesOnly = False;
1282 Globals.bUnixPasswdSync = False;
1283 Globals.bPasswdChatDebug = False;
1284 Globals.bUnicode = True; /* Do unicode on the wire by default */
1285 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
1286 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1287 Globals.bNTAclSupport = True; /* Use NT ACLs by default. */
1288 Globals.bStatCache = True; /* use stat cache by default */
1289 Globals.bRestrictAnonymous = False;
1290 Globals.bLanmanAuth = True; /* Do use the LanMan hash if it is available */
1291 Globals.map_to_guest = 0; /* By Default, "Never" */
1292 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1293 Globals.oplock_break_wait_time = 0; /* By Default, 0 msecs. */
1294 Globals.enhanced_browsing = True;
1297 /* default values for ldap */
1298 string_set(&Globals.szLdapServer, "localhost");
1299 Globals.ldap_port = 389;
1300 #endif /* WITH_LDAP */
1303 Globals.sslVersion = SMB_SSL_V23;
1304 string_set(&Globals.sslHostsRequire, "");
1305 string_set(&Globals.sslHostsResign, "");
1306 string_set(&Globals.sslCaCertDir, "");
1307 string_set(&Globals.sslCaCertFile, "");
1308 string_set(&Globals.sslCert, "");
1309 string_set(&Globals.sslPrivKey, "");
1310 string_set(&Globals.sslClientCert, "");
1311 string_set(&Globals.sslClientPrivKey, "");
1312 string_set(&Globals.sslCiphers, "");
1313 Globals.sslEnabled = False;
1314 Globals.sslReqClientCert = False;
1315 Globals.sslReqServerCert = False;
1316 Globals.sslCompatibility = False;
1317 #endif /* WITH_SSL */
1319 /* these parameters are set to defaults that are more appropriate
1320 for the increasing samba install base:
1322 as a member of the workgroup, that will possibly become a
1323 _local_ master browser (lm = True). this is opposed to a forced
1324 local master browser startup (pm = True).
1326 doesn't provide WINS server service by default (wsupp = False),
1327 and doesn't provide domain master browser services by default, either.
1331 Globals.bMsAddPrinterWizard = True;
1332 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1333 Globals.os_level = 20;
1334 Globals.bLocalMaster = True;
1335 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1336 Globals.bDomainLogons = False;
1337 Globals.bBrowseList = True;
1338 Globals.bWINSsupport = False;
1339 Globals.bWINSproxy = False;
1341 Globals.bDNSproxy = True;
1343 /* this just means to use them if they exist */
1344 Globals.bKernelOplocks = True;
1346 Globals.bAllowTrustedDomains = True;
1348 string_set(&Globals.szTemplateShell, "/bin/false");
1349 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1350 string_set(&Globals.szWinbindSeparator, "\\");
1351 Globals.winbind_cache_time = 15;
1354 * This must be done last as it checks the value in
1358 interpret_coding_system(KANJI);
1361 static TALLOC_CTX *lp_talloc;
1363 /******************************************************************* a
1364 free up temporary memory - called from the main loop
1365 ********************************************************************/
1366 void lp_talloc_free(void)
1370 talloc_destroy(lp_talloc);
1374 /*******************************************************************
1375 convenience routine to grab string parameters into temporary memory
1376 and run standard_sub_basic on them. The buffers can be written to by
1377 callers without affecting the source string.
1378 ********************************************************************/
1379 static char *lp_string(const char *s)
1381 size_t len = s ? strlen(s) : 0;
1385 lp_talloc = talloc_init();
1387 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1395 StrnCpy(ret, s, len);
1397 trim_string(ret, "\"", "\"");
1399 standard_sub_basic(ret);
1405 In this section all the functions that are used to access the
1406 parameters from the rest of the program are defined
1409 #define FN_GLOBAL_STRING(fn_name,ptr) \
1410 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1411 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1412 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1413 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1414 char fn_name(void) {return(*(char *)(ptr));}
1415 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1416 int fn_name(void) {return(*(int *)(ptr));}
1418 #define FN_LOCAL_STRING(fn_name,val) \
1419 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1420 #define FN_LOCAL_BOOL(fn_name,val) \
1421 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1422 #define FN_LOCAL_CHAR(fn_name,val) \
1423 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1424 #define FN_LOCAL_INTEGER(fn_name,val) \
1425 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1427 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1428 FN_GLOBAL_STRING(lp_smbrun, &Globals.szSmbrun)
1429 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1430 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1431 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
1432 FN_GLOBAL_STRING(lp_passdb_module_path, &Globals.szPassdbModulePath)
1433 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1434 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1435 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1436 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1437 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1438 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1440 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1441 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1442 FN_GLOBAL_STRING(lp_utmp_hostname, &Globals.szUtmpHostname)
1443 FN_GLOBAL_BOOL(lp_utmp_consolidate, &Globals.bUtmpConsolidate)
1444 #endif /* WITH_UTMP */
1445 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1446 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1447 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1448 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1449 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1450 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1451 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1452 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1453 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1454 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1455 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1456 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1457 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1458 #ifdef USING_GROUPNAME_MAP
1459 FN_GLOBAL_STRING(lp_groupname_map, &Globals.szGroupnameMap)
1460 #endif /* USING_GROUPNAME_MAP */
1461 FN_GLOBAL_STRING(lp_logon_script, &Globals.szLogonScript)
1462 FN_GLOBAL_STRING(lp_logon_path, &Globals.szLogonPath)
1463 FN_GLOBAL_STRING(lp_logon_drive, &Globals.szLogonDrive)
1464 FN_GLOBAL_STRING(lp_logon_home, &Globals.szLogonHome)
1465 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1466 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1467 FN_GLOBAL_STRING(lp_wins_server, &Globals.szWINSserver)
1468 FN_GLOBAL_STRING(lp_interfaces, &Globals.szInterfaces)
1469 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1470 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1471 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1472 FN_GLOBAL_STRING(lp_netbios_aliases, &Globals.szNetbiosAliases)
1473 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1474 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1475 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1477 FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
1478 FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
1479 FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
1480 FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserToGroupScript)
1482 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1483 FN_GLOBAL_STRING(lp_domain_groups, &Globals.szDomainGroups)
1484 FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
1485 FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
1486 FN_GLOBAL_STRING(lp_domain_admin_users, &Globals.szDomainAdminUsers)
1487 FN_GLOBAL_STRING(lp_domain_guest_users, &Globals.szDomainGuestUsers)
1488 FN_GLOBAL_STRING(lp_winbind_uid, &Globals.szWinbindUID)
1489 FN_GLOBAL_STRING(lp_winbind_gid, &Globals.szWinbindGID)
1490 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1491 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1492 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1493 FN_GLOBAL_STRING(lp_codepagedir,&Globals.szCodePageDir)
1495 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer);
1496 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix);
1497 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter);
1498 FN_GLOBAL_STRING(lp_ldap_root, &Globals.szLdapRoot);
1499 FN_GLOBAL_STRING(lp_ldap_rootpasswd, &Globals.szLdapRootPassword);
1500 #endif /* WITH_LDAP */
1503 FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion);
1504 FN_GLOBAL_STRING(lp_ssl_hosts, &Globals.sslHostsRequire);
1505 FN_GLOBAL_STRING(lp_ssl_hosts_resign, &Globals.sslHostsResign);
1506 FN_GLOBAL_STRING(lp_ssl_cacertdir, &Globals.sslCaCertDir);
1507 FN_GLOBAL_STRING(lp_ssl_cacertfile, &Globals.sslCaCertFile);
1508 FN_GLOBAL_STRING(lp_ssl_cert, &Globals.sslCert);
1509 FN_GLOBAL_STRING(lp_ssl_privkey, &Globals.sslPrivKey);
1510 FN_GLOBAL_STRING(lp_ssl_client_cert, &Globals.sslClientCert);
1511 FN_GLOBAL_STRING(lp_ssl_client_privkey, &Globals.sslClientPrivKey);
1512 FN_GLOBAL_STRING(lp_ssl_ciphers, &Globals.sslCiphers);
1513 FN_GLOBAL_BOOL(lp_ssl_enabled, &Globals.sslEnabled);
1514 FN_GLOBAL_BOOL(lp_ssl_reqClientCert, &Globals.sslReqClientCert);
1515 FN_GLOBAL_BOOL(lp_ssl_reqServerCert, &Globals.sslReqServerCert);
1516 FN_GLOBAL_BOOL(lp_ssl_compatibility, &Globals.sslCompatibility);
1517 #endif /* WITH_SSL */
1519 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1520 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1521 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1522 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1523 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1524 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1525 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1526 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1527 FN_GLOBAL_BOOL(lp_use_rhosts, &Globals.bUseRhosts)
1528 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1529 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1530 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1531 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1532 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1533 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1534 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1535 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1536 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1537 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1538 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1539 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1540 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1541 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1542 FN_GLOBAL_BOOL(lp_unix_realname, &Globals.bUnixRealname)
1543 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1544 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1545 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1546 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1547 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1548 FN_GLOBAL_BOOL(lp_nt_smb_support, &Globals.bNTSmbSupport)
1549 FN_GLOBAL_BOOL(lp_unicode, &Globals.bUnicode)
1550 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1551 FN_GLOBAL_BOOL(lp_nt_acl_support, &Globals.bNTAclSupport)
1552 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1553 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1554 FN_GLOBAL_BOOL(lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1555 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1556 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1557 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1558 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1559 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1560 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1561 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1562 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1563 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1564 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1565 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1566 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1567 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1568 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1569 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1570 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1571 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1572 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1573 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1574 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1575 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1576 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
1577 FN_GLOBAL_INTEGER(lp_totalprintjobs, &Globals.iTotalPrintJobs)
1578 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1579 FN_GLOBAL_INTEGER(lp_client_code_page, &Globals.client_code_page)
1580 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1581 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1582 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1583 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1584 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1585 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1586 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1587 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1588 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1590 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1591 #endif /* WITH_LDAP */
1592 FN_LOCAL_STRING(lp_preexec, szPreExec)
1593 FN_LOCAL_STRING(lp_postexec, szPostExec)
1594 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1595 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1596 FN_LOCAL_STRING(lp_servicename, szService)
1597 FN_LOCAL_STRING(lp_pathname, szPath)
1598 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1599 FN_LOCAL_STRING(lp_username, szUsername)
1600 FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
1601 FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
1602 FN_LOCAL_STRING(lp_valid_users, szValidUsers)
1603 FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
1604 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1605 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1606 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1607 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1608 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1609 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1610 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1611 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1612 FN_LOCAL_STRING(lp_driverfile, szDriverFile)
1613 FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)
1614 FN_LOCAL_STRING(lp_hostsallow, szHostsallow)
1615 FN_LOCAL_STRING(lp_hostsdeny, szHostsdeny)
1616 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1617 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1618 FN_LOCAL_STRING(lp_comment, comment)
1619 FN_LOCAL_STRING(lp_force_user, force_user)
1620 FN_LOCAL_STRING(lp_force_group, force_group)
1621 FN_LOCAL_STRING(lp_readlist, readlist)
1622 FN_LOCAL_STRING(lp_writelist, writelist)
1623 FN_LOCAL_STRING(lp_printer_admin, printer_admin)
1624 FN_LOCAL_STRING(lp_fstype, fstype)
1625 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1626 static FN_LOCAL_STRING(lp_volume, volume)
1627 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1628 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1629 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1630 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1631 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
1632 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1633 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1634 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1635 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1636 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1637 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1638 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1639 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1640 FN_LOCAL_BOOL(lp_status, status)
1641 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1642 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1643 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1644 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1645 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1646 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1647 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1648 FN_LOCAL_BOOL(lp_postscript, bPostscript)
1649 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1650 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1651 FN_LOCAL_BOOL(lp_locking, bLocking)
1652 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1653 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1655 FN_LOCAL_BOOL(lp_utmp, bUtmp)
1657 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1658 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1659 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1660 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1661 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1662 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1663 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1664 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1665 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1666 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1667 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1668 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1669 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1670 FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
1671 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1672 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1673 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1674 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1675 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1676 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1677 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1678 FN_LOCAL_INTEGER(_lp_security_mask, iSecurity_mask)
1679 FN_LOCAL_INTEGER(_lp_force_security_mode, iSecurity_force_mode)
1680 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1681 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1682 FN_LOCAL_INTEGER(_lp_dir_security_mask, iDir_Security_mask)
1683 FN_LOCAL_INTEGER(_lp_force_dir_security_mode, iDir_Security_force_mode)
1684 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1685 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1686 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1687 FN_LOCAL_INTEGER(lp_maxprintjobs, iMaxPrintJobs)
1688 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1689 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1690 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1691 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1692 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1693 FN_GLOBAL_BOOL(lp_hide_local_users, &Globals.bHideLocalUsers)
1695 /* local prototypes */
1697 static int map_parameter(char *pszParmName);
1698 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1699 static int getservicebyname(char *pszServiceName,
1700 service * pserviceDest);
1701 static void copy_service(service * pserviceDest,
1702 service * pserviceSource, BOOL *pcopymapDest);
1703 static BOOL service_ok(int iService);
1704 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1705 static BOOL do_section(char *pszSectionName);
1706 static void init_copymap(service * pservice);
1709 /***************************************************************************
1710 initialise a service to the defaults
1711 ***************************************************************************/
1712 static void init_service(service * pservice)
1714 memset((char *)pservice, '\0', sizeof(service));
1715 copy_service(pservice, &sDefault, NULL);
1719 /***************************************************************************
1720 free the dynamically allocated parts of a service struct
1721 ***************************************************************************/
1722 static void free_service(service * pservice)
1728 if (pservice->szService)
1730 ("free_service: Freeing service %s\n",
1731 pservice->szService));
1733 string_free(&pservice->szService);
1734 if (pservice->copymap)
1736 free(pservice->copymap);
1737 pservice->copymap = NULL;
1740 for (i = 0; parm_table[i].label; i++)
1741 if ((parm_table[i].type == P_STRING ||
1742 parm_table[i].type == P_USTRING) &&
1743 parm_table[i].class == P_LOCAL)
1744 string_free((char **)
1745 (((char *)pservice) +
1746 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1749 /***************************************************************************
1750 add a new service to the services array initialising it with the given
1751 service. name must be in DOS codepage.
1752 ***************************************************************************/
1753 static int add_a_service(service * pservice, char *name)
1757 int num_to_alloc = iNumServices + 1;
1759 tservice = *pservice;
1761 /* it might already exist */
1764 i = getservicebyname(name, NULL);
1769 /* find an invalid one */
1770 for (i = 0; i < iNumServices; i++)
1771 if (!pSERVICE(i)->valid)
1774 /* if not, then create one */
1775 if (i == iNumServices)
1778 (service **) Realloc(ServicePtrs,
1782 pSERVICE(iNumServices) =
1783 (service *) malloc(sizeof(service));
1785 if (!ServicePtrs || !pSERVICE(iNumServices))
1791 free_service(pSERVICE(i));
1793 pSERVICE(i)->valid = True;
1795 init_service(pSERVICE(i));
1796 copy_service(pSERVICE(i), &tservice, NULL);
1799 string_set(&iSERVICE(i).szService, name);
1804 /***************************************************************************
1805 add a new home service, with the specified home directory, defaults coming
1806 from service ifrom. homename must be in DOS codepage.
1807 ***************************************************************************/
1808 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1810 int i = add_a_service(pSERVICE(iDefaultService), pszHomename);
1815 if (!(*(iSERVICE(i).szPath))
1816 || strequal(iSERVICE(i).szPath, lp_pathname(-1)))
1817 string_set(&iSERVICE(i).szPath, pszHomedir);
1818 if (!(*(iSERVICE(i).comment)))
1821 slprintf(comment, sizeof(comment) - 1,
1822 "Home directory of %s", pszHomename);
1823 string_set(&iSERVICE(i).comment, comment);
1825 iSERVICE(i).bAvailable = sDefault.bAvailable;
1826 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1829 ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1834 /***************************************************************************
1835 add a new service, based on an old one. pszService must be in DOS codepage.
1836 ***************************************************************************/
1837 int lp_add_service(char *pszService, int iDefaultService)
1839 return (add_a_service(pSERVICE(iDefaultService), pszService));
1843 /***************************************************************************
1845 ***************************************************************************/
1846 static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok)
1849 int i = add_a_service(&sDefault, ipc_name);
1854 slprintf(comment, sizeof(comment) - 1,
1855 "IPC Service (%s)", Globals.szServerString);
1857 string_set(&iSERVICE(i).szPath, tmpdir());
1858 string_set(&iSERVICE(i).szUsername, "");
1859 string_set(&iSERVICE(i).comment, comment);
1860 string_set(&iSERVICE(i).fstype, "IPC");
1861 iSERVICE(i).status = False;
1862 iSERVICE(i).iMaxConnections = 0;
1863 iSERVICE(i).bAvailable = True;
1864 iSERVICE(i).bRead_only = True;
1865 iSERVICE(i).bGuest_only = False;
1866 iSERVICE(i).bGuest_ok = guest_ok;
1867 iSERVICE(i).bPrint_ok = False;
1868 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1870 DEBUG(3, ("adding IPC service\n"));
1876 /***************************************************************************
1877 add a new printer service, with defaults coming from service iFrom.
1878 printername must be in DOS codepage.
1879 ***************************************************************************/
1880 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
1882 char *comment = "From Printcap";
1883 int i = add_a_service(pSERVICE(iDefaultService), pszPrintername);
1888 /* note that we do NOT default the availability flag to True - */
1889 /* we take it from the default service passed. This allows all */
1890 /* dynamic printers to be disabled by disabling the [printers] */
1891 /* entry (if/when the 'available' keyword is implemented!). */
1893 /* the printer name is set to the service name. */
1894 string_set(&iSERVICE(i).szPrintername, pszPrintername);
1895 string_set(&iSERVICE(i).comment, comment);
1896 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1897 /* Printers cannot be read_only. */
1898 iSERVICE(i).bRead_only = False;
1899 /* No share modes on printer services. */
1900 iSERVICE(i).bShareModes = False;
1901 /* No oplocks on printer services. */
1902 iSERVICE(i).bOpLocks = False;
1903 /* Printer services must be printable. */
1904 iSERVICE(i).bPrint_ok = True;
1906 DEBUG(3, ("adding printer service %s\n", pszPrintername));
1911 /***************************************************************************
1912 Map a parameter's string representation to something we can use.
1913 Returns False if the parameter string is not recognised, else TRUE.
1914 ***************************************************************************/
1915 static int map_parameter(char *pszParmName)
1919 if (*pszParmName == '-')
1922 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1923 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1926 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
1931 /***************************************************************************
1932 Set a boolean variable from the text value stored in the passed string.
1933 Returns True in success, False if the passed string does not correctly
1934 represent a boolean.
1935 ***************************************************************************/
1936 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
1941 if (strwicmp(pszParmValue, "yes") == 0 ||
1942 strwicmp(pszParmValue, "true") == 0 ||
1943 strwicmp(pszParmValue, "1") == 0)
1946 if (strwicmp(pszParmValue, "no") == 0 ||
1947 strwicmp(pszParmValue, "False") == 0 ||
1948 strwicmp(pszParmValue, "0") == 0)
1953 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1960 /***************************************************************************
1961 Find a service by name. Otherwise works like get_service.
1962 ***************************************************************************/
1963 static int getservicebyname(char *pszServiceName, service * pserviceDest)
1967 for (iService = iNumServices - 1; iService >= 0; iService--)
1968 if (VALID(iService) &&
1969 strwicmp(iSERVICE(iService).szService,
1970 pszServiceName) == 0)
1972 if (pserviceDest != NULL)
1973 copy_service(pserviceDest, pSERVICE(iService),
1983 /***************************************************************************
1984 Copy a service structure to another
1986 If pcopymapDest is NULL then copy all fields
1987 ***************************************************************************/
1988 static void copy_service(service * pserviceDest,
1989 service * pserviceSource, BOOL *pcopymapDest)
1992 BOOL bcopyall = (pcopymapDest == NULL);
1994 for (i = 0; parm_table[i].label; i++)
1995 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
1996 (bcopyall || pcopymapDest[i]))
1998 void *def_ptr = parm_table[i].ptr;
2000 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
2003 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
2006 switch (parm_table[i].type)
2010 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
2016 *(int *)dest_ptr = *(int *)src_ptr;
2020 *(char *)dest_ptr = *(char *)src_ptr;
2024 string_set(dest_ptr,
2029 string_set(dest_ptr,
2031 strupper(*(char **)dest_ptr);
2040 init_copymap(pserviceDest);
2041 if (pserviceSource->copymap)
2042 memcpy((void *)pserviceDest->copymap,
2043 (void *)pserviceSource->copymap,
2044 sizeof(BOOL) * NUMPARAMETERS);
2048 /***************************************************************************
2049 Check a service for consistency. Return False if the service is in any way
2050 incomplete or faulty, else True.
2051 ***************************************************************************/
2052 static BOOL service_ok(int iService)
2057 if (iSERVICE(iService).szService[0] == '\0')
2060 ("The following message indicates an internal error:\n"));
2061 DEBUG(0, ("No service name in service entry.\n"));
2065 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2066 /* I can't see why you'd want a non-printable printer service... */
2067 if (strwicmp(iSERVICE(iService).szService, PRINTERS_NAME) == 0) {
2068 if (!iSERVICE(iService).bPrint_ok) {
2070 ("WARNING: [%s] service MUST be printable!\n",
2071 iSERVICE(iService).szService));
2072 iSERVICE(iService).bPrint_ok = True;
2074 /* [printers] service must also be non-browsable. */
2075 if (iSERVICE(iService).bBrowseable)
2076 iSERVICE(iService).bBrowseable = False;
2079 if (iSERVICE(iService).szPath[0] == '\0' &&
2080 strwicmp(iSERVICE(iService).szService, HOMES_NAME) != 0)
2083 ("No path in service %s - using %s\n",
2084 iSERVICE(iService).szService, tmpdir()));
2085 string_set(&iSERVICE(iService).szPath, tmpdir());
2088 /* If a service is flagged unavailable, log the fact at level 0. */
2089 if (!iSERVICE(iService).bAvailable)
2090 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2091 iSERVICE(iService).szService));
2096 static struct file_lists
2098 struct file_lists *next;
2104 /*******************************************************************
2105 keep a linked list of all config files so we know when one has changed
2106 it's date and needs to be reloaded
2107 ********************************************************************/
2108 static void add_to_file_list(char *fname)
2110 struct file_lists *f = file_lists;
2114 if (f->name && !strcmp(f->name, fname))
2121 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2124 f->next = file_lists;
2125 f->name = strdup(fname);
2137 standard_sub_basic(n2);
2138 f->modtime = file_modtime(n2);
2143 /*******************************************************************
2144 check if a config file has changed date
2145 ********************************************************************/
2146 BOOL lp_file_list_changed(void)
2148 struct file_lists *f = file_lists;
2149 DEBUG(6, ("lp_file_list_changed()\n"));
2156 pstrcpy(n2, f->name);
2157 standard_sub_basic(n2);
2159 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2160 f->name, n2, ctime(&f->modtime)));
2162 mod_time = file_modtime(n2);
2164 if (f->modtime != mod_time)
2167 ("file %s modified: %s\n", n2,
2169 f->modtime = mod_time;
2177 /***************************************************************************
2178 Run standard_sub_basic on netbios name... needed because global_myname
2179 is not accessed through any lp_ macro.
2180 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2181 ***************************************************************************/
2183 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2185 pstring netbios_name;
2187 pstrcpy(netbios_name, pszParmValue);
2189 standard_sub_basic(netbios_name);
2190 strupper(netbios_name);
2193 * Convert from UNIX to DOS string - the UNIX to DOS converter
2194 * isn't called on the special handlers.
2196 unix_to_dos(netbios_name, True);
2197 pstrcpy(global_myname, netbios_name);
2200 ("handle_netbios_name: set global_myname to: %s\n",
2206 /***************************************************************************
2207 Do the work of sourcing in environment variable/value pairs.
2208 ***************************************************************************/
2210 static BOOL source_env(char **lines)
2217 for (i = 0; lines[i]; i++)
2219 char *line = lines[i];
2221 if ((len = strlen(line)) == 0)
2224 if (line[len - 1] == '\n')
2227 if ((varval = malloc(len + 1)) == NULL)
2229 DEBUG(0, ("source_env: Not enough memory!\n"));
2233 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2234 strncpy(varval, line, len);
2237 p = strchr(line, (int)'=');
2240 DEBUG(4, ("source_env: missing '=': %s\n", line));
2247 ("source_env: Failed to put environment variable %s\n",
2255 ("source_env: getting var %s = %s\n", line,
2259 DEBUG(4, ("source_env: returning successfully\n"));
2263 /***************************************************************************
2264 Handle the source environment operation
2265 ***************************************************************************/
2267 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2274 pstrcpy(fname, pszParmValue);
2276 standard_sub_basic(fname);
2278 string_set(ptr, pszParmValue);
2280 DEBUG(4, ("handle_source_env: checking env type\n"));
2283 * Filename starting with '|' means popen and read from stdin.
2288 lines = file_lines_pload(p + 1, NULL, True);
2292 lines = file_lines_load(fname, NULL, True);
2298 ("handle_source_env: Failed to open file %s, Error was %s\n",
2299 fname, strerror(errno)));
2303 result = source_env(lines);
2304 file_lines_free(lines);
2309 /***************************************************************************
2310 handle the interpretation of the vfs object parameter
2311 *************************************************************************/
2312 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2314 /* Set string value */
2316 string_set(ptr, pszParmValue);
2318 /* Do any other initialisation required for vfs. Note that
2319 anything done here may have linking repercussions in nmbd. */
2324 /***************************************************************************
2325 handle the interpretation of the coding system parameter
2326 *************************************************************************/
2327 static BOOL handle_coding_system(char *pszParmValue, char **ptr)
2329 string_set(ptr, pszParmValue);
2330 interpret_coding_system(pszParmValue);
2334 /***************************************************************************
2335 Handle the interpretation of the character set system parameter.
2336 ***************************************************************************/
2338 static char *saved_character_set = NULL;
2340 static BOOL handle_character_set(char *pszParmValue, char **ptr)
2342 /* A dependency here is that the parameter client code page should be
2343 set before this is called.
2345 string_set(ptr, pszParmValue);
2347 saved_character_set = strdup(*ptr);
2348 interpret_character_set(*ptr, lp_client_code_page());
2352 /***************************************************************************
2353 Handle the interpretation of the client code page parameter.
2354 We handle this separately so that we can reset the character set
2355 parameter in case this came before 'client code page' in the smb.conf.
2356 ***************************************************************************/
2358 static BOOL handle_client_code_page(char *pszParmValue, char **ptr)
2360 Globals.client_code_page = atoi(pszParmValue);
2361 if (saved_character_set != NULL)
2362 interpret_character_set(saved_character_set,
2363 lp_client_code_page());
2364 codepage_initialise(lp_client_code_page());
2368 /***************************************************************************
2369 handle the valid chars lines
2370 ***************************************************************************/
2372 static BOOL handle_valid_chars(char *pszParmValue, char **ptr)
2374 string_set(ptr, pszParmValue);
2376 /* A dependency here is that the parameter client code page must be
2377 set before this is called - as calling codepage_initialise()
2378 would overwrite the valid char lines.
2380 codepage_initialise(lp_client_code_page());
2382 add_char_string(pszParmValue);
2386 /***************************************************************************
2387 handle the include operation
2388 ***************************************************************************/
2390 static BOOL handle_include(char *pszParmValue, char **ptr)
2393 pstrcpy(fname, pszParmValue);
2395 add_to_file_list(fname);
2397 standard_sub_basic(fname);
2399 string_set(ptr, fname);
2401 if (file_exist(fname, NULL))
2402 return (pm_process(fname, do_section, do_parameter));
2404 DEBUG(2, ("Can't find include file %s\n", fname));
2410 /***************************************************************************
2411 handle the interpretation of the copy parameter
2412 ***************************************************************************/
2413 static BOOL handle_copy(char *pszParmValue, char **ptr)
2417 service serviceTemp;
2419 string_set(ptr, pszParmValue);
2421 init_service(&serviceTemp);
2425 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2427 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2429 if (iTemp == iServiceIndex)
2432 ("Can't copy service %s - unable to copy self!\n",
2437 copy_service(pSERVICE(iServiceIndex),
2439 iSERVICE(iServiceIndex).copymap);
2445 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2450 free_service(&serviceTemp);
2454 /***************************************************************************
2455 Handle winbind uid and gid allocation parameters. The format of these
2460 winbind uid = 1000-1999
2461 winbind gid = 700-899
2463 We only do simple parsing checks here. The strings are parsed into useful
2464 structures in the winbind daemon code.
2466 ***************************************************************************/
2468 /* Do some simple checks on "winbind [ug]id" parameter value */
2470 static BOOL handle_winbind_id(char *pszParmValue, char **ptr)
2474 if (sscanf(pszParmValue, "%d-%d", &low, &high) != 2)
2481 string_set(ptr, pszParmValue);
2486 /***************************************************************************
2487 Handle the WINS SERVER list
2488 ***************************************************************************/
2489 static BOOL handle_wins_server_list( char *pszParmValue, char **ptr )
2491 if( !wins_srv_load_list( pszParmValue ) )
2492 return( False ); /* Parse failed. */
2494 string_set( ptr, pszParmValue );
2499 /***************************************************************************
2500 Handle the DEBUG level list
2501 ***************************************************************************/
2502 static BOOL handle_debug_list( char *pszParmValueIn, char **ptr )
2504 pstring pszParmValue;
2506 pstrcpy(pszParmValue, pszParmValueIn);
2507 return debug_parse_levels( pszParmValue );
2511 /***************************************************************************
2512 initialise a copymap
2513 ***************************************************************************/
2514 static void init_copymap(service * pservice)
2517 if (pservice->copymap)
2518 free(pservice->copymap);
2519 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2520 if (!pservice->copymap)
2522 ("Couldn't allocate copymap!! (size %d)\n",
2523 (int)NUMPARAMETERS));
2525 for (i = 0; i < NUMPARAMETERS; i++)
2526 pservice->copymap[i] = True;
2530 /***************************************************************************
2531 return the local pointer to a parameter given the service number and the
2532 pointer into the default structure
2533 ***************************************************************************/
2534 void *lp_local_ptr(int snum, void *ptr)
2536 return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr, &sDefault));
2539 /***************************************************************************
2540 Process a parameter for a particular service number. If snum < 0
2541 then assume we are in the globals
2542 ***************************************************************************/
2543 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2546 void *parm_ptr = NULL; /* where we are going to store the result */
2547 void *def_ptr = NULL;
2549 parmnum = map_parameter(pszParmName);
2554 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2558 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2560 DEBUG(1, ("WARNING: The \"%s\"option is deprecated\n",
2564 def_ptr = parm_table[parmnum].ptr;
2566 /* we might point at a service, the default service or a global */
2573 if (parm_table[parmnum].class == P_GLOBAL)
2576 ("Global parameter %s found in service section!\n",
2581 ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,
2587 if (!iSERVICE(snum).copymap)
2588 init_copymap(pSERVICE(snum));
2590 /* this handles the aliases - set the copymap for other entries with
2591 the same data pointer */
2592 for (i = 0; parm_table[i].label; i++)
2593 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2594 iSERVICE(snum).copymap[i] = False;
2597 /* if it is a special case then go ahead */
2598 if (parm_table[parmnum].special)
2600 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2604 /* now switch on the type of variable it is */
2605 switch (parm_table[parmnum].type)
2608 set_boolean(parm_ptr, pszParmValue);
2612 set_boolean(parm_ptr, pszParmValue);
2613 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2617 *(int *)parm_ptr = atoi(pszParmValue);
2621 *(char *)parm_ptr = *pszParmValue;
2625 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2629 string_set(parm_ptr, pszParmValue);
2630 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2631 unix_to_dos(*(char **)parm_ptr, True);
2635 string_set(parm_ptr, pszParmValue);
2636 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2637 unix_to_dos(*(char **)parm_ptr, True);
2638 strupper(*(char **)parm_ptr);
2642 pstrcpy((char *)parm_ptr, pszParmValue);
2643 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2644 unix_to_dos((char *)parm_ptr, True);
2648 pstrcpy((char *)parm_ptr, pszParmValue);
2649 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2650 unix_to_dos((char *)parm_ptr, True);
2651 strupper((char *)parm_ptr);
2655 for (i = 0; parm_table[parmnum].enum_list[i].name;
2660 parm_table[parmnum].enum_list[i].name))
2663 parm_table[parmnum].
2676 /***************************************************************************
2677 Process a parameter.
2678 ***************************************************************************/
2679 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2681 if (!bInGlobalSection && bGlobalOnly)
2684 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2686 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2687 pszParmName, pszParmValue));
2691 /***************************************************************************
2692 print a parameter of the specified type
2693 ***************************************************************************/
2694 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
2700 for (i = 0; p->enum_list[i].name; i++)
2702 if (*(int *)ptr == p->enum_list[i].value)
2705 p->enum_list[i].name);
2712 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2716 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2720 fprintf(f, "%d", *(int *)ptr);
2724 fprintf(f, "%c", *(char *)ptr);
2728 fprintf(f, "%s", octal_string(*(int *)ptr));
2734 fprintf(f, "%s", (char *)ptr);
2740 fprintf(f, "%s", *(char **)ptr);
2748 /***************************************************************************
2749 check if two parameters are equal
2750 ***************************************************************************/
2751 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2757 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2762 return (*((int *)ptr1) == *((int *)ptr2));
2765 return (*((char *)ptr1) == *((char *)ptr2));
2770 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2775 return (p1 == p2 || strequal(p1, p2));
2780 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2785 return (p1 == p2 || strequal(p1, p2));
2793 /***************************************************************************
2794 Initialize any local varients in the sDefault table.
2795 ***************************************************************************/
2797 void init_locals(void)
2802 /***************************************************************************
2803 Process a new section (service). At this stage all sections are services.
2804 Later we'll have special sections that permit server parameters to be set.
2805 Returns True on success, False on failure. SectionName must be in DOS codepage.
2806 ***************************************************************************/
2807 static BOOL do_section(char *pszSectionName)
2810 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2811 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2814 /* if we were in a global section then do the local inits */
2815 if (bInGlobalSection && !isglobal)
2818 /* if we've just struck a global section, note the fact. */
2819 bInGlobalSection = isglobal;
2821 /* check for multiple global sections */
2822 if (bInGlobalSection)
2824 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
2828 if (!bInGlobalSection && bGlobalOnly)
2831 /* if we have a current service, tidy it up before moving on */
2834 if (iServiceIndex >= 0)
2835 bRetval = service_ok(iServiceIndex);
2837 /* if all is still well, move to the next record in the services array */
2840 /* We put this here to avoid an odd message order if messages are */
2841 /* issued by the post-processing of a previous section. */
2842 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
2844 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
2847 DEBUG(0, ("Failed to add a new service\n"));
2856 /***************************************************************************
2857 determine if a partcular base parameter is currently set to the default value.
2858 ***************************************************************************/
2859 static BOOL is_default(int i)
2861 if (!defaults_saved)
2863 switch (parm_table[i].type)
2867 return strequal(parm_table[i].def.svalue,
2868 *(char **)parm_table[i].ptr);
2871 return strequal(parm_table[i].def.svalue,
2872 (char *)parm_table[i].ptr);
2875 return parm_table[i].def.bvalue ==
2876 *(BOOL *)parm_table[i].ptr;
2878 return parm_table[i].def.cvalue ==
2879 *(char *)parm_table[i].ptr;
2883 return parm_table[i].def.ivalue ==
2884 *(int *)parm_table[i].ptr;
2892 /***************************************************************************
2893 Display the contents of the global structure.
2894 ***************************************************************************/
2895 static void dump_globals(FILE * f)
2898 fprintf(f, "# Global parameters\n[global]\n");
2900 for (i = 0; parm_table[i].label; i++)
2901 if (parm_table[i].class == P_GLOBAL &&
2902 parm_table[i].ptr &&
2903 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2905 if (defaults_saved && is_default(i))
2907 fprintf(f, "\t%s = ", parm_table[i].label);
2908 print_parameter(&parm_table[i], parm_table[i].ptr, f);
2913 /***************************************************************************
2914 return True if a local parameter is currently set to the global default
2915 ***************************************************************************/
2916 BOOL lp_is_default(int snum, struct parm_struct *parm)
2918 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
2920 return equal_parameter(parm->type,
2921 ((char *)pSERVICE(snum)) + pdiff,
2922 ((char *)&sDefault) + pdiff);
2926 /***************************************************************************
2927 Display the contents of a single services record.
2928 ***************************************************************************/
2929 static void dump_a_service(service * pService, FILE * f)
2932 if (pService != &sDefault)
2933 fprintf(f, "\n[%s]\n", pService->szService);
2935 for (i = 0; parm_table[i].label; i++)
2936 if (parm_table[i].class == P_LOCAL &&
2937 parm_table[i].ptr &&
2938 (*parm_table[i].label != '-') &&
2939 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2941 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
2943 if (pService == &sDefault)
2945 if (defaults_saved && is_default(i))
2950 if (equal_parameter(parm_table[i].type,
2951 ((char *)pService) +
2953 ((char *)&sDefault) +
2958 fprintf(f, "\t%s = ", parm_table[i].label);
2959 print_parameter(&parm_table[i],
2960 ((char *)pService) + pdiff, f);
2966 /***************************************************************************
2967 return info about the next service in a service. snum==-1 gives the globals
2969 return NULL when out of parameters
2970 ***************************************************************************/
2971 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
2975 /* do the globals */
2976 for (; parm_table[*i].label; (*i)++)
2978 if (parm_table[*i].class == P_SEPARATOR)
2979 return &parm_table[(*i)++];
2981 if (!parm_table[*i].ptr
2982 || (*parm_table[*i].label == '-'))
2986 && (parm_table[*i].ptr ==
2987 parm_table[(*i) - 1].ptr))
2990 return &parm_table[(*i)++];
2995 service *pService = pSERVICE(snum);
2997 for (; parm_table[*i].label; (*i)++)
2999 if (parm_table[*i].class == P_SEPARATOR)
3000 return &parm_table[(*i)++];
3002 if (parm_table[*i].class == P_LOCAL &&
3003 parm_table[*i].ptr &&
3004 (*parm_table[*i].label != '-') &&
3006 (parm_table[*i].ptr !=
3007 parm_table[(*i) - 1].ptr)))
3010 PTR_DIFF(parm_table[*i].ptr,
3013 if (allparameters ||
3014 !equal_parameter(parm_table[*i].type,
3015 ((char *)pService) +
3017 ((char *)&sDefault) +
3020 return &parm_table[(*i)++];
3031 /***************************************************************************
3032 Display the contents of a single copy structure.
3033 ***************************************************************************/
3034 static void dump_copy_map(BOOL *pcopymap)
3040 printf("\n\tNon-Copied parameters:\n");
3042 for (i = 0; parm_table[i].label; i++)
3043 if (parm_table[i].class == P_LOCAL &&
3044 parm_table[i].ptr && !pcopymap[i] &&
3045 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3047 printf("\t\t%s\n", parm_table[i].label);
3052 /***************************************************************************
3053 Return TRUE if the passed service number is within range.
3054 ***************************************************************************/
3055 BOOL lp_snum_ok(int iService)
3057 return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
3061 /***************************************************************************
3062 auto-load some home services
3063 ***************************************************************************/
3064 static void lp_add_auto_services(char *str)
3077 homes = lp_servicenumber(HOMES_NAME);
3079 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP))
3081 char *home = get_user_home_dir(p);
3083 if (lp_servicenumber(p) >= 0)
3086 if (home && homes >= 0)
3088 lp_add_home(p, homes, home);
3094 /***************************************************************************
3095 auto-load one printer
3096 ***************************************************************************/
3097 void lp_add_one_printer(char *name, char *comment)
3099 int printers = lp_servicenumber(PRINTERS_NAME);
3102 if (lp_servicenumber(name) < 0)
3104 lp_add_printer(name, printers);
3105 if ((i = lp_servicenumber(name)) >= 0)
3107 string_set(&iSERVICE(i).comment, comment);
3108 unix_to_dos(iSERVICE(i).comment, True);
3109 iSERVICE(i).autoloaded = True;
3114 /***************************************************************************
3115 have we loaded a services file yet?
3116 ***************************************************************************/
3117 BOOL lp_loaded(void)
3122 /***************************************************************************
3123 unload unused services
3124 ***************************************************************************/
3125 void lp_killunused(BOOL (*snumused) (int))
3128 for (i = 0; i < iNumServices; i++)
3133 if (!snumused || !snumused(i))
3135 iSERVICE(i).valid = False;
3136 free_service(pSERVICE(i));
3142 /***************************************************************************
3144 ***************************************************************************/
3145 void lp_killservice(int iServiceIn)
3147 if (VALID(iServiceIn))
3149 iSERVICE(iServiceIn).valid = False;
3150 free_service(pSERVICE(iServiceIn));
3154 /***************************************************************************
3155 save the curent values of all global and sDefault parameters into the
3156 defaults union. This allows swat and testparm to show only the
3157 changed (ie. non-default) parameters.
3158 ***************************************************************************/
3159 static void lp_save_defaults(void)
3162 for (i = 0; parm_table[i].label; i++)
3164 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3166 switch (parm_table[i].type)
3170 parm_table[i].def.svalue =
3171 strdup(*(char **)parm_table[i].ptr);
3175 parm_table[i].def.svalue =
3176 strdup((char *)parm_table[i].ptr);
3180 parm_table[i].def.bvalue =
3181 *(BOOL *)parm_table[i].ptr;
3184 parm_table[i].def.cvalue =
3185 *(char *)parm_table[i].ptr;
3190 parm_table[i].def.ivalue =
3191 *(int *)parm_table[i].ptr;
3197 defaults_saved = True;
3200 /*******************************************************************
3201 Set the server type we will announce as via nmbd.
3202 ********************************************************************/
3203 static void set_server_role(void)
3205 server_role = ROLE_STANDALONE;
3207 switch (lp_security())
3211 if (lp_domain_logons())
3214 ("Server's Role (logon server) conflicts with share-level security\n"));
3221 if (lp_domain_logons())
3223 server_role = ROLE_DOMAIN_BDC;
3226 server_role = ROLE_DOMAIN_MEMBER;
3231 if (lp_domain_logons())
3233 server_role = ROLE_DOMAIN_PDC;
3241 ("Server's Role undefined due to unknown security mode\n"));
3247 /***************************************************************************
3248 Load the services array from the services file. Return True on success,
3250 ***************************************************************************/
3251 BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults,
3257 add_to_file_list(pszFname);
3261 bInGlobalSection = True;
3262 bGlobalOnly = global_only;
3272 pstrcpy(n2, pszFname);
3273 standard_sub_basic(n2);
3275 /* We get sections first, so have to start 'behind' to make up */
3277 bRetval = pm_process(n2, do_section, do_parameter);
3279 /* finish up the last section */
3280 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3282 if (iServiceIndex >= 0)
3283 bRetval = service_ok(iServiceIndex);
3285 lp_add_auto_services(lp_auto_services());
3288 lp_add_ipc("IPC$", True);
3289 lp_add_ipc("ADMIN$", False);
3293 set_default_server_announce_type();
3297 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3298 /* if bWINSsupport is true and we are in the client */
3300 if (in_client && Globals.bWINSsupport)
3303 string_set(&Globals.szWINSserver, "127.0.0.1");
3311 /***************************************************************************
3312 reset the max number of services
3313 ***************************************************************************/
3314 void lp_resetnumservices(void)
3319 /***************************************************************************
3320 return the max number of services
3321 ***************************************************************************/
3322 int lp_numservices(void)
3324 return (iNumServices);
3327 /***************************************************************************
3328 Display the contents of the services array in human-readable form.
3329 ***************************************************************************/
3330 void lp_dump(FILE * f, BOOL show_defaults, int maxtoprint)
3336 defaults_saved = False;
3341 dump_a_service(&sDefault, f);
3343 for (iService = 0; iService < maxtoprint; iService++)
3344 lp_dump_one(f, show_defaults, iService);
3347 /***************************************************************************
3348 Display the contents of one service in human-readable form.
3349 ***************************************************************************/
3350 void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
3354 if (iSERVICE(snum).szService[0] == '\0')
3356 dump_a_service(pSERVICE(snum), f);
3361 /***************************************************************************
3362 Return the number of the service with the given name, or -1 if it doesn't
3363 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3364 getservicebyname()! This works ONLY if all services have been loaded, and
3365 does not copy the found service.
3366 ***************************************************************************/
3367 int lp_servicenumber(char *pszServiceName)
3371 for (iService = iNumServices - 1; iService >= 0; iService--)
3372 if (VALID(iService) &&
3373 strequal(lp_servicename(iService), pszServiceName))
3378 ("lp_servicenumber: couldn't find %s\n",
3384 /*******************************************************************
3385 a useful volume label function
3386 ******************************************************************/
3387 char *volume_label(int snum)
3389 char *ret = lp_volume(snum);
3391 /* lp_volume returns a unix charset - lp_servicename returns a
3392 dos codepage - convert so volume_label() always returns UNIX.
3394 char *p = dos_to_unix(lp_servicename(snum), False);
3395 int len = strlen(p)+1;
3396 ret = (char *)talloc(lp_talloc, len);
3397 memcpy(ret, p, len);
3403 /*******************************************************************
3404 Set the server type we will announce as via nmbd.
3405 ********************************************************************/
3406 static void set_default_server_announce_type(void)
3408 default_server_announce = 0;
3409 default_server_announce |= SV_TYPE_WORKSTATION;
3410 default_server_announce |= SV_TYPE_SERVER;
3411 default_server_announce |= SV_TYPE_SERVER_UNIX;
3412 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3414 switch (lp_announce_as())
3416 case ANNOUNCE_AS_NT_SERVER:
3418 default_server_announce |= SV_TYPE_SERVER_NT;
3419 /* fall through... */
3421 case ANNOUNCE_AS_NT_WORKSTATION:
3423 default_server_announce |= SV_TYPE_NT;
3426 case ANNOUNCE_AS_WIN95:
3428 default_server_announce |= SV_TYPE_WIN95_PLUS;
3431 case ANNOUNCE_AS_WFW:
3433 default_server_announce |= SV_TYPE_WFW;
3442 switch (lp_server_role())
3444 case ROLE_DOMAIN_MEMBER:
3446 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3449 case ROLE_DOMAIN_PDC:
3451 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3454 case ROLE_DOMAIN_BDC:
3456 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3459 case ROLE_STANDALONE:
3466 if (lp_time_server())
3468 default_server_announce |= SV_TYPE_TIME_SOURCE;
3471 if (lp_host_msdfs())
3473 default_server_announce |= SV_TYPE_DFS_SERVER;
3477 /***********************************************************
3478 returns role of Samba server
3479 ************************************************************/
3481 int lp_server_role(void)
3486 /***********************************************************
3487 If we are PDC then prefer us as DMB
3488 ************************************************************/
3490 BOOL lp_domain_master(void)
3492 if (Globals.bDomainMaster == Auto)
3494 return (lp_server_role() == ROLE_DOMAIN_PDC);
3497 return Globals.bDomainMaster;
3500 /***********************************************************
3501 If we are DMB then prefer us as LMB
3502 ************************************************************/
3504 BOOL lp_preferred_master(void)
3506 if (Globals.bPreferredMaster == Auto)
3508 return (lp_local_master() && lp_domain_master());
3511 return Globals.bPreferredMaster;
3516 /*******************************************************************
3518 ********************************************************************/
3519 void lp_remove_service(int snum)
3521 pSERVICE(snum)->valid = False;
3524 /*******************************************************************
3525 copy a service. new_name must be in dos codepage
3526 ********************************************************************/
3527 void lp_copy_service(int snum, char *new_name)
3529 char *oldname = lp_servicename(snum);
3530 do_section(new_name);
3533 snum = lp_servicenumber(new_name);
3535 lp_do_parameter(snum, "copy", oldname);
3540 /*******************************************************************
3541 Get the default server type we will announce as via nmbd.
3542 ********************************************************************/
3543 int lp_default_server_announce(void)
3545 return default_server_announce;
3548 /*******************************************************************
3549 Split the announce version into major and minor numbers.
3550 ********************************************************************/
3551 int lp_major_announce_version(void)
3553 static BOOL got_major = False;
3554 static int major_version = DEFAULT_MAJOR_VERSION;
3559 return major_version;
3562 if ((vers = lp_announce_version()) == NULL)
3563 return major_version;
3565 if ((p = strchr(vers, '.')) == 0)
3566 return major_version;
3569 major_version = atoi(vers);
3570 return major_version;
3573 int lp_minor_announce_version(void)
3575 static BOOL got_minor = False;
3576 static int minor_version = DEFAULT_MINOR_VERSION;
3581 return minor_version;
3584 if ((vers = lp_announce_version()) == NULL)
3585 return minor_version;
3587 if ((p = strchr(vers, '.')) == 0)
3588 return minor_version;
3591 minor_version = atoi(p);
3592 return minor_version;
3595 /***********************************************************
3596 Set the global name resolution order (used in smbclient).
3597 ************************************************************/
3599 void lp_set_name_resolve_order(char *new_order)
3601 Globals.szNameResolveOrder = new_order;
3604 /***********************************************************
3605 Functions to return the current security masks/modes. If
3606 set to -1 then return the create mask/mode instead.
3607 ************************************************************/
3609 int lp_security_mask(int snum)
3611 int val = _lp_security_mask(snum);
3613 return lp_create_mask(snum);
3617 int lp_force_security_mode(int snum)
3619 int val = _lp_force_security_mode(snum);
3621 return lp_force_create_mode(snum);
3625 int lp_dir_security_mask(int snum)
3627 int val = _lp_dir_security_mask(snum);
3629 return lp_dir_mask(snum);
3633 int lp_force_dir_security_mode(int snum)
3635 int val = _lp_force_dir_security_mode(snum);
3637 return lp_force_dir_mode(snum);
3641 char *lp_printername(int snum)
3643 char *ret = _lp_printername(snum);
3644 if (ret == NULL || (ret != NULL && *ret == '\0'))
3645 ret = lp_servicename(snum);