2 Unix SMB/Netbios implementation.
4 Parameter loading functions
5 Copyright (C) Karl Auer 1993-1998
7 Largely re-written by Andrew Tridgell, September 1994
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 * This module provides suitable callback functions for the params
28 * module. It builds the internal table of service details which is
29 * then used by the rest of the server.
33 * 1) add it to the global or service structure definition
34 * 2) add it to the parm_table
35 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
36 * 4) If it's a global then initialise it in init_globals. If a local
37 * (ie. service) parameter then initialise it in the sDefault structure
41 * The configuration file is processed sequentially for speed. It is NOT
42 * accessed randomly as happens in 'real' Windows. For this reason, there
43 * is a fair bit of sequence-dependent code here - ie., code which assumes
44 * that certain things happen before others. In particular, the code which
45 * happens at the boundary between sections is delicately poised, so be
52 /* Set default coding system for KANJI if none specified in Makefile. */
54 * We treat KANJI specially due to historical precedent (it was the
55 * first non-english codepage added to Samba). With the new dynamic
56 * codepage support this is not needed anymore.
58 * The define 'KANJI' is being overloaded to mean 'use kanji codepage
59 * by default' and also 'this is the filename-to-disk conversion
60 * method to use'. This really should be removed and all control
61 * over this left in the smb.conf parameters 'client codepage'
62 * and 'coding system'.
68 BOOL in_client = False; /* Not in the client by default */
71 extern int DEBUGLEVEL;
72 extern pstring user_socket_options;
73 extern pstring global_myname;
74 pstring global_scope = "";
77 #define GLOBAL_NAME "global"
81 #define PRINTERS_NAME "printers"
85 #define HOMES_NAME "homes"
88 /* some helpful bits */
89 #define pSERVICE(i) ServicePtrs[i]
90 #define iSERVICE(i) (*pSERVICE(i))
91 #define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
92 #define VALID(i) iSERVICE(i).valid
94 int keepalive = DEFAULT_KEEPALIVE;
95 extern BOOL use_getwd_cache;
97 extern int extra_time_offset;
99 static BOOL defaults_saved = False;
102 * This structure describes global (ie., server-wide) parameters.
106 char *szPrintcapname;
109 char *szDefaultService;
113 char *szServerString;
114 char *szAutoServices;
115 char *szPasswdProgram;
119 char *szSMBPasswdFile;
120 char *szPasswordServer;
121 char *szSocketOptions;
124 char *szDomainAdminGroup;
125 char *szDomainGuestGroup;
126 char *szDomainAdminUsers;
127 char *szDomainGuestUsers;
128 char *szDomainHostsallow;
129 char *szDomainHostsdeny;
131 #ifdef USING_GROUPNAME_MAP
132 char *szGroupnameMap;
133 #endif /* USING_GROUPNAME_MAP */
134 char *szCharacterSet;
141 char *szCodingSystem;
143 char *szRemoteAnnounce;
144 char *szRemoteBrowseSync;
145 char *szSocketAddress;
146 char *szNISHomeMapName;
147 char *szAnnounceVersion; /* This is initialised in init_globals */
148 char *szNetbiosAliases;
149 char *szDomainOtherSIDs;
150 char *szDomainGroups;
151 char *szNameResolveOrder;
156 char *szLdapRootPassword;
158 char *szAddUserScript;
159 char *szDelUserScript;
163 #endif /* WITH_UTMP */
167 char *szTemplateHomedir;
168 char *szTemplateShell;
169 char *szWinbindSeparator;
192 int client_code_page;
193 int announce_as; /* This is initialised in init_globals */
194 int machine_password_timeout;
195 int change_notify_timeout;
198 int min_passwd_length;
199 int oplock_break_wait_time;
200 int winbind_cache_time;
203 #endif /* WITH_LDAP */
206 char *sslHostsRequire;
207 char *sslHostsResign;
213 char *sslClientPrivKey;
216 BOOL sslReqClientCert;
217 BOOL sslReqServerCert;
218 BOOL sslCompatibility;
219 #endif /* WITH_SSL */
224 BOOL bPreferredMaster;
227 BOOL bEncryptPasswords;
235 BOOL bReadPrediction;
242 BOOL bBindInterfacesOnly;
243 BOOL bUnixPasswdSync;
244 BOOL bPasswdChatDebug;
251 BOOL bAllowTrustedDomains;
252 BOOL bRestrictAnonymous;
253 BOOL bDebugHiresTimestamp;
260 static global Globals;
265 * This structure describes a single service.
274 char *szGuestaccount;
275 char *szInvalidUsers;
283 char *szRootPostExec;
284 char *szPrintcommand;
287 char *szLppausecommand;
288 char *szLpresumecommand;
289 char *szQueuepausecommand;
290 char *szQueueresumecommand;
292 char *szPrinterDriver;
293 char *szPrinterDriverLocation;
303 char *szVetoOplockFiles;
311 char *szVfsObjectFile;
316 int iCreate_force_mode;
318 int iSecurity_force_mode;
321 int iDir_Security_mask;
322 int iDir_Security_force_mode;
326 int iOplockContentionLimit;
329 BOOL bRootpreexecClose;
332 BOOL bShortCasePreserve;
364 BOOL bDeleteReadonly;
366 BOOL bDeleteVetoFiles;
368 BOOL bDosFiletimeResolution;
369 BOOL bFakeDirCreateTimes;
374 char dummy[3]; /* for alignment */
379 /* This is a default service used to prime a services structure */
380 static service sDefault = {
382 False, /* not autoloaded */
383 NULL, /* szService */
385 NULL, /* szUsername */
386 NULL, /* szGuestAccount - this is set in init_globals() */
387 NULL, /* szInvalidUsers */
388 NULL, /* szValidUsers */
389 NULL, /* szAdminUsers */
391 NULL, /* szInclude */
392 NULL, /* szPreExec */
393 NULL, /* szPostExec */
394 NULL, /* szRootPreExec */
395 NULL, /* szRootPostExec */
396 NULL, /* szPrintcommand */
397 NULL, /* szLpqcommand */
398 NULL, /* szLprmcommand */
399 NULL, /* szLppausecommand */
400 NULL, /* szLpresumecommand */
401 NULL, /* szQueuepausecommand */
402 NULL, /* szQueueresumecommand */
403 NULL, /* szPrintername */
404 NULL, /* szPrinterDriver - this is set in init_globals() */
405 NULL, /* szPrinterDriverLocation */
406 NULL, /* szDriverFile */
407 NULL, /* szDontdescend */
408 NULL, /* szHostsallow */
409 NULL, /* szHostsdeny */
410 NULL, /* szMagicScript */
411 NULL, /* szMagicOutput */
412 NULL, /* szMangledMap */
413 NULL, /* szVetoFiles */
414 NULL, /* szHideFiles */
415 NULL, /* szVetoOplockFiles */
417 NULL, /* force user */
418 NULL, /* force group */
420 NULL, /* writelist */
423 NULL, /* vfs object */
424 NULL, /* vfs options */
425 0, /* iMinPrintSpace */
426 0, /* iWriteCacheSize */
427 0744, /* iCreate_mask */
428 0000, /* iCreate_force_mode */
429 -1, /* iSecurity_mask */
430 -1, /* iSecurity_force_mode */
431 0755, /* iDir_mask */
432 0000, /* iDir_force_mode */
433 -1, /* iDir_Security_mask */
434 -1, /* iDir_Security_force_mode */
435 0, /* iMaxConnections */
436 CASE_LOWER, /* iDefaultCase */
437 DEFAULT_PRINTING, /* iPrinting */
438 2, /* iOplockContentionLimit */
439 False, /* bAlternatePerm */
440 False, /* bPreexecClose */
441 False, /* bRootpreexecClose */
442 False, /* case sensitive */
443 True, /* case preserve */
444 True, /* short case preserve */
445 False, /* case mangle */
447 True, /* bHideDotFiles */
448 True, /* bBrowseable */
449 True, /* bAvailable */
450 True, /* bRead_only */
451 True, /* bNo_set_dir */
452 False, /* bGuest_only */
453 False, /* bGuest_ok */
454 False, /* bPrint_ok */
455 False, /* bPostscript */
456 False, /* bMap_system */
457 False, /* bMap_hidden */
458 True, /* bMap_archive */
460 False, /* bStrictLocking */
461 True, /* bPosixLocking */
465 True, /* bShareModes */
467 True, /* bLevel2OpLocks */
468 False, /* bOnlyUser */
469 True, /* bMangledNames */
470 True, /* bWidelinks */
471 True, /* bSymlinks */
472 False, /* bSyncAlways */
473 False, /* bStrictSync */
474 '~', /* magic char */
476 False, /* bDeleteReadonly */
477 False, /* bFakeOplocks */
478 False, /* bDeleteVetoFiles */
479 False, /* bDosFiletimes */
480 False, /* bDosFiletimeResolution */
481 False, /* bFakeDirCreateTimes */
482 True, /* bBlockingLocks */
483 False, /* bInheritPerms */
484 False, /* bMSDfsRoot */
491 /* local variables */
492 static service **ServicePtrs = NULL;
493 static int iNumServices = 0;
494 static int iServiceIndex = 0;
495 static BOOL bInGlobalSection = True;
496 static BOOL bGlobalOnly = False;
497 static int server_role;
498 static int default_server_announce;
500 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
502 /* prototypes for the special type handlers */
503 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
504 static BOOL handle_include(char *pszParmValue, char **ptr);
505 static BOOL handle_copy(char *pszParmValue, char **ptr);
506 static BOOL handle_character_set(char *pszParmValue, char **ptr);
507 static BOOL handle_coding_system(char *pszParmValue, char **ptr);
508 static BOOL handle_client_code_page(char *pszParmValue, char **ptr);
509 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
510 static BOOL handle_source_env(char *pszParmValue, char **ptr);
511 static BOOL handle_netbios_name(char *pszParmValue, char **ptr);
512 static BOOL handle_winbind_id(char *pszParmValue, char **ptr);
514 static void set_server_role(void);
515 static void set_default_server_announce_type(void);
517 static struct enum_list enum_protocol[] = {
518 {PROTOCOL_NT1, "NT1"},
519 {PROTOCOL_LANMAN2, "LANMAN2"},
520 {PROTOCOL_LANMAN1, "LANMAN1"},
521 {PROTOCOL_CORE, "CORE"},
522 {PROTOCOL_COREPLUS, "COREPLUS"},
523 {PROTOCOL_COREPLUS, "CORE+"},
527 static struct enum_list enum_security[] = {
528 {SEC_SHARE, "SHARE"},
530 {SEC_SERVER, "SERVER"},
531 {SEC_DOMAIN, "DOMAIN"},
535 static struct enum_list enum_printing[] = {
536 {PRINT_SYSV, "sysv"},
538 {PRINT_HPUX, "hpux"},
542 {PRINT_LPRNG, "lprng"},
543 {PRINT_SOFTQ, "softq"},
544 {PRINT_CUPS, "cups"},
548 /* Types of machine we can announce as. */
549 #define ANNOUNCE_AS_NT_SERVER 1
550 #define ANNOUNCE_AS_WIN95 2
551 #define ANNOUNCE_AS_WFW 3
552 #define ANNOUNCE_AS_NT_WORKSTATION 4
554 static struct enum_list enum_announce_as[] = {
555 {ANNOUNCE_AS_NT_SERVER, "NT"},
556 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
557 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
558 {ANNOUNCE_AS_WIN95, "win95"},
559 {ANNOUNCE_AS_WFW, "WfW"},
563 static struct enum_list enum_case[] = {
564 {CASE_LOWER, "lower"},
565 {CASE_UPPER, "upper"},
569 static struct enum_list enum_bool_auto[] = {
577 Do you want session setups at user level security with a invalid
578 password to be rejected or allowed in as guest? WinNT rejects them
579 but it can be a pain as it means "net view" needs to use a password
581 You have 3 choices in the setting of map_to_guest:
583 "Never" means session setups with an invalid password
584 are rejected. This is the default.
586 "Bad User" means session setups with an invalid password
587 are rejected, unless the username does not exist, in which case it
588 is treated as a guest login
590 "Bad Password" means session setups with an invalid password
591 are treated as a guest login
593 Note that map_to_guest only has an effect in user or server
597 static struct enum_list enum_map_to_guest[] = {
598 {NEVER_MAP_TO_GUEST, "Never"},
599 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
600 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
605 static struct enum_list enum_ssl_version[] = {
606 {SMB_SSL_V2, "ssl2"},
607 {SMB_SSL_V3, "ssl3"},
608 {SMB_SSL_V23, "ssl2or3"},
609 {SMB_SSL_TLS1, "tls1"},
614 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
615 static struct parm_struct parm_table[] = {
616 {"Base Options", P_SEP, P_SEPARATOR},
618 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
619 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, handle_client_code_page, NULL, 0},
620 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
621 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
622 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING},
623 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
624 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC | FLAG_DOS_STRING},
625 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING},
626 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, FLAG_DOS_STRING},
627 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
628 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC},
629 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, 0},
631 {"Security Options", P_SEP, P_SEPARATOR},
633 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC},
634 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC},
635 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
636 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, 0},
637 {"alternate permissions", P_BOOL, P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL | FLAG_DEPRECATED},
638 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
639 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
640 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
641 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
642 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
643 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
644 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
645 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
646 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
647 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
649 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
650 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
651 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
652 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
653 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
654 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
655 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
656 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0},
657 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
659 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
660 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
661 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
663 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
664 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
665 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
666 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
667 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
668 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
669 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
670 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
671 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
673 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE},
674 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
675 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
676 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
678 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
679 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
680 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
681 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
682 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
683 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
684 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
685 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
686 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
687 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
688 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
689 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
690 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
692 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
693 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
695 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
696 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
697 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
698 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
699 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
702 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
703 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0},
705 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0},
706 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
707 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0},
708 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0},
709 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0},
710 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0},
711 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0},
712 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0},
713 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0},
714 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0},
715 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0},
716 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
717 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0},
718 #endif /* WITH_SSL */
720 {"Logging Options", P_SEP, P_SEPARATOR},
721 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_BASIC},
722 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, 0},
723 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
724 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
725 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
727 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
728 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
729 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
730 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
731 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
732 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
734 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT},
736 {"Protocol Options", P_SEP, P_SEPARATOR},
738 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
739 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
740 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
741 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
743 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
744 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
745 {"nt acl support", P_BOOL, P_GLOBAL, &Globals.bNTAclSupport, NULL, NULL, 0},
746 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
747 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
748 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
749 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
751 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
752 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
753 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
754 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
755 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
756 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
757 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
759 {"Tuning Options", P_SEP, P_SEPARATOR},
761 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
762 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
763 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
764 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
766 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
767 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
768 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
769 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
770 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
771 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
773 {"shared mem size", P_INTEGER, P_GLOBAL, &Globals.shmem_size, NULL, NULL, 0},
774 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
775 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
776 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
777 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
778 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
780 {"Printing Options", P_SEP, P_SEPARATOR},
782 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
783 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
784 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
785 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
786 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
787 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
788 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
789 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
790 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
791 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
792 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
793 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
794 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
795 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
797 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
798 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, 0},
799 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT},
800 {"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT},
801 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
803 {"Filename Handling", P_SEP, P_SEPARATOR},
804 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
806 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
807 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
808 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
809 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
810 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
811 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
812 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
813 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
814 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
815 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
816 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
817 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
818 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
819 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
820 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
821 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
822 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
823 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
824 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
825 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
827 {"Domain Options", P_SEP, P_SEPARATOR},
829 {"domain groups", P_STRING, P_GLOBAL, &Globals.szDomainGroups, NULL, NULL, 0},
830 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
831 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
832 {"domain admin users", P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL, NULL, 0},
833 {"domain guest users", P_STRING, P_GLOBAL, &Globals.szDomainGuestUsers, NULL, NULL, 0},
834 #ifdef USING_GROUPNAME_MAP
836 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
837 #endif /* USING_GROUPNAME_MAP */
839 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
841 {"Logon Options", P_SEP, P_SEPARATOR},
843 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
844 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
845 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
846 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
847 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
848 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
849 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
851 {"Browse Options", P_SEP, P_SEPARATOR},
853 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
854 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, 0},
855 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
856 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
857 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
858 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
859 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
860 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
861 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
862 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
864 {"WINS Options", P_SEP, P_SEPARATOR},
865 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
866 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
868 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL, NULL, FLAG_BASIC},
869 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
870 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
872 {"Locking Options", P_SEP, P_SEPARATOR},
874 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
875 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
876 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
877 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
879 {"utmp", P_BOOL, P_LOCAL, &sDefault.bUtmp, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
882 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
883 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
884 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
885 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
886 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
887 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
888 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
891 {"Ldap Options", P_SEP, P_SEPARATOR},
893 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
894 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
895 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
896 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0},
897 {"ldap root", P_STRING, P_GLOBAL, &Globals.szLdapRoot, NULL, NULL, 0},
898 {"ldap root passwd", P_STRING, P_GLOBAL, &Globals.szLdapRootPassword, NULL, NULL, 0},
899 #endif /* WITH_LDAP */
901 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
902 {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
904 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
905 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
906 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
907 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
908 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
910 {"utmp dir", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
911 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
912 #endif /* WITH_UTMP */
914 {"default service", P_STRING, P_GLOBAL,
915 &Globals.szDefaultService, NULL, NULL, 0},
916 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
917 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
918 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
919 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
920 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
921 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0},
922 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
923 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
924 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
925 {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0},
926 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
927 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
929 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
930 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
931 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
932 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
934 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
935 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
936 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
937 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
938 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
939 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
940 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE},
941 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
942 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
943 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0},
944 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
945 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
946 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
947 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
948 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
949 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
950 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
951 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
953 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
954 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
956 {"VFS options", P_SEP, P_SEPARATOR},
958 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, 0},
959 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, 0},
962 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
963 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_GLOBAL},
965 {"Winbind options", P_SEP, P_SEPARATOR},
967 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_id, NULL, 0},
968 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_id, NULL, 0},
969 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, 0},
970 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, 0},
971 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, 0},
972 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
974 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
979 /***************************************************************************
980 Initialise the global parameter structure.
981 ***************************************************************************/
982 static void init_globals(void)
984 static BOOL done_init = False;
990 memset((void *)&Globals, '\0', sizeof(Globals));
992 for (i = 0; parm_table[i].label; i++)
993 if ((parm_table[i].type == P_STRING ||
994 parm_table[i].type == P_USTRING) &&
996 string_set(parm_table[i].ptr, "");
998 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
999 string_set(&sDefault.szPrinterDriver, "NULL");
1000 string_set(&sDefault.fstype, FSTYPE_STRING);
1006 DEBUG(3, ("Initialising global parameters\n"));
1008 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
1010 * Allow the default PASSWD_CHAT to be overridden in local.h.
1012 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1013 string_set(&Globals.szWorkGroup, WORKGROUP);
1014 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1015 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1016 string_set(&Globals.szLockDir, LOCKDIR);
1018 string_set(&Globals.szUtmpDir, "");
1019 #endif /* WITH_UTMP */
1020 string_set(&Globals.szSmbrun, SMBRUN);
1021 string_set(&Globals.szSocketAddress, "0.0.0.0");
1022 pstrcpy(s, "Samba ");
1023 pstrcat(s, VERSION);
1024 string_set(&Globals.szServerString, s);
1025 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1026 DEFAULT_MINOR_VERSION);
1027 string_set(&Globals.szAnnounceVersion, s);
1029 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1031 string_set(&Globals.szLogonDrive, "");
1032 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1033 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1034 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1036 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1038 Globals.bLoadPrinters = True;
1039 Globals.bUseRhosts = False;
1040 Globals.max_packet = 65535;
1041 Globals.mangled_stack = 50;
1042 Globals.max_xmit = 65535;
1043 Globals.max_mux = 50; /* This is *needed* for profile support. */
1044 Globals.lpqcachetime = 10;
1045 Globals.pwordlevel = 0;
1046 Globals.unamelevel = 0;
1047 Globals.deadtime = 0;
1048 Globals.max_log_size = 5000;
1049 Globals.max_open_files = MAX_OPEN_FILES;
1050 Globals.maxprotocol = PROTOCOL_NT1;
1051 Globals.security = SEC_USER;
1052 Globals.bEncryptPasswords = False;
1053 Globals.bUpdateEncrypt = False;
1054 Globals.bReadRaw = True;
1055 Globals.bWriteRaw = True;
1056 Globals.bReadPrediction = False;
1057 Globals.bReadbmpx = False;
1058 Globals.bNullPasswords = False;
1059 Globals.bStripDot = False;
1061 Globals.bSyslogOnly = False;
1062 Globals.bTimestampLogs = False;
1063 Globals.bDebugHiresTimestamp = False;
1064 Globals.bDebugPid = False;
1065 Globals.bDebugUid = False;
1066 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1067 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1068 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1069 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1070 Globals.change_notify_timeout = 60; /* 1 minute default. */
1071 Globals.ReadSize = 16 * 1024;
1072 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1073 Globals.lm_interval = 60;
1074 Globals.shmem_size = SHMEM_SIZE;
1075 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1076 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1077 Globals.bUnixRealname = True;
1078 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1079 Globals.bNISHomeMap = False;
1080 #ifdef WITH_NISPLUS_HOME
1081 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1083 string_set(&Globals.szNISHomeMapName, "auto.home");
1086 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1087 Globals.bTimeServer = False;
1088 Globals.bBindInterfacesOnly = False;
1089 Globals.bUnixPasswdSync = False;
1090 Globals.bPasswdChatDebug = False;
1091 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
1092 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1093 Globals.bNTAclSupport = True; /* Use NT ACLs by default. */
1094 Globals.bStatCache = True; /* use stat cache by default */
1095 Globals.bRestrictAnonymous = False;
1096 Globals.map_to_guest = 0; /* By Default, "Never" */
1097 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1098 Globals.oplock_break_wait_time = 10; /* By Default, 10 msecs. */
1101 /* default values for ldap */
1102 string_set(&Globals.szLdapServer, "localhost");
1103 Globals.ldap_port = 389;
1104 #endif /* WITH_LDAP */
1107 Globals.sslVersion = SMB_SSL_V23;
1108 string_set(&Globals.sslHostsRequire, "");
1109 string_set(&Globals.sslHostsResign, "");
1110 string_set(&Globals.sslCaCertDir, "");
1111 string_set(&Globals.sslCaCertFile, "");
1112 string_set(&Globals.sslCert, "");
1113 string_set(&Globals.sslPrivKey, "");
1114 string_set(&Globals.sslClientCert, "");
1115 string_set(&Globals.sslClientPrivKey, "");
1116 string_set(&Globals.sslCiphers, "");
1117 Globals.sslEnabled = False;
1118 Globals.sslReqClientCert = False;
1119 Globals.sslReqServerCert = False;
1120 Globals.sslCompatibility = False;
1121 #endif /* WITH_SSL */
1123 /* these parameters are set to defaults that are more appropriate
1124 for the increasing samba install base:
1126 as a member of the workgroup, that will possibly become a
1127 _local_ master browser (lm = True). this is opposed to a forced
1128 local master browser startup (pm = True).
1130 doesn't provide WINS server service by default (wsupp = False),
1131 and doesn't provide domain master browser services by default, either.
1135 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1136 Globals.os_level = 20;
1137 Globals.bLocalMaster = True;
1138 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1139 Globals.bDomainLogons = False;
1140 Globals.bBrowseList = True;
1141 Globals.bWINSsupport = False;
1142 Globals.bWINSproxy = False;
1144 Globals.bDNSproxy = True;
1146 /* this just means to use them if they exist */
1147 Globals.bKernelOplocks = True;
1149 Globals.bAllowTrustedDomains = True;
1151 string_set(&Globals.szTemplateShell, "/bin/false");
1152 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1153 string_set(&Globals.szWinbindSeparator, "\\");
1154 Globals.winbind_cache_time = 15;
1157 * This must be done last as it checks the value in
1161 interpret_coding_system(KANJI);
1164 /***************************************************************************
1165 Initialise the sDefault parameter structure.
1166 ***************************************************************************/
1167 static void init_locals(void)
1169 string_set(&sDefault.szDriverFile, DRIVERFILE);
1171 /* choose defaults depending on the type of printing */
1172 switch (sDefault.iPrinting)
1176 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1177 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1178 string_set(&sDefault.szPrintcommand,
1184 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1185 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1186 string_set(&sDefault.szPrintcommand,
1188 string_set(&sDefault.szQueuepausecommand,
1190 string_set(&sDefault.szQueueresumecommand,
1192 string_set(&sDefault.szLppausecommand,
1194 string_set(&sDefault.szLpresumecommand,
1195 "lpc release %p %j");
1199 string_set(&sDefault.szLpqcommand,
1200 "/usr/bin/lpstat -o%p");
1201 string_set(&sDefault.szLprmcommand,
1202 "/usr/bin/cancel %p-%j");
1203 string_set(&sDefault.szPrintcommand,
1204 "/usr/bin/lp -d%p -oraw %s; rm %s");
1205 string_set(&sDefault.szQueuepausecommand,
1206 "/usr/bin/disable %p");
1207 string_set(&sDefault.szQueueresumecommand,
1208 "/usr/bin/enable %p");
1213 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1214 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1215 string_set(&sDefault.szPrintcommand,
1216 "lp -c -d%p %s; rm %s");
1217 string_set(&sDefault.szQueuepausecommand,
1219 string_set(&sDefault.szQueueresumecommand,
1222 string_set(&sDefault.szLppausecommand,
1223 "lp -i %p-%j -H hold");
1224 string_set(&sDefault.szLpresumecommand,
1225 "lp -i %p-%j -H resume");
1230 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1231 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1232 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1236 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1237 string_set(&sDefault.szLprmcommand,
1238 "qstat -s -j%j -c");
1239 string_set(&sDefault.szPrintcommand,
1240 "lp -d%p -s %s; rm %s");
1241 string_set(&sDefault.szLppausecommand,
1242 "qstat -s -j%j -h");
1243 string_set(&sDefault.szLpresumecommand,
1244 "qstat -s -j%j -r");
1250 static TALLOC_CTX *lp_talloc;
1252 /******************************************************************* a
1253 free up temporary memory - called from the main loop
1254 ********************************************************************/
1255 void lp_talloc_free(void)
1259 talloc_destroy(lp_talloc);
1263 /*******************************************************************
1264 convenience routine to grab string parameters into temporary memory
1265 and run standard_sub_basic on them. The buffers can be written to by
1266 callers without affecting the source string.
1267 ********************************************************************/
1268 static char *lp_string(const char *s)
1270 size_t len = s ? strlen(s) : 0;
1274 lp_talloc = talloc_init();
1276 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1284 StrnCpy(ret, s, len);
1286 trim_string(ret, "\"", "\"");
1288 standard_sub_basic(ret);
1294 In this section all the functions that are used to access the
1295 parameters from the rest of the program are defined
1298 #define FN_GLOBAL_STRING(fn_name,ptr) \
1299 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1300 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1301 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1302 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1303 char fn_name(void) {return(*(char *)(ptr));}
1304 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1305 int fn_name(void) {return(*(int *)(ptr));}
1307 #define FN_LOCAL_STRING(fn_name,val) \
1308 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1309 #define FN_LOCAL_BOOL(fn_name,val) \
1310 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1311 #define FN_LOCAL_CHAR(fn_name,val) \
1312 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1313 #define FN_LOCAL_INTEGER(fn_name,val) \
1314 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1316 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1317 FN_GLOBAL_STRING(lp_smbrun, &Globals.szSmbrun)
1318 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1319 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1320 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1321 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1322 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1324 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1325 #endif /* WITH_UTMP */
1326 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1327 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1328 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1329 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1330 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1331 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1332 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1333 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1334 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1335 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1336 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1337 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1338 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1339 #ifdef USING_GROUPNAME_MAP
1340 FN_GLOBAL_STRING(lp_groupname_map, &Globals.szGroupnameMap)
1341 #endif /* USING_GROUPNAME_MAP */
1342 FN_GLOBAL_STRING(lp_logon_script, &Globals.szLogonScript)
1343 FN_GLOBAL_STRING(lp_logon_path, &Globals.szLogonPath)
1344 FN_GLOBAL_STRING(lp_logon_drive, &Globals.szLogonDrive)
1345 FN_GLOBAL_STRING(lp_logon_home, &Globals.szLogonHome)
1346 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1347 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1348 FN_GLOBAL_STRING(lp_wins_server, &Globals.szWINSserver)
1349 FN_GLOBAL_STRING(lp_interfaces, &Globals.szInterfaces)
1350 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1351 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1352 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1353 FN_GLOBAL_STRING(lp_netbios_aliases, &Globals.szNetbiosAliases)
1354 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1355 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1356 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1357 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1358 FN_GLOBAL_STRING(lp_domain_groups, &Globals.szDomainGroups)
1359 FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
1360 FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
1361 FN_GLOBAL_STRING(lp_domain_admin_users, &Globals.szDomainAdminUsers)
1362 FN_GLOBAL_STRING(lp_domain_guest_users, &Globals.szDomainGuestUsers)
1363 FN_GLOBAL_STRING(lp_winbind_uid, &Globals.szWinbindUID)
1364 FN_GLOBAL_STRING(lp_winbind_gid, &Globals.szWinbindGID)
1365 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1366 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1367 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1369 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer);
1370 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix);
1371 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter);
1372 FN_GLOBAL_STRING(lp_ldap_root, &Globals.szLdapRoot);
1373 FN_GLOBAL_STRING(lp_ldap_rootpasswd, &Globals.szLdapRootPassword);
1374 #endif /* WITH_LDAP */
1377 FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion);
1378 FN_GLOBAL_STRING(lp_ssl_hosts, &Globals.sslHostsRequire);
1379 FN_GLOBAL_STRING(lp_ssl_hosts_resign, &Globals.sslHostsResign);
1380 FN_GLOBAL_STRING(lp_ssl_cacertdir, &Globals.sslCaCertDir);
1381 FN_GLOBAL_STRING(lp_ssl_cacertfile, &Globals.sslCaCertFile);
1382 FN_GLOBAL_STRING(lp_ssl_cert, &Globals.sslCert);
1383 FN_GLOBAL_STRING(lp_ssl_privkey, &Globals.sslPrivKey);
1384 FN_GLOBAL_STRING(lp_ssl_client_cert, &Globals.sslClientCert);
1385 FN_GLOBAL_STRING(lp_ssl_client_privkey, &Globals.sslClientPrivKey);
1386 FN_GLOBAL_STRING(lp_ssl_ciphers, &Globals.sslCiphers);
1387 FN_GLOBAL_BOOL(lp_ssl_enabled, &Globals.sslEnabled);
1388 FN_GLOBAL_BOOL(lp_ssl_reqClientCert, &Globals.sslReqClientCert);
1389 FN_GLOBAL_BOOL(lp_ssl_reqServerCert, &Globals.sslReqServerCert);
1390 FN_GLOBAL_BOOL(lp_ssl_compatibility, &Globals.sslCompatibility);
1391 #endif /* WITH_SSL */
1393 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1394 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1395 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1396 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1397 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1398 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1399 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1400 FN_GLOBAL_BOOL(lp_use_rhosts, &Globals.bUseRhosts)
1401 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1402 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1403 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1404 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1405 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1406 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1407 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1408 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1409 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1410 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1411 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1412 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1413 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1414 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1415 FN_GLOBAL_BOOL(lp_unix_realname, &Globals.bUnixRealname)
1416 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1417 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1418 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1419 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1420 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1421 FN_GLOBAL_BOOL(lp_nt_smb_support, &Globals.bNTSmbSupport)
1422 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1423 FN_GLOBAL_BOOL(lp_nt_acl_support, &Globals.bNTAclSupport)
1424 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1425 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1426 FN_GLOBAL_BOOL(lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1427 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1428 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1429 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1430 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1431 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1432 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.max_wins_ttl)
1433 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1434 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1435 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1436 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1437 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1438 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1439 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1440 FN_GLOBAL_INTEGER(lp_shmem_size, &Globals.shmem_size)
1441 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1442 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1443 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1444 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1445 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1446 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1447 FN_GLOBAL_INTEGER(lp_client_code_page, &Globals.client_code_page)
1448 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1449 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1450 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1451 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1452 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1453 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1454 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1455 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1456 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1458 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1459 #endif /* WITH_LDAP */
1460 FN_LOCAL_STRING(lp_preexec, szPreExec)
1461 FN_LOCAL_STRING(lp_postexec, szPostExec)
1462 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1463 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1464 FN_LOCAL_STRING(lp_servicename, szService)
1465 FN_LOCAL_STRING(lp_pathname, szPath)
1466 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1467 FN_LOCAL_STRING(lp_username, szUsername)
1468 FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
1469 FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
1470 FN_LOCAL_STRING(lp_valid_users, szValidUsers)
1471 FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
1472 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1473 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1474 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1475 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1476 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1477 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1478 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1479 FN_LOCAL_STRING(lp_printername, szPrintername)
1480 FN_LOCAL_STRING(lp_driverfile, szDriverFile)
1481 FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)
1482 FN_LOCAL_STRING(lp_hostsallow, szHostsallow)
1483 FN_LOCAL_STRING(lp_hostsdeny, szHostsdeny)
1484 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1485 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1486 FN_LOCAL_STRING(lp_comment, comment)
1487 FN_LOCAL_STRING(lp_force_user, force_user)
1488 FN_LOCAL_STRING(lp_force_group, force_group)
1489 FN_LOCAL_STRING(lp_readlist, readlist)
1490 FN_LOCAL_STRING(lp_writelist, writelist)
1491 FN_LOCAL_STRING(lp_fstype, fstype)
1492 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1493 static FN_LOCAL_STRING(lp_volume, volume)
1494 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1495 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1496 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1497 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1498 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
1499 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1500 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1501 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1502 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1503 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1504 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1505 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1506 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1507 FN_LOCAL_BOOL(lp_status, status)
1508 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1509 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1510 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1511 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1512 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1513 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1514 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1515 FN_LOCAL_BOOL(lp_postscript, bPostscript)
1516 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1517 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1518 FN_LOCAL_BOOL(lp_locking, bLocking)
1519 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1520 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1522 FN_LOCAL_BOOL(lp_utmp, bUtmp)
1524 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1525 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1526 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1527 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1528 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1529 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1530 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1531 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1532 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1533 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1534 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1535 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1536 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1537 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1538 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1539 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1540 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1541 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1542 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1543 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1544 FN_LOCAL_INTEGER(_lp_security_mask, iSecurity_mask)
1545 FN_LOCAL_INTEGER(_lp_force_security_mode, iSecurity_force_mode)
1546 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1547 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1548 FN_LOCAL_INTEGER(_lp_dir_security_mask, iDir_Security_mask)
1549 FN_LOCAL_INTEGER(_lp_force_dir_security_mode, iDir_Security_force_mode)
1550 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1551 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1552 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1553 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1554 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1555 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1556 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1557 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1558 /* local prototypes */
1559 static int strwicmp(char *psz1, char *psz2);
1560 static int map_parameter(char *pszParmName);
1561 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1562 static int getservicebyname(char *pszServiceName,
1563 service * pserviceDest);
1564 static void copy_service(service * pserviceDest,
1565 service * pserviceSource, BOOL *pcopymapDest);
1566 static BOOL service_ok(int iService);
1567 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1568 static BOOL do_section(char *pszSectionName);
1569 static void init_copymap(service * pservice);
1572 /***************************************************************************
1573 initialise a service to the defaults
1574 ***************************************************************************/
1575 static void init_service(service * pservice)
1577 memset((char *)pservice, '\0', sizeof(service));
1578 copy_service(pservice, &sDefault, NULL);
1582 /***************************************************************************
1583 free the dynamically allocated parts of a service struct
1584 ***************************************************************************/
1585 static void free_service(service * pservice)
1591 if (pservice->szService)
1593 ("free_service: Freeing service %s\n",
1594 pservice->szService));
1596 string_free(&pservice->szService);
1597 if (pservice->copymap)
1599 free(pservice->copymap);
1600 pservice->copymap = NULL;
1603 for (i = 0; parm_table[i].label; i++)
1604 if ((parm_table[i].type == P_STRING ||
1605 parm_table[i].type == P_USTRING) &&
1606 parm_table[i].class == P_LOCAL)
1607 string_free((char **)
1608 (((char *)pservice) +
1609 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1612 /***************************************************************************
1613 add a new service to the services array initialising it with the given
1615 ***************************************************************************/
1616 static int add_a_service(service * pservice, char *name)
1620 int num_to_alloc = iNumServices + 1;
1622 tservice = *pservice;
1624 /* it might already exist */
1627 i = getservicebyname(name, NULL);
1632 /* find an invalid one */
1633 for (i = 0; i < iNumServices; i++)
1634 if (!pSERVICE(i)->valid)
1637 /* if not, then create one */
1638 if (i == iNumServices)
1641 (service **) Realloc(ServicePtrs,
1645 pSERVICE(iNumServices) =
1646 (service *) malloc(sizeof(service));
1648 if (!ServicePtrs || !pSERVICE(iNumServices))
1654 free_service(pSERVICE(i));
1656 pSERVICE(i)->valid = True;
1658 init_service(pSERVICE(i));
1659 copy_service(pSERVICE(i), &tservice, NULL);
1662 string_set(&iSERVICE(i).szService, name);
1663 unix_to_dos(iSERVICE(i).szService, True);
1668 /***************************************************************************
1669 add a new home service, with the specified home directory, defaults coming
1671 ***************************************************************************/
1672 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1674 int i = add_a_service(pSERVICE(iDefaultService), pszHomename);
1679 if (!(*(iSERVICE(i).szPath))
1680 || strequal(iSERVICE(i).szPath, lp_pathname(-1)))
1681 string_set(&iSERVICE(i).szPath, pszHomedir);
1682 if (!(*(iSERVICE(i).comment)))
1685 slprintf(comment, sizeof(comment) - 1,
1686 "Home directory of %s", pszHomename);
1687 string_set(&iSERVICE(i).comment, comment);
1689 iSERVICE(i).bAvailable = sDefault.bAvailable;
1690 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1693 ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1698 /***************************************************************************
1699 add a new service, based on an old one
1700 ***************************************************************************/
1701 int lp_add_service(char *pszService, int iDefaultService)
1703 return (add_a_service(pSERVICE(iDefaultService), pszService));
1707 /***************************************************************************
1709 ***************************************************************************/
1710 static BOOL lp_add_ipc(void)
1713 int i = add_a_service(&sDefault, "IPC$");
1718 slprintf(comment, sizeof(comment) - 1,
1719 "IPC Service (%s)", Globals.szServerString);
1721 string_set(&iSERVICE(i).szPath, tmpdir());
1722 string_set(&iSERVICE(i).szUsername, "");
1723 string_set(&iSERVICE(i).comment, comment);
1724 string_set(&iSERVICE(i).fstype, "IPC");
1725 iSERVICE(i).status = False;
1726 iSERVICE(i).iMaxConnections = 0;
1727 iSERVICE(i).bAvailable = True;
1728 iSERVICE(i).bRead_only = True;
1729 iSERVICE(i).bGuest_only = False;
1730 iSERVICE(i).bGuest_ok = True;
1731 iSERVICE(i).bPrint_ok = False;
1732 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1734 DEBUG(3, ("adding IPC service\n"));
1740 /***************************************************************************
1741 add a new printer service, with defaults coming from service iFrom
1742 ***************************************************************************/
1743 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
1745 char *comment = "From Printcap";
1746 int i = add_a_service(pSERVICE(iDefaultService), pszPrintername);
1751 /* note that we do NOT default the availability flag to True - */
1752 /* we take it from the default service passed. This allows all */
1753 /* dynamic printers to be disabled by disabling the [printers] */
1754 /* entry (if/when the 'available' keyword is implemented!). */
1756 /* the printer name is set to the service name. */
1757 string_set(&iSERVICE(i).szPrintername, pszPrintername);
1758 string_set(&iSERVICE(i).comment, comment);
1759 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1760 /* Printers cannot be read_only. */
1761 iSERVICE(i).bRead_only = False;
1762 /* No share modes on printer services. */
1763 iSERVICE(i).bShareModes = False;
1764 /* No oplocks on printer services. */
1765 iSERVICE(i).bOpLocks = False;
1766 /* Printer services must be printable. */
1767 iSERVICE(i).bPrint_ok = True;
1769 DEBUG(3, ("adding printer service %s\n", pszPrintername));
1775 /***************************************************************************
1776 Do a case-insensitive, whitespace-ignoring string compare.
1777 ***************************************************************************/
1778 static int strwicmp(char *psz1, char *psz2)
1780 /* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
1781 /* appropriate value. */
1784 else if (psz1 == NULL)
1786 else if (psz2 == NULL)
1789 /* sync the strings on first non-whitespace */
1792 while (isspace(*psz1))
1794 while (isspace(*psz2))
1796 if (toupper(*psz1) != toupper(*psz2) || *psz1 == '\0'
1802 return (*psz1 - *psz2);
1805 /***************************************************************************
1806 Map a parameter's string representation to something we can use.
1807 Returns False if the parameter string is not recognised, else TRUE.
1808 ***************************************************************************/
1809 static int map_parameter(char *pszParmName)
1813 if (*pszParmName == '-')
1816 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1817 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1820 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
1825 /***************************************************************************
1826 Set a boolean variable from the text value stored in the passed string.
1827 Returns True in success, False if the passed string does not correctly
1828 represent a boolean.
1829 ***************************************************************************/
1830 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
1835 if (strwicmp(pszParmValue, "yes") == 0 ||
1836 strwicmp(pszParmValue, "true") == 0 ||
1837 strwicmp(pszParmValue, "1") == 0)
1840 if (strwicmp(pszParmValue, "no") == 0 ||
1841 strwicmp(pszParmValue, "False") == 0 ||
1842 strwicmp(pszParmValue, "0") == 0)
1847 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1854 /***************************************************************************
1855 Find a service by name. Otherwise works like get_service.
1856 ***************************************************************************/
1857 static int getservicebyname(char *pszServiceName, service * pserviceDest)
1861 for (iService = iNumServices - 1; iService >= 0; iService--)
1862 if (VALID(iService) &&
1863 strwicmp(iSERVICE(iService).szService,
1864 pszServiceName) == 0)
1866 if (pserviceDest != NULL)
1867 copy_service(pserviceDest, pSERVICE(iService),
1877 /***************************************************************************
1878 Copy a service structure to another
1880 If pcopymapDest is NULL then copy all fields
1881 ***************************************************************************/
1882 static void copy_service(service * pserviceDest,
1883 service * pserviceSource, BOOL *pcopymapDest)
1886 BOOL bcopyall = (pcopymapDest == NULL);
1888 for (i = 0; parm_table[i].label; i++)
1889 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
1890 (bcopyall || pcopymapDest[i]))
1892 void *def_ptr = parm_table[i].ptr;
1894 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
1897 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
1900 switch (parm_table[i].type)
1904 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
1910 *(int *)dest_ptr = *(int *)src_ptr;
1914 *(char *)dest_ptr = *(char *)src_ptr;
1918 string_set(dest_ptr,
1923 string_set(dest_ptr,
1925 strupper(*(char **)dest_ptr);
1934 init_copymap(pserviceDest);
1935 if (pserviceSource->copymap)
1936 memcpy((void *)pserviceDest->copymap,
1937 (void *)pserviceSource->copymap,
1938 sizeof(BOOL) * NUMPARAMETERS);
1942 /***************************************************************************
1943 Check a service for consistency. Return False if the service is in any way
1944 incomplete or faulty, else True.
1945 ***************************************************************************/
1946 static BOOL service_ok(int iService)
1951 if (iSERVICE(iService).szService[0] == '\0')
1954 ("The following message indicates an internal error:\n"));
1955 DEBUG(0, ("No service name in service entry.\n"));
1959 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
1960 /* I can't see why you'd want a non-printable printer service... */
1961 if (strwicmp(iSERVICE(iService).szService, PRINTERS_NAME) == 0)
1962 if (!iSERVICE(iService).bPrint_ok)
1965 ("WARNING: [%s] service MUST be printable!\n",
1966 iSERVICE(iService).szService));
1967 iSERVICE(iService).bPrint_ok = True;
1970 if (iSERVICE(iService).szPath[0] == '\0' &&
1971 strwicmp(iSERVICE(iService).szService, HOMES_NAME) != 0)
1974 ("No path in service %s - using %s\n",
1975 iSERVICE(iService).szService, tmpdir()));
1976 string_set(&iSERVICE(iService).szPath, tmpdir());
1979 /* If a service is flagged unavailable, log the fact at level 0. */
1980 if (!iSERVICE(iService).bAvailable)
1981 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
1982 iSERVICE(iService).szService));
1987 static struct file_lists
1989 struct file_lists *next;
1995 /*******************************************************************
1996 keep a linked list of all config files so we know when one has changed
1997 it's date and needs to be reloaded
1998 ********************************************************************/
1999 static void add_to_file_list(char *fname)
2001 struct file_lists *f = file_lists;
2005 if (f->name && !strcmp(f->name, fname))
2012 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2015 f->next = file_lists;
2016 f->name = strdup(fname);
2028 standard_sub_basic(n2);
2029 f->modtime = file_modtime(n2);
2034 /*******************************************************************
2035 check if a config file has changed date
2036 ********************************************************************/
2037 BOOL lp_file_list_changed(void)
2039 struct file_lists *f = file_lists;
2040 DEBUG(6, ("lp_file_list_changed()\n"));
2047 pstrcpy(n2, f->name);
2048 standard_sub_basic(n2);
2050 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2051 f->name, n2, ctime(&f->modtime)));
2053 mod_time = file_modtime(n2);
2055 if (f->modtime != mod_time)
2058 ("file %s modified: %s\n", n2,
2060 f->modtime = mod_time;
2068 /***************************************************************************
2069 Run standard_sub_basic on netbios name... needed because global_myname
2070 is not accessed through any lp_ macro.
2071 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2072 ***************************************************************************/
2074 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2076 pstring netbios_name;
2078 pstrcpy(netbios_name, pszParmValue);
2080 standard_sub_basic(netbios_name);
2081 strupper(netbios_name);
2084 * Convert from UNIX to DOS string - the UNIX to DOS converter
2085 * isn't called on the special handlers.
2087 unix_to_dos(netbios_name, True);
2088 pstrcpy(global_myname, netbios_name);
2091 ("handle_netbios_name: set global_myname to: %s\n",
2097 /***************************************************************************
2098 Do the work of sourcing in environment variable/value pairs.
2099 ***************************************************************************/
2101 static BOOL source_env(char **lines)
2108 for (i = 0; lines[i]; i++)
2110 char *line = lines[i];
2112 if ((len = strlen(line)) == 0)
2115 if (line[len - 1] == '\n')
2118 if ((varval = malloc(len + 1)) == NULL)
2120 DEBUG(0, ("source_env: Not enough memory!\n"));
2124 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2125 strncpy(varval, line, len);
2128 p = strchr(line, (int)'=');
2131 DEBUG(4, ("source_env: missing '=': %s\n", line));
2138 ("source_env: Failed to put environment variable %s\n",
2146 ("source_env: getting var %s = %s\n", line,
2150 DEBUG(4, ("source_env: returning successfully\n"));
2154 /***************************************************************************
2155 Handle the source environment operation
2156 ***************************************************************************/
2158 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2165 pstrcpy(fname, pszParmValue);
2167 standard_sub_basic(fname);
2169 string_set(ptr, pszParmValue);
2171 DEBUG(4, ("handle_source_env: checking env type\n"));
2174 * Filename starting with '|' means popen and read from stdin.
2179 lines = file_lines_pload(p + 1, NULL);
2183 lines = file_lines_load(fname, NULL);
2189 ("handle_source_env: Failed to open file %s, Error was %s\n",
2190 fname, strerror(errno)));
2194 result = source_env(lines);
2195 file_lines_free(lines);
2200 /***************************************************************************
2201 handle the interpretation of the vfs object parameter
2202 *************************************************************************/
2203 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2205 /* Set string value */
2207 string_set(ptr, pszParmValue);
2209 /* Do any other initialisation required for vfs. Note that
2210 anything done here may have linking repercussions in nmbd. */
2215 /***************************************************************************
2216 handle the interpretation of the coding system parameter
2217 *************************************************************************/
2218 static BOOL handle_coding_system(char *pszParmValue, char **ptr)
2220 string_set(ptr, pszParmValue);
2221 interpret_coding_system(pszParmValue);
2225 /***************************************************************************
2226 Handle the interpretation of the character set system parameter.
2227 ***************************************************************************/
2229 static char *saved_character_set = NULL;
2231 static BOOL handle_character_set(char *pszParmValue, char **ptr)
2233 /* A dependency here is that the parameter client code page should be
2234 set before this is called.
2236 string_set(ptr, pszParmValue);
2238 saved_character_set = strdup(*ptr);
2239 interpret_character_set(*ptr, lp_client_code_page());
2243 /***************************************************************************
2244 Handle the interpretation of the client code page parameter.
2245 We handle this separately so that we can reset the character set
2246 parameter in case this came before 'client code page' in the smb.conf.
2247 ***************************************************************************/
2249 static BOOL handle_client_code_page(char *pszParmValue, char **ptr)
2251 Globals.client_code_page = atoi(pszParmValue);
2252 if (saved_character_set != NULL)
2253 interpret_character_set(saved_character_set,
2254 lp_client_code_page());
2258 /***************************************************************************
2259 handle the valid chars lines
2260 ***************************************************************************/
2262 static BOOL handle_valid_chars(char *pszParmValue, char **ptr)
2264 string_set(ptr, pszParmValue);
2266 /* A dependency here is that the parameter client code page must be
2267 set before this is called - as calling codepage_initialise()
2268 would overwrite the valid char lines.
2270 codepage_initialise(lp_client_code_page());
2272 add_char_string(pszParmValue);
2276 /***************************************************************************
2277 handle the include operation
2278 ***************************************************************************/
2280 static BOOL handle_include(char *pszParmValue, char **ptr)
2283 pstrcpy(fname, pszParmValue);
2285 add_to_file_list(fname);
2287 standard_sub_basic(fname);
2289 string_set(ptr, fname);
2291 if (file_exist(fname, NULL))
2292 return (pm_process(fname, do_section, do_parameter));
2294 DEBUG(2, ("Can't find include file %s\n", fname));
2300 /***************************************************************************
2301 handle the interpretation of the copy parameter
2302 ***************************************************************************/
2303 static BOOL handle_copy(char *pszParmValue, char **ptr)
2307 service serviceTemp;
2309 string_set(ptr, pszParmValue);
2311 init_service(&serviceTemp);
2315 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2317 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2319 if (iTemp == iServiceIndex)
2322 ("Can't copy service %s - unable to copy self!\n",
2327 copy_service(pSERVICE(iServiceIndex),
2329 iSERVICE(iServiceIndex).copymap);
2335 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2340 free_service(&serviceTemp);
2344 /***************************************************************************
2345 Handle winbind uid and gid allocation parameters. The format of these
2350 winbind uid = 1000-1999
2351 winbind gid = 700-899
2353 We only do simple parsing checks here. The strings are parsed into useful
2354 structures in the winbind daemon code.
2356 ***************************************************************************/
2358 /* Do some simple checks on "winbind [ug]id" parameter value */
2360 static BOOL handle_winbind_id(char *pszParmValue, char **ptr)
2364 if (sscanf(pszParmValue, "%d-%d", &low, &high) != 2)
2371 string_set(ptr, pszParmValue);
2376 /***************************************************************************
2377 initialise a copymap
2378 ***************************************************************************/
2379 static void init_copymap(service * pservice)
2382 if (pservice->copymap)
2383 free(pservice->copymap);
2384 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2385 if (!pservice->copymap)
2387 ("Couldn't allocate copymap!! (size %d)\n",
2388 (int)NUMPARAMETERS));
2390 for (i = 0; i < NUMPARAMETERS; i++)
2391 pservice->copymap[i] = True;
2395 /***************************************************************************
2396 return the local pointer to a parameter given the service number and the
2397 pointer into the default structure
2398 ***************************************************************************/
2399 void *lp_local_ptr(int snum, void *ptr)
2401 return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr, &sDefault));
2404 /***************************************************************************
2405 Process a parameter for a particular service number. If snum < 0
2406 then assume we are in the globals
2407 ***************************************************************************/
2408 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2411 void *parm_ptr = NULL; /* where we are going to store the result */
2412 void *def_ptr = NULL;
2414 parmnum = map_parameter(pszParmName);
2419 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2423 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2425 DEBUG(1, ("WARNING: The \"%s\"option is deprecated\n",
2429 def_ptr = parm_table[parmnum].ptr;
2431 /* we might point at a service, the default service or a global */
2438 if (parm_table[parmnum].class == P_GLOBAL)
2441 ("Global parameter %s found in service section!\n",
2446 ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,
2452 if (!iSERVICE(snum).copymap)
2453 init_copymap(pSERVICE(snum));
2455 /* this handles the aliases - set the copymap for other entries with
2456 the same data pointer */
2457 for (i = 0; parm_table[i].label; i++)
2458 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2459 iSERVICE(snum).copymap[i] = False;
2462 /* if it is a special case then go ahead */
2463 if (parm_table[parmnum].special)
2465 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2469 /* now switch on the type of variable it is */
2470 switch (parm_table[parmnum].type)
2473 set_boolean(parm_ptr, pszParmValue);
2477 set_boolean(parm_ptr, pszParmValue);
2478 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2482 *(int *)parm_ptr = atoi(pszParmValue);
2486 *(char *)parm_ptr = *pszParmValue;
2490 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2494 string_set(parm_ptr, pszParmValue);
2495 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2496 unix_to_dos(*(char **)parm_ptr, True);
2500 string_set(parm_ptr, pszParmValue);
2501 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2502 unix_to_dos(*(char **)parm_ptr, True);
2503 strupper(*(char **)parm_ptr);
2507 pstrcpy((char *)parm_ptr, pszParmValue);
2508 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2509 unix_to_dos((char *)parm_ptr, True);
2513 pstrcpy((char *)parm_ptr, pszParmValue);
2514 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2515 unix_to_dos((char *)parm_ptr, True);
2516 strupper((char *)parm_ptr);
2520 for (i = 0; parm_table[parmnum].enum_list[i].name;
2525 parm_table[parmnum].enum_list[i].name))
2528 parm_table[parmnum].
2541 /***************************************************************************
2542 Process a parameter.
2543 ***************************************************************************/
2544 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2546 if (!bInGlobalSection && bGlobalOnly)
2549 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2551 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2552 pszParmName, pszParmValue));
2556 /***************************************************************************
2557 print a parameter of the specified type
2558 ***************************************************************************/
2559 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
2565 for (i = 0; p->enum_list[i].name; i++)
2567 if (*(int *)ptr == p->enum_list[i].value)
2570 p->enum_list[i].name);
2577 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2581 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2585 fprintf(f, "%d", *(int *)ptr);
2589 fprintf(f, "%c", *(char *)ptr);
2593 fprintf(f, "%s", octal_string(*(int *)ptr));
2599 fprintf(f, "%s", (char *)ptr);
2605 fprintf(f, "%s", *(char **)ptr);
2613 /***************************************************************************
2614 check if two parameters are equal
2615 ***************************************************************************/
2616 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2622 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2627 return (*((int *)ptr1) == *((int *)ptr2));
2630 return (*((char *)ptr1) == *((char *)ptr2));
2635 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2640 return (p1 == p2 || strequal(p1, p2));
2645 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2650 return (p1 == p2 || strequal(p1, p2));
2658 /***************************************************************************
2659 Process a new section (service). At this stage all sections are services.
2660 Later we'll have special sections that permit server parameters to be set.
2661 Returns True on success, False on failure.
2662 ***************************************************************************/
2663 static BOOL do_section(char *pszSectionName)
2666 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2667 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2670 /* if we were in a global section then do the local inits */
2671 if (bInGlobalSection && !isglobal)
2674 /* if we've just struck a global section, note the fact. */
2675 bInGlobalSection = isglobal;
2677 /* check for multiple global sections */
2678 if (bInGlobalSection)
2680 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
2684 if (!bInGlobalSection && bGlobalOnly)
2687 /* if we have a current service, tidy it up before moving on */
2690 if (iServiceIndex >= 0)
2691 bRetval = service_ok(iServiceIndex);
2693 /* if all is still well, move to the next record in the services array */
2696 /* We put this here to avoid an odd message order if messages are */
2697 /* issued by the post-processing of a previous section. */
2698 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
2700 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
2703 DEBUG(0, ("Failed to add a new service\n"));
2712 /***************************************************************************
2713 determine if a partcular base parameter is currently set to the default value.
2714 ***************************************************************************/
2715 static BOOL is_default(int i)
2717 if (!defaults_saved)
2719 switch (parm_table[i].type)
2723 return strequal(parm_table[i].def.svalue,
2724 *(char **)parm_table[i].ptr);
2727 return strequal(parm_table[i].def.svalue,
2728 (char *)parm_table[i].ptr);
2731 return parm_table[i].def.bvalue ==
2732 *(BOOL *)parm_table[i].ptr;
2734 return parm_table[i].def.cvalue ==
2735 *(char *)parm_table[i].ptr;
2739 return parm_table[i].def.ivalue ==
2740 *(int *)parm_table[i].ptr;
2748 /***************************************************************************
2749 Display the contents of the global structure.
2750 ***************************************************************************/
2751 static void dump_globals(FILE * f)
2754 fprintf(f, "# Global parameters\n[global]\n");
2756 for (i = 0; parm_table[i].label; i++)
2757 if (parm_table[i].class == P_GLOBAL &&
2758 parm_table[i].ptr &&
2759 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2761 if (defaults_saved && is_default(i))
2763 fprintf(f, "\t%s = ", parm_table[i].label);
2764 print_parameter(&parm_table[i], parm_table[i].ptr, f);
2769 /***************************************************************************
2770 return True if a local parameter is currently set to the global default
2771 ***************************************************************************/
2772 BOOL lp_is_default(int snum, struct parm_struct *parm)
2774 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
2776 return equal_parameter(parm->type,
2777 ((char *)pSERVICE(snum)) + pdiff,
2778 ((char *)&sDefault) + pdiff);
2782 /***************************************************************************
2783 Display the contents of a single services record.
2784 ***************************************************************************/
2785 static void dump_a_service(service * pService, FILE * f)
2788 if (pService != &sDefault)
2789 fprintf(f, "\n[%s]\n", pService->szService);
2791 for (i = 0; parm_table[i].label; i++)
2792 if (parm_table[i].class == P_LOCAL &&
2793 parm_table[i].ptr &&
2794 (*parm_table[i].label != '-') &&
2795 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2797 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
2799 if (pService == &sDefault)
2801 if (defaults_saved && is_default(i))
2806 if (equal_parameter(parm_table[i].type,
2807 ((char *)pService) +
2809 ((char *)&sDefault) +
2814 fprintf(f, "\t%s = ", parm_table[i].label);
2815 print_parameter(&parm_table[i],
2816 ((char *)pService) + pdiff, f);
2822 /***************************************************************************
2823 return info about the next service in a service. snum==-1 gives the globals
2825 return NULL when out of parameters
2826 ***************************************************************************/
2827 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
2831 /* do the globals */
2832 for (; parm_table[*i].label; (*i)++)
2834 if (parm_table[*i].class == P_SEPARATOR)
2835 return &parm_table[(*i)++];
2837 if (!parm_table[*i].ptr
2838 || (*parm_table[*i].label == '-'))
2842 && (parm_table[*i].ptr ==
2843 parm_table[(*i) - 1].ptr))
2846 return &parm_table[(*i)++];
2851 service *pService = pSERVICE(snum);
2853 for (; parm_table[*i].label; (*i)++)
2855 if (parm_table[*i].class == P_SEPARATOR)
2856 return &parm_table[(*i)++];
2858 if (parm_table[*i].class == P_LOCAL &&
2859 parm_table[*i].ptr &&
2860 (*parm_table[*i].label != '-') &&
2862 (parm_table[*i].ptr !=
2863 parm_table[(*i) - 1].ptr)))
2866 PTR_DIFF(parm_table[*i].ptr,
2869 if (allparameters ||
2870 !equal_parameter(parm_table[*i].type,
2871 ((char *)pService) +
2873 ((char *)&sDefault) +
2876 return &parm_table[(*i)++];
2887 /***************************************************************************
2888 Display the contents of a single copy structure.
2889 ***************************************************************************/
2890 static void dump_copy_map(BOOL *pcopymap)
2896 printf("\n\tNon-Copied parameters:\n");
2898 for (i = 0; parm_table[i].label; i++)
2899 if (parm_table[i].class == P_LOCAL &&
2900 parm_table[i].ptr && !pcopymap[i] &&
2901 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2903 printf("\t\t%s\n", parm_table[i].label);
2908 /***************************************************************************
2909 Return TRUE if the passed service number is within range.
2910 ***************************************************************************/
2911 BOOL lp_snum_ok(int iService)
2913 return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
2917 /***************************************************************************
2918 auto-load some home services
2919 ***************************************************************************/
2920 static void lp_add_auto_services(char *str)
2933 homes = lp_servicenumber(HOMES_NAME);
2935 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP))
2937 char *home = get_user_home_dir(p);
2939 if (lp_servicenumber(p) >= 0)
2942 if (home && homes >= 0)
2944 lp_add_home(p, homes, home);
2950 /***************************************************************************
2951 auto-load one printer
2952 ***************************************************************************/
2953 void lp_add_one_printer(char *name, char *comment)
2955 int printers = lp_servicenumber(PRINTERS_NAME);
2958 if (lp_servicenumber(name) < 0)
2960 lp_add_printer(name, printers);
2961 if ((i = lp_servicenumber(name)) >= 0)
2963 string_set(&iSERVICE(i).comment, comment);
2964 iSERVICE(i).autoloaded = True;
2969 /***************************************************************************
2970 have we loaded a services file yet?
2971 ***************************************************************************/
2972 BOOL lp_loaded(void)
2977 /***************************************************************************
2978 unload unused services
2979 ***************************************************************************/
2980 void lp_killunused(BOOL (*snumused) (int))
2983 for (i = 0; i < iNumServices; i++)
2988 if (!snumused || !snumused(i))
2990 iSERVICE(i).valid = False;
2991 free_service(pSERVICE(i));
2997 /***************************************************************************
2998 save the curent values of all global and sDefault parameters into the
2999 defaults union. This allows swat and testparm to show only the
3000 changed (ie. non-default) parameters.
3001 ***************************************************************************/
3002 static void lp_save_defaults(void)
3005 for (i = 0; parm_table[i].label; i++)
3007 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3009 switch (parm_table[i].type)
3013 parm_table[i].def.svalue =
3014 strdup(*(char **)parm_table[i].ptr);
3018 parm_table[i].def.svalue =
3019 strdup((char *)parm_table[i].ptr);
3023 parm_table[i].def.bvalue =
3024 *(BOOL *)parm_table[i].ptr;
3027 parm_table[i].def.cvalue =
3028 *(char *)parm_table[i].ptr;
3033 parm_table[i].def.ivalue =
3034 *(int *)parm_table[i].ptr;
3040 defaults_saved = True;
3043 /*******************************************************************
3044 Set the server type we will announce as via nmbd.
3045 ********************************************************************/
3046 static void set_server_role(void)
3048 server_role = ROLE_STANDALONE;
3050 switch (lp_security())
3054 if (lp_domain_logons())
3057 ("Server's Role (logon server) conflicts with share-level security\n"));
3064 if (lp_domain_logons())
3066 server_role = ROLE_DOMAIN_BDC;
3069 server_role = ROLE_DOMAIN_MEMBER;
3074 if (lp_domain_logons())
3076 server_role = ROLE_DOMAIN_PDC;
3084 ("Server's Role undefined due to unknown security mode\n"));
3090 /***************************************************************************
3091 Load the services array from the services file. Return True on success,
3093 ***************************************************************************/
3094 BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults,
3100 add_to_file_list(pszFname);
3104 bInGlobalSection = True;
3105 bGlobalOnly = global_only;
3115 pstrcpy(n2, pszFname);
3116 standard_sub_basic(n2);
3118 /* We get sections first, so have to start 'behind' to make up */
3120 bRetval = pm_process(n2, do_section, do_parameter);
3122 /* finish up the last section */
3123 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3125 if (iServiceIndex >= 0)
3126 bRetval = service_ok(iServiceIndex);
3128 lp_add_auto_services(lp_auto_services());
3134 set_default_server_announce_type();
3138 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3139 /* if bWINSsupport is true and we are in the client */
3141 if (in_client && Globals.bWINSsupport)
3144 string_set(&Globals.szWINSserver, "127.0.0.1");
3152 /***************************************************************************
3153 reset the max number of services
3154 ***************************************************************************/
3155 void lp_resetnumservices(void)
3160 /***************************************************************************
3161 return the max number of services
3162 ***************************************************************************/
3163 int lp_numservices(void)
3165 return (iNumServices);
3168 /***************************************************************************
3169 Display the contents of the services array in human-readable form.
3170 ***************************************************************************/
3171 void lp_dump(FILE * f, BOOL show_defaults, int maxtoprint)
3177 defaults_saved = False;
3182 dump_a_service(&sDefault, f);
3184 for (iService = 0; iService < maxtoprint; iService++)
3185 lp_dump_one(f, show_defaults, iService);
3188 /***************************************************************************
3189 Display the contents of one service in human-readable form.
3190 ***************************************************************************/
3191 void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
3195 if (iSERVICE(snum).szService[0] == '\0')
3197 dump_a_service(pSERVICE(snum), f);
3202 /***************************************************************************
3203 Return the number of the service with the given name, or -1 if it doesn't
3204 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3205 getservicebyname()! This works ONLY if all services have been loaded, and
3206 does not copy the found service.
3207 ***************************************************************************/
3208 int lp_servicenumber(char *pszServiceName)
3212 for (iService = iNumServices - 1; iService >= 0; iService--)
3213 if (VALID(iService) &&
3214 strequal(lp_servicename(iService), pszServiceName))
3219 ("lp_servicenumber: couldn't find %s\n",
3225 /*******************************************************************
3226 a useful volume label function
3227 ******************************************************************/
3228 char *volume_label(int snum)
3230 char *ret = lp_volume(snum);
3232 return (lp_servicename(snum));
3237 /*******************************************************************
3238 Set the server type we will announce as via nmbd.
3239 ********************************************************************/
3240 static void set_default_server_announce_type(void)
3242 default_server_announce = 0;
3243 default_server_announce |= SV_TYPE_WORKSTATION;
3244 default_server_announce |= SV_TYPE_SERVER;
3245 default_server_announce |= SV_TYPE_SERVER_UNIX;
3246 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3248 switch (lp_announce_as())
3250 case ANNOUNCE_AS_NT_SERVER:
3252 default_server_announce |= SV_TYPE_SERVER_NT;
3253 /* fall through... */
3255 case ANNOUNCE_AS_NT_WORKSTATION:
3257 default_server_announce |= SV_TYPE_NT;
3260 case ANNOUNCE_AS_WIN95:
3262 default_server_announce |= SV_TYPE_WIN95_PLUS;
3265 case ANNOUNCE_AS_WFW:
3267 default_server_announce |= SV_TYPE_WFW;
3276 switch (lp_server_role())
3278 case ROLE_DOMAIN_MEMBER:
3280 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3283 case ROLE_DOMAIN_PDC:
3285 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3288 case ROLE_DOMAIN_BDC:
3290 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3293 case ROLE_STANDALONE:
3300 if (lp_time_server())
3302 default_server_announce |= SV_TYPE_TIME_SOURCE;
3305 if (lp_host_msdfs())
3307 default_server_announce |= SV_TYPE_DFS_SERVER;
3311 /***********************************************************
3312 returns role of Samba server
3313 ************************************************************/
3315 int lp_server_role(void)
3320 /***********************************************************
3321 If we are PDC then prefer us as DMB
3322 ************************************************************/
3324 BOOL lp_domain_master(void)
3326 if (Globals.bDomainMaster == Auto)
3328 return (lp_server_role() == ROLE_DOMAIN_PDC);
3331 return Globals.bDomainMaster;
3334 /***********************************************************
3335 If we are DMB then prefer us as LMB
3336 ************************************************************/
3338 BOOL lp_preferred_master(void)
3340 if (Globals.bPreferredMaster == Auto)
3342 return (lp_local_master() && lp_domain_master());
3345 return Globals.bPreferredMaster;
3350 /*******************************************************************
3352 ********************************************************************/
3353 void lp_remove_service(int snum)
3355 pSERVICE(snum)->valid = False;
3358 /*******************************************************************
3360 ********************************************************************/
3361 void lp_copy_service(int snum, char *new_name)
3363 char *oldname = lp_servicename(snum);
3364 do_section(new_name);
3367 snum = lp_servicenumber(new_name);
3369 lp_do_parameter(snum, "copy", oldname);
3374 /*******************************************************************
3375 Get the default server type we will announce as via nmbd.
3376 ********************************************************************/
3377 int lp_default_server_announce(void)
3379 return default_server_announce;
3382 /*******************************************************************
3383 Split the announce version into major and minor numbers.
3384 ********************************************************************/
3385 int lp_major_announce_version(void)
3387 static BOOL got_major = False;
3388 static int major_version = DEFAULT_MAJOR_VERSION;
3393 return major_version;
3396 if ((vers = lp_announce_version()) == NULL)
3397 return major_version;
3399 if ((p = strchr(vers, '.')) == 0)
3400 return major_version;
3403 major_version = atoi(vers);
3404 return major_version;
3407 int lp_minor_announce_version(void)
3409 static BOOL got_minor = False;
3410 static int minor_version = DEFAULT_MINOR_VERSION;
3415 return minor_version;
3418 if ((vers = lp_announce_version()) == NULL)
3419 return minor_version;
3421 if ((p = strchr(vers, '.')) == 0)
3422 return minor_version;
3425 minor_version = atoi(p);
3426 return minor_version;
3429 /***********************************************************
3430 Set the global name resolution order (used in smbclient).
3431 ************************************************************/
3433 void lp_set_name_resolve_order(char *new_order)
3435 Globals.szNameResolveOrder = new_order;
3438 /***********************************************************
3439 Functions to return the current security masks/modes. If
3440 set to -1 then return the create mask/mode instead.
3441 ************************************************************/
3443 int lp_security_mask(int snum)
3445 int val = _lp_security_mask(snum);
3447 return lp_create_mask(snum);
3451 int lp_force_security_mode(int snum)
3453 int val = _lp_force_security_mode(snum);
3455 return lp_force_create_mode(snum);
3459 int lp_dir_security_mask(int snum)
3461 int val = _lp_dir_security_mask(snum);
3463 return lp_dir_mask(snum);
3467 int lp_force_dir_security_mode(int snum)
3469 int val = _lp_force_dir_security_mode(snum);
3471 return lp_force_dir_mode(snum);