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 LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
90 #define VALID(i) ServicePtrs[i]->valid
92 int keepalive = DEFAULT_KEEPALIVE;
93 BOOL use_getwd_cache = True;
95 extern int extra_time_offset;
97 static BOOL defaults_saved = False;
100 * This structure describes global (ie., server-wide) parameters.
104 char *szPrintcapname;
105 char *szEnumPortsCommand;
106 char *szAddPrinterCommand;
107 char *szDeletePrinterCommand;
108 char *szOs2DriverMap;
111 char *szDefaultService;
115 char *szServerString;
116 char *szAutoServices;
117 char *szPasswdProgram;
121 char *szSMBPasswdFile;
123 char *szPassdbModulePath;
124 char *szPasswordServer;
125 char *szSocketOptions;
128 char *szDomainAdminGroup;
129 char *szDomainGuestGroup;
130 char *szDomainAdminUsers;
131 char *szDomainGuestUsers;
132 char *szDomainHostsallow;
133 char *szDomainHostsdeny;
135 #ifdef USING_GROUPNAME_MAP
136 char *szGroupnameMap;
137 #endif /* USING_GROUPNAME_MAP */
138 char *szCharacterSet;
145 char *szCodingSystem;
147 char *szRemoteAnnounce;
148 char *szRemoteBrowseSync;
149 char *szSocketAddress;
150 char *szNISHomeMapName;
151 char *szAnnounceVersion; /* This is initialised in init_globals */
152 char *szNetbiosAliases;
153 char *szDomainOtherSIDs;
154 char *szNameResolveOrder;
159 char *szLdapRootPassword;
161 char *szAddUserScript;
162 char *szDelUserScript;
163 char *szAddGroupScript;
164 char *szDelGroupScript;
165 char *szAddUserToGroupScript;
166 char *szDelUserToGroupScript;
171 char *szUtmpHostname;
177 char *szTemplateHomedir;
178 char *szTemplateShell;
179 char *szWinbindSeparator;
180 BOOL bWinbindEnumUsers;
181 BOOL bWinbindEnumGroups;
182 char *szAddShareCommand;
183 char *szChangeShareCommand;
184 char *szDeleteShareCommand;
199 int iMaxSmbdProcesses;
203 int enhanced_browsing;
210 int client_code_page;
211 int announce_as; /* This is initialised in init_globals */
212 int machine_password_timeout;
213 int change_notify_timeout;
216 int min_passwd_length;
217 int oplock_break_wait_time;
218 int winbind_cache_time;
221 #endif /* WITH_LDAP */
224 char **sslHostsRequire;
225 char **sslHostsResign;
231 char *sslClientPrivKey;
234 BOOL sslReqClientCert;
235 BOOL sslReqServerCert;
236 BOOL sslCompatibility;
237 #endif /* WITH_SSL */
238 BOOL bMsAddPrinterWizard;
243 BOOL bPreferredMaster;
246 BOOL bEncryptPasswords;
250 BOOL bObeyPamRestrictions;
253 BOOL bLargeReadwrite;
256 BOOL bReadPrediction;
262 BOOL bBindInterfacesOnly;
263 BOOL bPamPasswordChange;
264 BOOL bUnixPasswdSync;
265 BOOL bPasswdChatDebug;
272 BOOL bAllowTrustedDomains;
273 BOOL bRestrictAnonymous;
275 BOOL bDebugHiresTimestamp;
279 BOOL bHideLocalUsers;
284 static global Globals;
289 * This structure describes a single service.
298 char *szGuestaccount;
299 char *szInvalidUsers;
307 char *szRootPostExec;
308 char *szPrintcommand;
311 char *szLppausecommand;
312 char *szLpresumecommand;
313 char *szQueuepausecommand;
314 char *szQueueresumecommand;
316 char *szPrinterDriver;
317 char *szPrinterDriverLocation;
327 char *szVetoOplockFiles;
336 char *szVfsObjectFile;
342 int iCreate_force_mode;
344 int iSecurity_force_mode;
347 int iDir_Security_mask;
348 int iDir_Security_force_mode;
352 int iOplockContentionLimit;
355 BOOL bRootpreexecClose;
358 BOOL bShortCasePreserve;
362 BOOL bHideUnReadable;
388 BOOL bDeleteReadonly;
390 BOOL bDeleteVetoFiles;
393 BOOL bDosFiletimeResolution;
394 BOOL bFakeDirCreateTimes;
399 char dummy[3]; /* for alignment */
404 /* This is a default service used to prime a services structure */
405 static service sDefault = {
407 False, /* not autoloaded */
408 NULL, /* szService */
410 NULL, /* szUsername */
411 NULL, /* szGuestAccount - this is set in init_globals() */
412 NULL, /* szInvalidUsers */
413 NULL, /* szValidUsers */
414 NULL, /* szAdminUsers */
416 NULL, /* szInclude */
417 NULL, /* szPreExec */
418 NULL, /* szPostExec */
419 NULL, /* szRootPreExec */
420 NULL, /* szRootPostExec */
421 NULL, /* szPrintcommand */
422 NULL, /* szLpqcommand */
423 NULL, /* szLprmcommand */
424 NULL, /* szLppausecommand */
425 NULL, /* szLpresumecommand */
426 NULL, /* szQueuepausecommand */
427 NULL, /* szQueueresumecommand */
428 NULL, /* szPrintername */
429 NULL, /* szPrinterDriver - this is set in init_globals() */
430 NULL, /* szPrinterDriverLocation */
431 NULL, /* szDriverFile */
432 NULL, /* szDontdescend */
433 NULL, /* szHostsallow */
434 NULL, /* szHostsdeny */
435 NULL, /* szMagicScript */
436 NULL, /* szMagicOutput */
437 NULL, /* szMangledMap */
438 NULL, /* szVetoFiles */
439 NULL, /* szHideFiles */
440 NULL, /* szVetoOplockFiles */
442 NULL, /* force user */
443 NULL, /* force group */
445 NULL, /* writelist */
446 NULL, /* printer admin */
449 NULL, /* vfs object */
450 NULL, /* vfs options */
451 0, /* iMinPrintSpace */
452 1000, /* iMaxPrintJobs */
453 0, /* iWriteCacheSize */
454 0744, /* iCreate_mask */
455 0000, /* iCreate_force_mode */
456 0777, /* iSecurity_mask */
457 0, /* iSecurity_force_mode */
458 0755, /* iDir_mask */
459 0000, /* iDir_force_mode */
460 0777, /* iDir_Security_mask */
461 0, /* iDir_Security_force_mode */
462 0, /* iMaxConnections */
463 CASE_LOWER, /* iDefaultCase */
464 DEFAULT_PRINTING, /* iPrinting */
465 2, /* iOplockContentionLimit */
466 False, /* bAlternatePerm */
467 False, /* bPreexecClose */
468 False, /* bRootpreexecClose */
469 False, /* case sensitive */
470 True, /* case preserve */
471 True, /* short case preserve */
472 False, /* case mangle */
474 True, /* bHideDotFiles */
475 False, /* bHideUnReadable */
476 True, /* bBrowseable */
477 True, /* bAvailable */
478 True, /* bRead_only */
479 True, /* bNo_set_dir */
480 False, /* bGuest_only */
481 False, /* bGuest_ok */
482 False, /* bPrint_ok */
483 False, /* bPostscript */
484 False, /* bMap_system */
485 False, /* bMap_hidden */
486 True, /* bMap_archive */
488 False, /* bStrictLocking */
489 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 {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, 0},
683 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
684 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
685 {"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, 0},
686 {"passdb module path", P_STRING, P_GLOBAL, &Globals.szPassdbModulePath, NULL, NULL, 0},
687 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
688 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
689 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
691 {"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, 0},
692 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
693 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
694 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
695 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
696 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
697 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
698 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
699 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0},
700 {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, 0},
701 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
703 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
704 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
705 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
707 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
708 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
709 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
710 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
711 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
712 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
713 {"printer admin", P_STRING, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_PRINT},
714 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
715 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
716 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
718 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE},
719 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
720 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
721 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
723 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
724 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
725 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
726 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
727 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
728 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
729 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
730 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
731 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
732 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
733 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
734 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
735 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
737 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
738 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
740 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
741 {"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
742 {"allow hosts", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
743 {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
744 {"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
747 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
748 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0},
750 {"ssl hosts", P_LIST, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0},
751 {"ssl hosts resign", P_LIST, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
752 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0},
753 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0},
754 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0},
755 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0},
756 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0},
757 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0},
758 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0},
759 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0},
760 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0},
761 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
762 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0},
763 #endif /* WITH_SSL */
765 {"Logging Options", P_SEP, P_SEPARATOR},
766 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
767 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
768 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
769 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
770 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
772 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
773 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
774 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
775 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
776 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
777 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
779 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT},
781 {"Protocol Options", P_SEP, P_SEPARATOR},
783 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
784 {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, 0},
785 {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
786 {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, 0},
787 {"unicode", P_BOOL, P_GLOBAL, &Globals.bUnicode, NULL, NULL, 0},
788 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
789 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
790 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
792 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
793 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
794 {"nt acl support", P_BOOL, P_GLOBAL, &Globals.bNTAclSupport, NULL, NULL, 0},
795 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
796 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
797 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
798 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
800 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
801 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
802 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
803 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
804 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
805 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
806 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
808 {"Tuning Options", P_SEP, P_SEPARATOR},
810 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
811 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
812 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
813 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
815 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
816 {"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, 0},
817 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
818 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
819 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
820 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
821 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
823 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
824 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
825 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
826 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
827 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
829 {"Printing Options", P_SEP, P_SEPARATOR},
831 {"total print jobs", P_INTEGER, P_GLOBAL, &Globals.iTotalPrintJobs, NULL, NULL, FLAG_PRINT},
832 {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_PRINT},
833 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
834 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
835 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
836 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
837 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
838 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
839 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
840 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
841 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
842 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
843 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
844 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
845 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
846 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
848 {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, 0},
849 {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, 0},
850 {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, 0},
851 {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, 0},
852 {"os2 driver map", P_STRING, P_GLOBAL, &Globals.szOs2DriverMap, NULL, NULL, 0},
854 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT|FLAG_DOS_STRING},
855 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_DOS_STRING},
856 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT},
857 {"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT},
858 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
860 {"Filename Handling", P_SEP, P_SEPARATOR},
861 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
863 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
864 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
865 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
866 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
867 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
868 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
869 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
870 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
871 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
872 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
873 {"hide unreadable", P_BOOL, P_LOCAL, &sDefault.bHideUnReadable, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
874 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
875 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
876 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
877 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
878 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
879 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
880 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
881 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
882 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
883 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
885 {"Domain Options", P_SEP, P_SEPARATOR},
887 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
888 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
890 #ifdef USING_GROUPNAME_MAP
891 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
892 #endif /* USING_GROUPNAME_MAP */
894 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
896 {"Logon Options", P_SEP, P_SEPARATOR},
898 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
899 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
900 {"add group script", P_STRING, P_GLOBAL, &Globals.szAddGroupScript, NULL, NULL, 0},
901 {"delete group script", P_STRING, P_GLOBAL, &Globals.szDelGroupScript, NULL, NULL, 0},
902 {"add user to group script", P_STRING, P_GLOBAL, &Globals.szAddUserToGroupScript, NULL, NULL, 0},
903 {"delete user from group script", P_STRING, P_GLOBAL, &Globals.szDelUserToGroupScript, NULL, NULL, 0},
905 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
906 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
907 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
908 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
909 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
911 {"Browse Options", P_SEP, P_SEPARATOR},
913 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
914 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, 0},
915 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
916 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
917 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
918 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
919 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
920 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
921 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
922 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
923 {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL},
925 {"WINS Options", P_SEP, P_SEPARATOR},
926 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
927 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
929 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, handle_wins_server_list, NULL, FLAG_BASIC},
930 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
931 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
933 {"Locking Options", P_SEP, P_SEPARATOR},
935 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
936 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
937 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
938 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
940 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
941 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
942 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
943 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
944 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
945 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
946 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
949 {"Ldap Options", P_SEP, P_SEPARATOR},
951 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
952 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
953 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
954 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0},
955 {"ldap root", P_STRING, P_GLOBAL, &Globals.szLdapRoot, NULL, NULL, 0},
956 {"ldap root passwd", P_STRING, P_GLOBAL, &Globals.szLdapRootPassword, NULL, NULL, 0},
957 #endif /* WITH_LDAP */
959 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
960 {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, 0},
961 {"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, 0},
962 {"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, 0},
964 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
965 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
966 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
967 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
968 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
970 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
971 {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
972 {"utmp hostname", P_STRING, P_GLOBAL, &Globals.szUtmpHostname, NULL, NULL, 0},
973 {"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, 0},
976 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DOS_STRING},
977 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DOS_STRING},
978 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
979 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
980 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
981 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
982 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0},
983 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
984 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
985 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
986 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
987 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
989 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
990 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
991 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
992 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
994 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
995 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
996 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
997 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
998 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
999 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
1000 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE},
1001 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
1002 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
1003 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0},
1004 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1005 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1006 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
1007 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
1008 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
1009 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1010 {"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1011 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1012 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1014 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1015 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
1016 {"hide local users", P_BOOL, P_GLOBAL, &Globals.bHideLocalUsers, NULL,
1019 {"VFS options", P_SEP, P_SEPARATOR},
1021 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, FLAG_SHARE},
1022 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, FLAG_SHARE},
1025 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
1026 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, 0},
1028 {"Winbind options", P_SEP, P_SEPARATOR},
1030 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_id, NULL, 0},
1031 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_id, NULL, 0},
1032 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, 0},
1033 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, 0},
1034 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, 0},
1035 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
1036 {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, 0},
1037 {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, 0},
1039 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
1043 /***************************************************************************
1044 Initialise the sDefault parameter structure for the printer values.
1045 ***************************************************************************/
1046 static void init_printer_values(void)
1048 string_set(&sDefault.szPrinterDriver, "");
1049 string_set(&sDefault.szDriverFile, DRIVERFILE);
1051 /* choose defaults depending on the type of printing */
1052 switch (sDefault.iPrinting)
1058 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1059 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1060 string_set(&sDefault.szPrintcommand,
1066 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1067 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1068 string_set(&sDefault.szPrintcommand,
1070 string_set(&sDefault.szQueuepausecommand,
1072 string_set(&sDefault.szQueueresumecommand,
1074 string_set(&sDefault.szLppausecommand,
1076 string_set(&sDefault.szLpresumecommand,
1077 "lpc release %p %j");
1082 string_set(&sDefault.szLpqcommand, "");
1083 string_set(&sDefault.szLprmcommand, "");
1084 string_set(&sDefault.szPrintcommand, "");
1085 string_set(&sDefault.szLppausecommand, "");
1086 string_set(&sDefault.szLpresumecommand, "");
1087 string_set(&sDefault.szQueuepausecommand, "");
1088 string_set(&sDefault.szQueueresumecommand, "");
1090 string_set(&Globals.szPrintcapname, "cups");
1092 string_set(&sDefault.szLpqcommand,
1093 "/usr/bin/lpstat -o %p");
1094 string_set(&sDefault.szLprmcommand,
1095 "/usr/bin/cancel %p-%j");
1096 string_set(&sDefault.szPrintcommand,
1097 "/usr/bin/lp -d %p %s; rm %s");
1098 string_set(&sDefault.szLppausecommand,
1099 "lp -i %p-%j -H hold");
1100 string_set(&sDefault.szLpresumecommand,
1101 "lp -i %p-%j -H resume");
1102 string_set(&sDefault.szQueuepausecommand,
1103 "/usr/bin/disable %p");
1104 string_set(&sDefault.szQueueresumecommand,
1105 "/usr/bin/enable %p");
1106 string_set(&Globals.szPrintcapname, "lpstat");
1107 #endif /* HAVE_LIBCUPS */
1112 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1113 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1114 string_set(&sDefault.szPrintcommand,
1115 "lp -c -d%p %s; rm %s");
1116 string_set(&sDefault.szQueuepausecommand,
1118 string_set(&sDefault.szQueueresumecommand,
1121 string_set(&sDefault.szLppausecommand,
1122 "lp -i %p-%j -H hold");
1123 string_set(&sDefault.szLpresumecommand,
1124 "lp -i %p-%j -H resume");
1129 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1130 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1131 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1135 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1136 string_set(&sDefault.szLprmcommand,
1137 "qstat -s -j%j -c");
1138 string_set(&sDefault.szPrintcommand,
1139 "lp -d%p -s %s; rm %s");
1140 string_set(&sDefault.szLppausecommand,
1141 "qstat -s -j%j -h");
1142 string_set(&sDefault.szLpresumecommand,
1143 "qstat -s -j%j -r");
1148 string_set(&sDefault.szPrintcommand, "vlp print %p %s");
1149 string_set(&sDefault.szLpqcommand, "vlp lpq %p");
1150 string_set(&sDefault.szLprmcommand, "vlp lprm %p %j");
1151 string_set(&sDefault.szLppausecommand, "vlp lppause %p %j");
1152 string_set(&sDefault.szLpresumecommand, "vlp lpresum %p %j");
1153 string_set(&sDefault.szQueuepausecommand, "vlp queuepause %p");
1154 string_set(&sDefault.szQueueresumecommand, "vlp queueresume %p");
1156 #endif /* DEVELOPER */
1161 /***************************************************************************
1162 Initialise the global parameter structure.
1163 ***************************************************************************/
1164 static void init_globals(void)
1166 static BOOL done_init = False;
1172 memset((void *)&Globals, '\0', sizeof(Globals));
1174 for (i = 0; parm_table[i].label; i++)
1175 if ((parm_table[i].type == P_STRING ||
1176 parm_table[i].type == P_USTRING) &&
1178 string_set(parm_table[i].ptr, "");
1180 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
1181 string_set(&sDefault.fstype, FSTYPE_STRING);
1183 init_printer_values();
1189 DEBUG(3, ("Initialising global parameters\n"));
1191 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
1192 string_set(&Globals.szPrivateDir, PRIVATE_DIR);
1193 string_set(&Globals.szPassdbModulePath, "");
1196 * Allow the default PASSWD_CHAT to be overridden in local.h.
1198 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1199 string_set(&Globals.szWorkGroup, WORKGROUP);
1200 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1201 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1202 string_set(&Globals.szLockDir, LOCKDIR);
1204 string_set(&Globals.szUtmpDir, "");
1205 string_set(&Globals.szWtmpDir, "");
1206 string_set(&Globals.szUtmpHostname, "%m");
1207 Globals.bUtmp = False;
1209 string_set(&Globals.szSocketAddress, "0.0.0.0");
1210 pstrcpy(s, "Samba ");
1211 pstrcat(s, VERSION);
1212 string_set(&Globals.szServerString, s);
1213 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1214 DEFAULT_MINOR_VERSION);
1215 string_set(&Globals.szAnnounceVersion, s);
1217 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1219 string_set(&Globals.szLogonDrive, "");
1220 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1221 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1222 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1224 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1225 string_set(&Globals.szCodePageDir, CODEPAGEDIR);
1227 Globals.bLoadPrinters = True;
1228 Globals.bUseRhosts = False;
1229 Globals.max_packet = 65535;
1230 Globals.mangled_stack = 50;
1231 Globals.max_xmit = 65535;
1232 Globals.max_mux = 50; /* This is *needed* for profile support. */
1233 Globals.lpqcachetime = 10;
1234 Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1235 Globals.iTotalPrintJobs = 0; /* no limit specified */
1236 Globals.pwordlevel = 0;
1237 Globals.unamelevel = 0;
1238 Globals.deadtime = 0;
1239 Globals.bLargeReadwrite = False;
1240 Globals.max_log_size = 5000;
1241 Globals.max_open_files = MAX_OPEN_FILES;
1242 Globals.maxprotocol = PROTOCOL_NT1;
1243 Globals.minprotocol = PROTOCOL_CORE;
1244 Globals.security = SEC_USER;
1245 Globals.bEncryptPasswords = False;
1246 Globals.bUpdateEncrypt = False;
1247 Globals.bReadRaw = True;
1248 Globals.bWriteRaw = True;
1249 Globals.bReadPrediction = False;
1250 Globals.bReadbmpx = False;
1251 Globals.bNullPasswords = False;
1252 Globals.bObeyPamRestrictions = 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 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1271 Globals.bNISHomeMap = False;
1272 #ifdef WITH_NISPLUS_HOME
1273 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1275 string_set(&Globals.szNISHomeMapName, "auto.home");
1278 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1279 Globals.bTimeServer = False;
1280 Globals.bBindInterfacesOnly = False;
1281 Globals.bUnixPasswdSync = False;
1282 Globals.bPamPasswordChange = 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 /* Globals.sslHostsRequire = NULL;
1305 Globals.sslHostsResign = NULL; */
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, "\\");
1352 Globals.winbind_cache_time = 15;
1353 Globals.bWinbindEnumUsers = True;
1354 Globals.bWinbindEnumGroups = True;
1357 * This must be done last as it checks the value in
1361 interpret_coding_system(KANJI);
1364 static TALLOC_CTX *lp_talloc;
1366 /******************************************************************* a
1367 free up temporary memory - called from the main loop
1368 ********************************************************************/
1369 void lp_talloc_free(void)
1373 talloc_destroy(lp_talloc);
1377 /*******************************************************************
1378 convenience routine to grab string parameters into temporary memory
1379 and run standard_sub_basic on them. The buffers can be written to by
1380 callers without affecting the source string.
1381 ********************************************************************/
1382 static char *lp_string(const char *s)
1384 size_t len = s ? strlen(s) : 0;
1388 lp_talloc = talloc_init();
1390 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1398 StrnCpy(ret, s, len);
1400 trim_string(ret, "\"", "\"");
1402 standard_sub_basic(ret);
1408 In this section all the functions that are used to access the
1409 parameters from the rest of the program are defined
1412 #define FN_GLOBAL_STRING(fn_name,ptr) \
1413 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1414 #define FN_GLOBAL_LIST(fn_name,ptr) \
1415 char **fn_name(void) {return(*(char ***)(ptr));}
1416 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1417 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1418 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1419 char fn_name(void) {return(*(char *)(ptr));}
1420 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1421 int fn_name(void) {return(*(int *)(ptr));}
1423 #define FN_LOCAL_STRING(fn_name,val) \
1424 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1425 #define FN_LOCAL_LIST(fn_name,val) \
1426 char **fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1427 #define FN_LOCAL_BOOL(fn_name,val) \
1428 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1429 #define FN_LOCAL_CHAR(fn_name,val) \
1430 char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1431 #define FN_LOCAL_INTEGER(fn_name,val) \
1432 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1434 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1435 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1436 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1437 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
1438 FN_GLOBAL_STRING(lp_passdb_module_path, &Globals.szPassdbModulePath)
1439 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1440 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1441 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1442 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1443 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1444 FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
1445 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1447 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1448 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1449 FN_GLOBAL_STRING(lp_utmp_hostname, &Globals.szUtmpHostname)
1450 FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
1452 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1453 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1454 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1455 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1456 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1457 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1458 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1459 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1460 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1461 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1462 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1463 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1464 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1465 #ifdef USING_GROUPNAME_MAP
1466 FN_GLOBAL_STRING(lp_groupname_map, &Globals.szGroupnameMap)
1467 #endif /* USING_GROUPNAME_MAP */
1468 FN_GLOBAL_STRING(lp_logon_script, &Globals.szLogonScript)
1469 FN_GLOBAL_STRING(lp_logon_path, &Globals.szLogonPath)
1470 FN_GLOBAL_STRING(lp_logon_drive, &Globals.szLogonDrive)
1471 FN_GLOBAL_STRING(lp_logon_home, &Globals.szLogonHome)
1472 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1473 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1474 FN_GLOBAL_STRING(lp_wins_server, &Globals.szWINSserver)
1475 FN_GLOBAL_STRING(lp_interfaces, &Globals.szInterfaces)
1476 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1477 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1478 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1479 FN_GLOBAL_STRING(lp_netbios_aliases, &Globals.szNetbiosAliases)
1480 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1481 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1482 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1484 FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
1485 FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
1486 FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
1487 FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserToGroupScript)
1489 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1490 FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
1491 FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
1492 FN_GLOBAL_STRING(lp_winbind_uid, &Globals.szWinbindUID)
1493 FN_GLOBAL_STRING(lp_winbind_gid, &Globals.szWinbindGID)
1494 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1495 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1496 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1497 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1498 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1499 FN_GLOBAL_STRING(lp_codepagedir,&Globals.szCodePageDir)
1501 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer)
1502 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1503 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter)
1504 FN_GLOBAL_STRING(lp_ldap_root, &Globals.szLdapRoot)
1505 FN_GLOBAL_STRING(lp_ldap_rootpasswd, &Globals.szLdapRootPassword)
1506 #endif /* WITH_LDAP */
1507 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
1508 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
1509 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
1512 FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion)
1513 FN_GLOBAL_LIST(lp_ssl_hosts, &Globals.sslHostsRequire)
1514 FN_GLOBAL_LIST(lp_ssl_hosts_resign, &Globals.sslHostsResign)
1515 FN_GLOBAL_STRING(lp_ssl_cacertdir, &Globals.sslCaCertDir)
1516 FN_GLOBAL_STRING(lp_ssl_cacertfile, &Globals.sslCaCertFile)
1517 FN_GLOBAL_STRING(lp_ssl_cert, &Globals.sslCert)
1518 FN_GLOBAL_STRING(lp_ssl_privkey, &Globals.sslPrivKey)
1519 FN_GLOBAL_STRING(lp_ssl_client_cert, &Globals.sslClientCert)
1520 FN_GLOBAL_STRING(lp_ssl_client_privkey, &Globals.sslClientPrivKey)
1521 FN_GLOBAL_STRING(lp_ssl_ciphers, &Globals.sslCiphers)
1522 FN_GLOBAL_BOOL(lp_ssl_enabled, &Globals.sslEnabled)
1523 FN_GLOBAL_BOOL(lp_ssl_reqClientCert, &Globals.sslReqClientCert)
1524 FN_GLOBAL_BOOL(lp_ssl_reqServerCert, &Globals.sslReqServerCert)
1525 FN_GLOBAL_BOOL(lp_ssl_compatibility, &Globals.sslCompatibility)
1526 #endif /* WITH_SSL */
1528 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1529 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1530 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1531 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1532 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1533 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1534 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1535 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1536 FN_GLOBAL_BOOL(lp_use_rhosts, &Globals.bUseRhosts)
1537 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1538 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1539 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1540 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1541 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1542 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1543 FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
1544 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1545 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1546 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1547 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1548 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1549 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1550 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1551 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1552 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1553 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1554 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1555 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1556 FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
1557 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1558 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1559 FN_GLOBAL_BOOL(lp_nt_smb_support, &Globals.bNTSmbSupport)
1560 FN_GLOBAL_BOOL(lp_unicode, &Globals.bUnicode)
1561 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1562 FN_GLOBAL_BOOL(lp_nt_acl_support, &Globals.bNTAclSupport)
1563 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1564 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1565 FN_GLOBAL_BOOL(lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1566 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1567 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1568 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1569 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1570 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1571 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1572 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1573 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1574 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1575 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1576 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1577 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1578 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1579 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1580 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1581 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1582 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1583 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1584 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1585 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1586 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1587 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
1588 FN_GLOBAL_INTEGER(lp_totalprintjobs, &Globals.iTotalPrintJobs)
1589 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1590 FN_GLOBAL_INTEGER(lp_client_code_page, &Globals.client_code_page)
1591 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1592 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1593 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1594 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1595 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1596 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1597 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1598 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1599 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1601 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1602 #endif /* WITH_LDAP */
1603 FN_LOCAL_STRING(lp_preexec, szPreExec)
1604 FN_LOCAL_STRING(lp_postexec, szPostExec)
1605 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1606 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1607 FN_LOCAL_STRING(lp_servicename, szService)
1608 FN_LOCAL_STRING(lp_pathname, szPath)
1609 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1610 FN_LOCAL_STRING(lp_username, szUsername)
1611 FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
1612 FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
1613 FN_LOCAL_STRING(lp_valid_users, szValidUsers)
1614 FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
1615 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1616 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1617 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1618 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1619 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1620 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1621 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1622 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1623 FN_LOCAL_STRING(lp_driverfile, szDriverFile)
1624 FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)
1625 FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
1626 FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
1627 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1628 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1629 FN_LOCAL_STRING(lp_comment, comment)
1630 FN_LOCAL_STRING(lp_force_user, force_user)
1631 FN_LOCAL_STRING(lp_force_group, force_group)
1632 FN_LOCAL_STRING(lp_readlist, readlist)
1633 FN_LOCAL_STRING(lp_writelist, writelist)
1634 FN_LOCAL_STRING(lp_printer_admin, printer_admin)
1635 FN_LOCAL_STRING(lp_fstype, fstype)
1636 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1637 static FN_LOCAL_STRING(lp_volume, volume)
1638 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1639 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1640 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1641 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1642 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
1643 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1644 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1645 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1646 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1647 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1648 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1649 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1650 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1651 FN_LOCAL_BOOL(lp_status, status)
1652 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1653 FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
1654 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1655 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1656 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1657 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1658 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1659 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1660 FN_LOCAL_BOOL(lp_postscript, bPostscript)
1661 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1662 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1663 FN_LOCAL_BOOL(lp_locking, bLocking)
1664 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1665 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1666 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1667 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1668 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1669 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1670 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1671 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1672 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1673 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1674 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1675 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1676 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1677 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1678 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1679 FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
1680 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1681 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1682 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1683 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1684 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1685 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1686 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1687 FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
1688 FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
1689 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1690 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1691 FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
1692 FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
1693 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1694 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1695 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1696 FN_LOCAL_INTEGER(lp_maxprintjobs, iMaxPrintJobs)
1697 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1698 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1699 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1700 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1701 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1702 FN_GLOBAL_BOOL(lp_hide_local_users, &Globals.bHideLocalUsers)
1704 /* local prototypes */
1706 static int map_parameter(char *pszParmName);
1707 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1708 static int getservicebyname(char *pszServiceName,
1709 service * pserviceDest);
1710 static void copy_service(service * pserviceDest,
1711 service * pserviceSource, BOOL *pcopymapDest);
1712 static BOOL service_ok(int iService);
1713 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1714 static BOOL do_section(char *pszSectionName);
1715 static void init_copymap(service * pservice);
1718 /***************************************************************************
1719 initialise a service to the defaults
1720 ***************************************************************************/
1721 static void init_service(service * pservice)
1723 memset((char *)pservice, '\0', sizeof(service));
1724 copy_service(pservice, &sDefault, NULL);
1728 /***************************************************************************
1729 free the dynamically allocated parts of a service struct
1730 ***************************************************************************/
1731 static void free_service(service * pservice)
1737 if (pservice->szService)
1739 ("free_service: Freeing service %s\n",
1740 pservice->szService));
1742 string_free(&pservice->szService);
1743 if (pservice->copymap)
1745 free(pservice->copymap);
1746 pservice->copymap = NULL;
1749 for (i = 0; parm_table[i].label; i++)
1751 if ((parm_table[i].type == P_STRING ||
1752 parm_table[i].type == P_USTRING) &&
1753 parm_table[i].class == P_LOCAL)
1754 string_free((char **)
1755 (((char *)pservice) +
1756 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1757 else if (parm_table[i].type == P_LIST &&
1758 parm_table[i].class == P_LOCAL)
1759 lp_list_free(*(char ***)
1760 (((char *)pservice) +
1761 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1765 ZERO_STRUCTP(pservice);
1768 /***************************************************************************
1769 add a new service to the services array initialising it with the given
1770 service. name must be in DOS codepage.
1771 ***************************************************************************/
1772 static int add_a_service(service * pservice, char *name)
1776 int num_to_alloc = iNumServices + 1;
1778 tservice = *pservice;
1780 /* it might already exist */
1783 i = getservicebyname(name, NULL);
1788 /* find an invalid one */
1789 for (i = 0; i < iNumServices; i++)
1790 if (!ServicePtrs[i]->valid)
1793 /* if not, then create one */
1794 if (i == iNumServices)
1797 (service **) Realloc(ServicePtrs,
1801 ServicePtrs[iNumServices] =
1802 (service *) malloc(sizeof(service));
1804 if (!ServicePtrs || !ServicePtrs[iNumServices])
1810 free_service(ServicePtrs[i]);
1812 ServicePtrs[i]->valid = True;
1814 init_service(ServicePtrs[i]);
1815 copy_service(ServicePtrs[i], &tservice, NULL);
1818 string_set(&ServicePtrs[i]->szService, name);
1823 /***************************************************************************
1824 add a new home service, with the specified home directory, defaults coming
1825 from service ifrom. homename must be in DOS codepage.
1826 ***************************************************************************/
1827 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1829 int i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
1834 if (!(*(ServicePtrs[i]->szPath))
1835 || strequal(ServicePtrs[i]->szPath, lp_pathname(-1)))
1836 string_set(&ServicePtrs[i]->szPath, pszHomedir);
1837 if (!(*(ServicePtrs[i]->comment)))
1840 slprintf(comment, sizeof(comment) - 1,
1841 "Home directory of %s", pszHomename);
1842 string_set(&ServicePtrs[i]->comment, comment);
1844 ServicePtrs[i]->bAvailable = sDefault.bAvailable;
1845 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1848 ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1853 /***************************************************************************
1854 add a new service, based on an old one. pszService must be in DOS codepage.
1855 ***************************************************************************/
1856 int lp_add_service(char *pszService, int iDefaultService)
1858 return (add_a_service(ServicePtrs[iDefaultService], pszService));
1862 /***************************************************************************
1864 ***************************************************************************/
1865 static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok)
1868 int i = add_a_service(&sDefault, ipc_name);
1873 slprintf(comment, sizeof(comment) - 1,
1874 "IPC Service (%s)", Globals.szServerString);
1876 string_set(&ServicePtrs[i]->szPath, tmpdir());
1877 string_set(&ServicePtrs[i]->szUsername, "");
1878 string_set(&ServicePtrs[i]->comment, comment);
1879 string_set(&ServicePtrs[i]->fstype, "IPC");
1880 ServicePtrs[i]->status = False;
1881 ServicePtrs[i]->iMaxConnections = 0;
1882 ServicePtrs[i]->bAvailable = True;
1883 ServicePtrs[i]->bRead_only = True;
1884 ServicePtrs[i]->bGuest_only = False;
1885 ServicePtrs[i]->bGuest_ok = guest_ok;
1886 ServicePtrs[i]->bPrint_ok = False;
1887 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1889 DEBUG(3, ("adding IPC service\n"));
1895 /***************************************************************************
1896 add a new printer service, with defaults coming from service iFrom.
1897 printername must be in DOS codepage.
1898 ***************************************************************************/
1899 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
1901 char *comment = "From Printcap";
1902 int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
1907 /* note that we do NOT default the availability flag to True - */
1908 /* we take it from the default service passed. This allows all */
1909 /* dynamic printers to be disabled by disabling the [printers] */
1910 /* entry (if/when the 'available' keyword is implemented!). */
1912 /* the printer name is set to the service name. */
1913 string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
1914 string_set(&ServicePtrs[i]->comment, comment);
1915 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1916 /* Printers cannot be read_only. */
1917 ServicePtrs[i]->bRead_only = False;
1918 /* No share modes on printer services. */
1919 ServicePtrs[i]->bShareModes = False;
1920 /* No oplocks on printer services. */
1921 ServicePtrs[i]->bOpLocks = False;
1922 /* Printer services must be printable. */
1923 ServicePtrs[i]->bPrint_ok = True;
1925 DEBUG(3, ("adding printer service %s\n", pszPrintername));
1930 /***************************************************************************
1931 Map a parameter's string representation to something we can use.
1932 Returns False if the parameter string is not recognised, else TRUE.
1933 ***************************************************************************/
1934 static int map_parameter(char *pszParmName)
1938 if (*pszParmName == '-')
1941 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1942 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1945 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
1950 /***************************************************************************
1951 Set a boolean variable from the text value stored in the passed string.
1952 Returns True in success, False if the passed string does not correctly
1953 represent a boolean.
1954 ***************************************************************************/
1955 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
1960 if (strwicmp(pszParmValue, "yes") == 0 ||
1961 strwicmp(pszParmValue, "true") == 0 ||
1962 strwicmp(pszParmValue, "1") == 0)
1965 if (strwicmp(pszParmValue, "no") == 0 ||
1966 strwicmp(pszParmValue, "False") == 0 ||
1967 strwicmp(pszParmValue, "0") == 0)
1972 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1979 /***************************************************************************
1980 Find a service by name. Otherwise works like get_service.
1981 ***************************************************************************/
1982 static int getservicebyname(char *pszServiceName, service * pserviceDest)
1986 for (iService = iNumServices - 1; iService >= 0; iService--)
1987 if (VALID(iService) &&
1988 strwicmp(ServicePtrs[iService]->szService, pszServiceName) == 0)
1990 if (pserviceDest != NULL)
1991 copy_service(pserviceDest, ServicePtrs[iService], NULL);
2000 /***************************************************************************
2001 Copy a service structure to another
2003 If pcopymapDest is NULL then copy all fields
2004 ***************************************************************************/
2005 static void copy_service(service * pserviceDest,
2006 service * pserviceSource, BOOL *pcopymapDest)
2009 BOOL bcopyall = (pcopymapDest == NULL);
2011 for (i = 0; parm_table[i].label; i++)
2012 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
2013 (bcopyall || pcopymapDest[i]))
2015 void *def_ptr = parm_table[i].ptr;
2017 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
2020 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
2023 switch (parm_table[i].type)
2027 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
2033 *(int *)dest_ptr = *(int *)src_ptr;
2037 *(char *)dest_ptr = *(char *)src_ptr;
2041 string_set(dest_ptr,
2046 string_set(dest_ptr,
2048 strupper(*(char **)dest_ptr);
2051 lp_list_copy((char ***)dest_ptr, *(char ***)src_ptr);
2060 init_copymap(pserviceDest);
2061 if (pserviceSource->copymap)
2062 memcpy((void *)pserviceDest->copymap,
2063 (void *)pserviceSource->copymap,
2064 sizeof(BOOL) * NUMPARAMETERS);
2068 /***************************************************************************
2069 Check a service for consistency. Return False if the service is in any way
2070 incomplete or faulty, else True.
2071 ***************************************************************************/
2072 static BOOL service_ok(int iService)
2077 if (ServicePtrs[iService]->szService[0] == '\0')
2080 ("The following message indicates an internal error:\n"));
2081 DEBUG(0, ("No service name in service entry.\n"));
2085 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2086 /* I can't see why you'd want a non-printable printer service... */
2087 if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
2088 if (!ServicePtrs[iService]->bPrint_ok) {
2090 ("WARNING: [%s] service MUST be printable!\n",
2091 ServicePtrs[iService]->szService));
2092 ServicePtrs[iService]->bPrint_ok = True;
2094 /* [printers] service must also be non-browsable. */
2095 if (ServicePtrs[iService]->bBrowseable)
2096 ServicePtrs[iService]->bBrowseable = False;
2099 if (ServicePtrs[iService]->szPath[0] == '\0' &&
2100 strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0)
2103 ("No path in service %s - using %s\n",
2104 ServicePtrs[iService]->szService, tmpdir()));
2105 string_set(&ServicePtrs[iService]->szPath, tmpdir());
2108 /* If a service is flagged unavailable, log the fact at level 0. */
2109 if (!ServicePtrs[iService]->bAvailable)
2110 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2111 ServicePtrs[iService]->szService));
2116 static struct file_lists
2118 struct file_lists *next;
2124 /*******************************************************************
2125 keep a linked list of all config files so we know when one has changed
2126 it's date and needs to be reloaded
2127 ********************************************************************/
2128 static void add_to_file_list(char *fname)
2130 struct file_lists *f = file_lists;
2134 if (f->name && !strcmp(f->name, fname))
2141 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2144 f->next = file_lists;
2145 f->name = strdup(fname);
2157 standard_sub_basic(n2);
2158 f->modtime = file_modtime(n2);
2163 /*******************************************************************
2164 check if a config file has changed date
2165 ********************************************************************/
2166 BOOL lp_file_list_changed(void)
2168 struct file_lists *f = file_lists;
2169 DEBUG(6, ("lp_file_list_changed()\n"));
2176 pstrcpy(n2, f->name);
2177 standard_sub_basic(n2);
2179 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2180 f->name, n2, ctime(&f->modtime)));
2182 mod_time = file_modtime(n2);
2184 if (f->modtime != mod_time)
2187 ("file %s modified: %s\n", n2,
2189 f->modtime = mod_time;
2197 /***************************************************************************
2198 Run standard_sub_basic on netbios name... needed because global_myname
2199 is not accessed through any lp_ macro.
2200 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2201 ***************************************************************************/
2203 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2205 pstring netbios_name;
2207 pstrcpy(netbios_name, pszParmValue);
2209 standard_sub_basic(netbios_name);
2210 strupper(netbios_name);
2213 * Convert from UNIX to DOS string - the UNIX to DOS converter
2214 * isn't called on the special handlers.
2216 unix_to_dos(netbios_name, True);
2217 pstrcpy(global_myname, netbios_name);
2220 ("handle_netbios_name: set global_myname to: %s\n",
2226 /***************************************************************************
2227 Do the work of sourcing in environment variable/value pairs.
2228 ***************************************************************************/
2230 static BOOL source_env(char **lines)
2237 for (i = 0; lines[i]; i++)
2239 char *line = lines[i];
2241 if ((len = strlen(line)) == 0)
2244 if (line[len - 1] == '\n')
2247 if ((varval = malloc(len + 1)) == NULL)
2249 DEBUG(0, ("source_env: Not enough memory!\n"));
2253 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2254 strncpy(varval, line, len);
2257 p = strchr(line, (int)'=');
2260 DEBUG(4, ("source_env: missing '=': %s\n", line));
2267 ("source_env: Failed to put environment variable %s\n",
2275 ("source_env: getting var %s = %s\n", line,
2279 DEBUG(4, ("source_env: returning successfully\n"));
2283 /***************************************************************************
2284 Handle the source environment operation
2285 ***************************************************************************/
2287 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2294 pstrcpy(fname, pszParmValue);
2296 standard_sub_basic(fname);
2298 string_set(ptr, pszParmValue);
2300 DEBUG(4, ("handle_source_env: checking env type\n"));
2303 * Filename starting with '|' means popen and read from stdin.
2308 lines = file_lines_pload(p + 1, NULL, True);
2312 lines = file_lines_load(fname, NULL, True);
2318 ("handle_source_env: Failed to open file %s, Error was %s\n",
2319 fname, strerror(errno)));
2323 result = source_env(lines);
2324 file_lines_free(lines);
2329 /***************************************************************************
2330 handle the interpretation of the vfs object parameter
2331 *************************************************************************/
2332 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2334 /* Set string value */
2336 string_set(ptr, pszParmValue);
2338 /* Do any other initialisation required for vfs. Note that
2339 anything done here may have linking repercussions in nmbd. */
2344 /***************************************************************************
2345 handle the interpretation of the coding system parameter
2346 *************************************************************************/
2347 static BOOL handle_coding_system(char *pszParmValue, char **ptr)
2349 string_set(ptr, pszParmValue);
2350 interpret_coding_system(pszParmValue);
2354 /***************************************************************************
2355 Handle the interpretation of the character set system parameter.
2356 ***************************************************************************/
2358 static char *saved_character_set = NULL;
2360 static BOOL handle_character_set(char *pszParmValue, char **ptr)
2362 /* A dependency here is that the parameter client code page should be
2363 set before this is called.
2365 string_set(ptr, pszParmValue);
2367 saved_character_set = strdup(*ptr);
2368 interpret_character_set(*ptr, lp_client_code_page());
2372 /***************************************************************************
2373 Handle the interpretation of the client code page parameter.
2374 We handle this separately so that we can reset the character set
2375 parameter in case this came before 'client code page' in the smb.conf.
2376 ***************************************************************************/
2378 static BOOL handle_client_code_page(char *pszParmValue, char **ptr)
2380 Globals.client_code_page = atoi(pszParmValue);
2381 if (saved_character_set != NULL)
2382 interpret_character_set(saved_character_set,
2383 lp_client_code_page());
2384 codepage_initialise(lp_client_code_page());
2388 /***************************************************************************
2389 handle the valid chars lines
2390 ***************************************************************************/
2392 static BOOL handle_valid_chars(char *pszParmValue, char **ptr)
2394 string_set(ptr, pszParmValue);
2396 /* A dependency here is that the parameter client code page must be
2397 set before this is called - as calling codepage_initialise()
2398 would overwrite the valid char lines.
2400 codepage_initialise(lp_client_code_page());
2402 add_char_string(pszParmValue);
2406 /***************************************************************************
2407 handle the include operation
2408 ***************************************************************************/
2410 static BOOL handle_include(char *pszParmValue, char **ptr)
2413 pstrcpy(fname, pszParmValue);
2415 add_to_file_list(fname);
2417 standard_sub_basic(fname);
2419 string_set(ptr, fname);
2421 if (file_exist(fname, NULL))
2422 return (pm_process(fname, do_section, do_parameter));
2424 DEBUG(2, ("Can't find include file %s\n", fname));
2430 /***************************************************************************
2431 handle the interpretation of the copy parameter
2432 ***************************************************************************/
2433 static BOOL handle_copy(char *pszParmValue, char **ptr)
2437 service serviceTemp;
2439 string_set(ptr, pszParmValue);
2441 init_service(&serviceTemp);
2445 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2447 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2449 if (iTemp == iServiceIndex)
2452 ("Can't copy service %s - unable to copy self!\n",
2457 copy_service(ServicePtrs[iServiceIndex],
2459 ServicePtrs[iServiceIndex]->copymap);
2465 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2470 free_service(&serviceTemp);
2474 /***************************************************************************
2475 Handle winbind uid and gid allocation parameters. The format of these
2480 winbind uid = 1000-1999
2481 winbind gid = 700-899
2483 We only do simple parsing checks here. The strings are parsed into useful
2484 structures in the winbind daemon code.
2486 ***************************************************************************/
2488 /* Do some simple checks on "winbind [ug]id" parameter value */
2490 static BOOL handle_winbind_id(char *pszParmValue, char **ptr)
2494 if (sscanf(pszParmValue, "%d-%d", &low, &high) != 2)
2501 string_set(ptr, pszParmValue);
2506 /***************************************************************************
2507 Handle the WINS SERVER list
2508 ***************************************************************************/
2509 static BOOL handle_wins_server_list( char *pszParmValue, char **ptr )
2511 if( !wins_srv_load_list( pszParmValue ) )
2512 return( False ); /* Parse failed. */
2514 string_set( ptr, pszParmValue );
2519 /***************************************************************************
2520 Handle the DEBUG level list
2521 ***************************************************************************/
2522 static BOOL handle_debug_list( char *pszParmValueIn, char **ptr )
2524 pstring pszParmValue;
2526 pstrcpy(pszParmValue, pszParmValueIn);
2527 return debug_parse_levels( pszParmValue );
2531 /***************************************************************************
2532 initialise a copymap
2533 ***************************************************************************/
2534 static void init_copymap(service * pservice)
2537 if (pservice->copymap)
2538 free(pservice->copymap);
2539 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2540 if (!pservice->copymap)
2542 ("Couldn't allocate copymap!! (size %d)\n",
2543 (int)NUMPARAMETERS));
2545 for (i = 0; i < NUMPARAMETERS; i++)
2546 pservice->copymap[i] = True;
2550 /***************************************************************************
2551 return the local pointer to a parameter given the service number and the
2552 pointer into the default structure
2553 ***************************************************************************/
2554 void *lp_local_ptr(int snum, void *ptr)
2556 return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
2559 /***************************************************************************
2560 Process a parameter for a particular service number. If snum < 0
2561 then assume we are in the globals
2562 ***************************************************************************/
2563 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2566 void *parm_ptr = NULL; /* where we are going to store the result */
2567 void *def_ptr = NULL;
2569 parmnum = map_parameter(pszParmName);
2574 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2578 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2580 DEBUG(1, ("WARNING: The \"%s\"option is deprecated\n",
2584 def_ptr = parm_table[parmnum].ptr;
2586 /* we might point at a service, the default service or a global */
2593 if (parm_table[parmnum].class == P_GLOBAL)
2596 ("Global parameter %s found in service section!\n",
2601 ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
2607 if (!ServicePtrs[snum]->copymap)
2608 init_copymap(ServicePtrs[snum]);
2610 /* this handles the aliases - set the copymap for other entries with
2611 the same data pointer */
2612 for (i = 0; parm_table[i].label; i++)
2613 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2614 ServicePtrs[snum]->copymap[i] = False;
2617 /* if it is a special case then go ahead */
2618 if (parm_table[parmnum].special)
2620 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2624 /* now switch on the type of variable it is */
2625 switch (parm_table[parmnum].type)
2628 set_boolean(parm_ptr, pszParmValue);
2632 set_boolean(parm_ptr, pszParmValue);
2633 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2637 *(int *)parm_ptr = atoi(pszParmValue);
2641 *(char *)parm_ptr = *pszParmValue;
2645 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2649 *(char ***)parm_ptr = lp_list_make(pszParmValue);
2653 string_set(parm_ptr, pszParmValue);
2654 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2655 unix_to_dos(*(char **)parm_ptr, True);
2659 string_set(parm_ptr, pszParmValue);
2660 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2661 unix_to_dos(*(char **)parm_ptr, True);
2662 strupper(*(char **)parm_ptr);
2666 pstrcpy((char *)parm_ptr, pszParmValue);
2667 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2668 unix_to_dos((char *)parm_ptr, True);
2672 pstrcpy((char *)parm_ptr, pszParmValue);
2673 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2674 unix_to_dos((char *)parm_ptr, True);
2675 strupper((char *)parm_ptr);
2679 for (i = 0; parm_table[parmnum].enum_list[i].name;
2684 parm_table[parmnum].enum_list[i].name))
2687 parm_table[parmnum].
2700 /***************************************************************************
2701 Process a parameter.
2702 ***************************************************************************/
2703 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2705 if (!bInGlobalSection && bGlobalOnly)
2708 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2710 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2711 pszParmName, pszParmValue));
2715 /***************************************************************************
2716 print a parameter of the specified type
2717 ***************************************************************************/
2718 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f, char *(*dos_to_ext)(char *, BOOL))
2724 for (i = 0; p->enum_list[i].name; i++)
2726 if (*(int *)ptr == p->enum_list[i].value)
2729 p->enum_list[i].name);
2736 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2740 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2744 fprintf(f, "%d", *(int *)ptr);
2748 fprintf(f, "%c", *(char *)ptr);
2752 fprintf(f, "%s", octal_string(*(int *)ptr));
2756 if ((char ***)ptr && *(char ***)ptr) {
2757 char **list = *(char ***)ptr;
2759 if (p->flags & FLAG_DOS_STRING)
2760 for (; *list; list++)
2761 fprintf(f, "%s%s", dos_to_ext(*list, False),
2762 ((*(list+1))?", ":""));
2764 for (; *list; list++)
2765 fprintf(f, "%s%s", *list,
2766 ((*(list+1))?", ":""));
2773 if (p->flags & FLAG_DOS_STRING)
2774 fprintf(f, "%s", dos_to_ext((char *)ptr, False));
2776 fprintf(f, "%s", (char *)ptr);
2782 if (*(char **)ptr) {
2783 if(p->flags & FLAG_DOS_STRING)
2784 fprintf(f,"%s",dos_to_ext(*(char **)ptr, False));
2786 fprintf(f, "%s", *(char **)ptr);
2795 /***************************************************************************
2796 check if two parameters are equal
2797 ***************************************************************************/
2798 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2804 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2809 return (*((int *)ptr1) == *((int *)ptr2));
2812 return (*((char *)ptr1) == *((char *)ptr2));
2815 return lp_list_compare(*(char ***)ptr1, *(char ***)ptr2);
2820 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2825 return (p1 == p2 || strequal(p1, p2));
2830 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2835 return (p1 == p2 || strequal(p1, p2));
2843 /***************************************************************************
2844 Initialize any local varients in the sDefault table.
2845 ***************************************************************************/
2847 void init_locals(void)
2852 /***************************************************************************
2853 Process a new section (service). At this stage all sections are services.
2854 Later we'll have special sections that permit server parameters to be set.
2855 Returns True on success, False on failure. SectionName must be in DOS codepage.
2856 ***************************************************************************/
2857 static BOOL do_section(char *pszSectionName)
2860 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2861 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2864 /* if we were in a global section then do the local inits */
2865 if (bInGlobalSection && !isglobal)
2868 /* if we've just struck a global section, note the fact. */
2869 bInGlobalSection = isglobal;
2871 /* check for multiple global sections */
2872 if (bInGlobalSection)
2874 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
2878 if (!bInGlobalSection && bGlobalOnly)
2881 /* if we have a current service, tidy it up before moving on */
2884 if (iServiceIndex >= 0)
2885 bRetval = service_ok(iServiceIndex);
2887 /* if all is still well, move to the next record in the services array */
2890 /* We put this here to avoid an odd message order if messages are */
2891 /* issued by the post-processing of a previous section. */
2892 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
2894 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
2897 DEBUG(0, ("Failed to add a new service\n"));
2906 /***************************************************************************
2907 determine if a partcular base parameter is currently set to the default value.
2908 ***************************************************************************/
2909 static BOOL is_default(int i)
2911 if (!defaults_saved)
2913 switch (parm_table[i].type)
2916 return lp_list_compare (parm_table[i].def.lvalue,
2917 *(char ***)parm_table[i].ptr);
2920 return strequal(parm_table[i].def.svalue,
2921 *(char **)parm_table[i].ptr);
2924 return strequal(parm_table[i].def.svalue,
2925 (char *)parm_table[i].ptr);
2928 return parm_table[i].def.bvalue ==
2929 *(BOOL *)parm_table[i].ptr;
2931 return parm_table[i].def.cvalue ==
2932 *(char *)parm_table[i].ptr;
2936 return parm_table[i].def.ivalue ==
2937 *(int *)parm_table[i].ptr;
2945 /***************************************************************************
2946 Display the contents of the global structure.
2947 ***************************************************************************/
2948 static void dump_globals(FILE *f, char *(*dos_to_ext)(char *, BOOL))
2951 fprintf(f, "# Global parameters\n[global]\n");
2953 for (i = 0; parm_table[i].label; i++)
2954 if (parm_table[i].class == P_GLOBAL &&
2955 parm_table[i].ptr &&
2956 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2958 if (defaults_saved && is_default(i))
2960 fprintf(f, "\t%s = ", parm_table[i].label);
2961 print_parameter(&parm_table[i], parm_table[i].ptr, f, dos_to_ext);
2966 /***************************************************************************
2967 return True if a local parameter is currently set to the global default
2968 ***************************************************************************/
2969 BOOL lp_is_default(int snum, struct parm_struct *parm)
2971 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
2973 return equal_parameter(parm->type,
2974 ((char *)ServicePtrs[snum]) + pdiff,
2975 ((char *)&sDefault) + pdiff);
2979 /***************************************************************************
2980 Display the contents of a single services record.
2981 ***************************************************************************/
2982 static void dump_a_service(service * pService, FILE * f, char *(*dos_to_ext)(char *, BOOL))
2985 if (pService != &sDefault)
2986 fprintf(f, "\n[%s]\n", pService->szService);
2988 for (i = 0; parm_table[i].label; i++)
2989 if (parm_table[i].class == P_LOCAL &&
2990 parm_table[i].ptr &&
2991 (*parm_table[i].label != '-') &&
2992 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2994 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
2996 if (pService == &sDefault)
2998 if (defaults_saved && is_default(i))
3003 if (equal_parameter(parm_table[i].type,
3004 ((char *)pService) +
3006 ((char *)&sDefault) +
3011 fprintf(f, "\t%s = ", parm_table[i].label);
3012 print_parameter(&parm_table[i],
3013 ((char *)pService) + pdiff, f, dos_to_ext);
3019 /***************************************************************************
3020 return info about the next service in a service. snum==-1 gives the globals
3022 return NULL when out of parameters
3023 ***************************************************************************/
3024 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
3028 /* do the globals */
3029 for (; parm_table[*i].label; (*i)++)
3031 if (parm_table[*i].class == P_SEPARATOR)
3032 return &parm_table[(*i)++];
3034 if (!parm_table[*i].ptr
3035 || (*parm_table[*i].label == '-'))
3039 && (parm_table[*i].ptr ==
3040 parm_table[(*i) - 1].ptr))
3043 return &parm_table[(*i)++];
3048 service *pService = ServicePtrs[snum];
3050 for (; parm_table[*i].label; (*i)++)
3052 if (parm_table[*i].class == P_SEPARATOR)
3053 return &parm_table[(*i)++];
3055 if (parm_table[*i].class == P_LOCAL &&
3056 parm_table[*i].ptr &&
3057 (*parm_table[*i].label != '-') &&
3059 (parm_table[*i].ptr !=
3060 parm_table[(*i) - 1].ptr)))
3063 PTR_DIFF(parm_table[*i].ptr,
3066 if (allparameters ||
3067 !equal_parameter(parm_table[*i].type,
3068 ((char *)pService) +
3070 ((char *)&sDefault) +
3073 return &parm_table[(*i)++];
3084 /***************************************************************************
3085 Display the contents of a single copy structure.
3086 ***************************************************************************/
3087 static void dump_copy_map(BOOL *pcopymap)
3093 printf("\n\tNon-Copied parameters:\n");
3095 for (i = 0; parm_table[i].label; i++)
3096 if (parm_table[i].class == P_LOCAL &&
3097 parm_table[i].ptr && !pcopymap[i] &&
3098 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3100 printf("\t\t%s\n", parm_table[i].label);
3105 /***************************************************************************
3106 Return TRUE if the passed service number is within range.
3107 ***************************************************************************/
3108 BOOL lp_snum_ok(int iService)
3110 return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
3114 /***************************************************************************
3115 auto-load some home services
3116 ***************************************************************************/
3117 static void lp_add_auto_services(char *str)
3130 homes = lp_servicenumber(HOMES_NAME);
3132 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP))
3134 char *home = get_user_home_dir(p);
3136 if (lp_servicenumber(p) >= 0)
3139 if (home && homes >= 0)
3141 lp_add_home(p, homes, home);
3147 /***************************************************************************
3148 auto-load one printer
3149 ***************************************************************************/
3150 void lp_add_one_printer(char *name, char *comment)
3152 int printers = lp_servicenumber(PRINTERS_NAME);
3155 if (lp_servicenumber(name) < 0)
3157 lp_add_printer(name, printers);
3158 if ((i = lp_servicenumber(name)) >= 0)
3160 string_set(&ServicePtrs[i]->comment, comment);
3161 unix_to_dos(ServicePtrs[i]->comment, True);
3162 ServicePtrs[i]->autoloaded = True;
3167 /***************************************************************************
3168 have we loaded a services file yet?
3169 ***************************************************************************/
3170 BOOL lp_loaded(void)
3175 /***************************************************************************
3176 unload unused services
3177 ***************************************************************************/
3178 void lp_killunused(BOOL (*snumused) (int))
3181 for (i = 0; i < iNumServices; i++)
3186 if (!snumused || !snumused(i))
3188 ServicePtrs[i]->valid = False;
3189 free_service(ServicePtrs[i]);
3195 /***************************************************************************
3197 ***************************************************************************/
3198 void lp_killservice(int iServiceIn)
3200 if (VALID(iServiceIn))
3202 ServicePtrs[iServiceIn]->valid = False;
3203 free_service(ServicePtrs[iServiceIn]);
3207 /***************************************************************************
3208 save the curent values of all global and sDefault parameters into the
3209 defaults union. This allows swat and testparm to show only the
3210 changed (ie. non-default) parameters.
3211 ***************************************************************************/
3212 static void lp_save_defaults(void)
3215 for (i = 0; parm_table[i].label; i++)
3217 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3219 switch (parm_table[i].type)
3222 lp_list_copy(&(parm_table[i].def.lvalue),
3223 *(char ***)parm_table[i].ptr);
3227 parm_table[i].def.svalue =
3228 strdup(*(char **)parm_table[i].ptr);
3232 parm_table[i].def.svalue =
3233 strdup((char *)parm_table[i].ptr);
3237 parm_table[i].def.bvalue =
3238 *(BOOL *)parm_table[i].ptr;
3241 parm_table[i].def.cvalue =
3242 *(char *)parm_table[i].ptr;
3247 parm_table[i].def.ivalue =
3248 *(int *)parm_table[i].ptr;
3254 defaults_saved = True;
3257 /*******************************************************************
3258 Set the server type we will announce as via nmbd.
3259 ********************************************************************/
3260 static void set_server_role(void)
3262 server_role = ROLE_STANDALONE;
3264 switch (lp_security())
3268 if (lp_domain_logons())
3271 ("Server's Role (logon server) conflicts with share-level security\n"));
3278 if (lp_domain_logons())
3280 server_role = ROLE_DOMAIN_BDC;
3283 server_role = ROLE_DOMAIN_MEMBER;
3288 if (lp_domain_logons())
3290 server_role = ROLE_DOMAIN_PDC;
3298 ("Server's Role undefined due to unknown security mode\n"));
3304 /***************************************************************************
3305 Load the services array from the services file. Return True on success,
3307 ***************************************************************************/
3308 BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults,
3314 add_to_file_list(pszFname);
3318 bInGlobalSection = True;
3319 bGlobalOnly = global_only;
3329 pstrcpy(n2, pszFname);
3330 standard_sub_basic(n2);
3332 /* We get sections first, so have to start 'behind' to make up */
3334 bRetval = pm_process(n2, do_section, do_parameter);
3336 /* finish up the last section */
3337 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3339 if (iServiceIndex >= 0)
3340 bRetval = service_ok(iServiceIndex);
3342 lp_add_auto_services(lp_auto_services());
3345 lp_add_ipc("IPC$", True);
3346 lp_add_ipc("ADMIN$", False);
3350 set_default_server_announce_type();
3354 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3355 /* if bWINSsupport is true and we are in the client */
3357 if (in_client && Globals.bWINSsupport)
3360 string_set(&Globals.szWINSserver, "127.0.0.1");
3368 /***************************************************************************
3369 reset the max number of services
3370 ***************************************************************************/
3371 void lp_resetnumservices(void)
3376 /***************************************************************************
3377 return the max number of services
3378 ***************************************************************************/
3379 int lp_numservices(void)
3381 return (iNumServices);
3384 /***************************************************************************
3385 Display the contents of the services array in human-readable form.
3386 ***************************************************************************/
3387 void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint, char *(*dos_to_ext)(char *, BOOL))
3393 defaults_saved = False;
3396 dump_globals(f, dos_to_ext);
3398 dump_a_service(&sDefault, f, dos_to_ext);
3400 for (iService = 0; iService < maxtoprint; iService++)
3401 lp_dump_one(f, show_defaults, iService, dos_to_ext);
3404 /***************************************************************************
3405 Display the contents of one service in human-readable form.
3406 ***************************************************************************/
3407 void lp_dump_one(FILE * f, BOOL show_defaults, int snum, char *(*dos_to_ext)(char *, BOOL))
3411 if (ServicePtrs[snum]->szService[0] == '\0')
3413 dump_a_service(ServicePtrs[snum], f, dos_to_ext);
3418 /***************************************************************************
3419 Return the number of the service with the given name, or -1 if it doesn't
3420 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3421 getservicebyname()! This works ONLY if all services have been loaded, and
3422 does not copy the found service.
3423 ***************************************************************************/
3424 int lp_servicenumber(char *pszServiceName)
3428 for (iService = iNumServices - 1; iService >= 0; iService--)
3429 if (VALID(iService) &&
3430 strequal(lp_servicename(iService), pszServiceName))
3435 ("lp_servicenumber: couldn't find %s\n",
3441 /*******************************************************************
3442 a useful volume label function
3443 ******************************************************************/
3444 char *volume_label(int snum)
3446 char *ret = lp_volume(snum);
3448 /* lp_volume returns a unix charset - lp_servicename returns a
3449 dos codepage - convert so volume_label() always returns UNIX.
3451 char *p = dos_to_unix(lp_servicename(snum), False);
3452 int len = strlen(p)+1;
3453 ret = (char *)talloc(lp_talloc, len);
3454 memcpy(ret, p, len);
3460 /*******************************************************************
3461 Set the server type we will announce as via nmbd.
3462 ********************************************************************/
3463 static void set_default_server_announce_type(void)
3465 default_server_announce = 0;
3466 default_server_announce |= SV_TYPE_WORKSTATION;
3467 default_server_announce |= SV_TYPE_SERVER;
3468 default_server_announce |= SV_TYPE_SERVER_UNIX;
3469 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3471 switch (lp_announce_as())
3473 case ANNOUNCE_AS_NT_SERVER:
3475 default_server_announce |= SV_TYPE_SERVER_NT;
3476 /* fall through... */
3478 case ANNOUNCE_AS_NT_WORKSTATION:
3480 default_server_announce |= SV_TYPE_NT;
3483 case ANNOUNCE_AS_WIN95:
3485 default_server_announce |= SV_TYPE_WIN95_PLUS;
3488 case ANNOUNCE_AS_WFW:
3490 default_server_announce |= SV_TYPE_WFW;
3499 switch (lp_server_role())
3501 case ROLE_DOMAIN_MEMBER:
3503 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3506 case ROLE_DOMAIN_PDC:
3508 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3511 case ROLE_DOMAIN_BDC:
3513 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3516 case ROLE_STANDALONE:
3523 if (lp_time_server())
3525 default_server_announce |= SV_TYPE_TIME_SOURCE;
3528 if (lp_host_msdfs())
3530 default_server_announce |= SV_TYPE_DFS_SERVER;
3534 /***********************************************************
3535 returns role of Samba server
3536 ************************************************************/
3538 int lp_server_role(void)
3543 /***********************************************************
3544 If we are PDC then prefer us as DMB
3545 ************************************************************/
3547 BOOL lp_domain_master(void)
3549 if (Globals.bDomainMaster == Auto)
3551 return (lp_server_role() == ROLE_DOMAIN_PDC);
3554 return Globals.bDomainMaster;
3557 /***********************************************************
3558 If we are DMB then prefer us as LMB
3559 ************************************************************/
3561 BOOL lp_preferred_master(void)
3563 if (Globals.bPreferredMaster == Auto)
3565 return (lp_local_master() && lp_domain_master());
3568 return Globals.bPreferredMaster;
3573 /*******************************************************************
3575 ********************************************************************/
3576 void lp_remove_service(int snum)
3578 ServicePtrs[snum]->valid = False;
3581 /*******************************************************************
3582 copy a service. new_name must be in dos codepage
3583 ********************************************************************/
3584 void lp_copy_service(int snum, char *new_name)
3586 char *oldname = lp_servicename(snum);
3587 do_section(new_name);
3590 snum = lp_servicenumber(new_name);
3592 lp_do_parameter(snum, "copy", oldname);
3597 /*******************************************************************
3598 Get the default server type we will announce as via nmbd.
3599 ********************************************************************/
3600 int lp_default_server_announce(void)
3602 return default_server_announce;
3605 /*******************************************************************
3606 Split the announce version into major and minor numbers.
3607 ********************************************************************/
3608 int lp_major_announce_version(void)
3610 static BOOL got_major = False;
3611 static int major_version = DEFAULT_MAJOR_VERSION;
3616 return major_version;
3619 if ((vers = lp_announce_version()) == NULL)
3620 return major_version;
3622 if ((p = strchr(vers, '.')) == 0)
3623 return major_version;
3626 major_version = atoi(vers);
3627 return major_version;
3630 int lp_minor_announce_version(void)
3632 static BOOL got_minor = False;
3633 static int minor_version = DEFAULT_MINOR_VERSION;
3638 return minor_version;
3641 if ((vers = lp_announce_version()) == NULL)
3642 return minor_version;
3644 if ((p = strchr(vers, '.')) == 0)
3645 return minor_version;
3648 minor_version = atoi(p);
3649 return minor_version;
3652 /***********************************************************
3653 Set the global name resolution order (used in smbclient).
3654 ************************************************************/
3656 void lp_set_name_resolve_order(char *new_order)
3658 Globals.szNameResolveOrder = new_order;
3661 char *lp_printername(int snum)
3663 char *ret = _lp_printername(snum);
3664 if (ret == NULL || (ret != NULL && *ret == '\0'))
3665 ret = lp_servicename(snum);
3671 /***********************************************************
3672 List Parameters manipulation functions
3673 ***********************************************************/
3675 #define P_LIST_ABS 16 /* P_LIST Allocation Block Size */
3677 char **lp_list_make(char *string)
3679 char **list, **rlist;
3684 if (!string || !*string) return NULL;
3686 if (!str || !*str) return NULL;
3689 list = (char**)malloc(((sizeof(char**)) * P_LIST_ABS));
3694 memset (list, 0, ((sizeof(char**)) * P_LIST_ABS));
3701 if (!next_token(&str, tok, LIST_SEP, sizeof(pstring))) continue;
3703 if ((num +1) == lsize) {
3704 lsize += P_LIST_ABS;
3705 rlist = (char **)realloc(list, ((sizeof(char **)) * lsize));
3707 lp_list_free (list);
3712 memset (&list[num], 0, ((sizeof(char**)) * P_LIST_ABS));
3715 list[num] = strdup(tok);
3717 lp_list_free (list);
3729 BOOL lp_list_copy(char ***dest, char **src)
3731 char **list, **rlist;
3735 if (!src) return False;
3737 list = (char**)malloc(((sizeof(char**)) * P_LIST_ABS));
3738 if (!list) return False;
3739 memset (list, 0, ((sizeof(char**)) * P_LIST_ABS));
3742 for (num = 0; src[num]; num++)
3744 if ((num +1) == lsize) {
3745 lsize += P_LIST_ABS;
3746 rlist = (char **)realloc(list, ((sizeof(char **)) * lsize));
3748 lp_list_free (list);
3752 memset (&list[num], 0, ((sizeof(char**)) * P_LIST_ABS));
3755 list[num] = strdup(src[num]);
3757 lp_list_free (list);
3766 /* return true if all the elemnts of the list matches exactly */
3767 BOOL lp_list_compare(char **list1, char **list2)
3771 if (!list1 || !list2) return (list1 == list2);
3773 for (num = 0; list1[num]; num++) {
3774 if (!list2[num]) return False;
3775 if (!strcsequal(list1[num], list2[num])) return False;
3777 if (list2[num]) return False; /* if list2 has more elements than list1 fail */
3782 void lp_list_free(char **list)
3784 char **tlist = list;
3787 for(; *tlist; tlist++) free(*tlist);