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;
97 extern int extra_time_offset;
99 static BOOL defaults_saved = False;
102 * This structure describes global (ie., server-wide) parameters.
106 char *szPrintcapname;
107 char *szEnumPortsCommand;
108 char *szAddPrinterCommand;
109 char *szDeletePrinterCommand;
112 char *szDefaultService;
116 char *szServerString;
117 char *szAutoServices;
118 char *szPasswdProgram;
122 char *szSMBPasswdFile;
123 char *szPasswordServer;
124 char *szSocketOptions;
127 char *szDomainAdminGroup;
128 char *szDomainGuestGroup;
129 char *szDomainAdminUsers;
130 char *szDomainGuestUsers;
131 char *szDomainHostsallow;
132 char *szDomainHostsdeny;
134 #ifdef USING_GROUPNAME_MAP
135 char *szGroupnameMap;
136 #endif /* USING_GROUPNAME_MAP */
137 char *szCharacterSet;
144 char *szCodingSystem;
146 char *szRemoteAnnounce;
147 char *szRemoteBrowseSync;
148 char *szSocketAddress;
149 char *szNISHomeMapName;
150 char *szAnnounceVersion; /* This is initialised in init_globals */
151 char *szNetbiosAliases;
152 char *szDomainOtherSIDs;
153 char *szDomainGroups;
154 char *szNameResolveOrder;
159 char *szLdapRootPassword;
161 char *szAddUserScript;
162 char *szDelUserScript;
166 #endif /* WITH_UTMP */
170 char *szTemplateHomedir;
171 char *szTemplateShell;
172 char *szWinbindSeparator;
194 int client_code_page;
195 int announce_as; /* This is initialised in init_globals */
196 int machine_password_timeout;
197 int change_notify_timeout;
200 int min_passwd_length;
201 int oplock_break_wait_time;
202 int winbind_cache_time;
205 #endif /* WITH_LDAP */
208 char *sslHostsRequire;
209 char *sslHostsResign;
215 char *sslClientPrivKey;
218 BOOL sslReqClientCert;
219 BOOL sslReqServerCert;
220 BOOL sslCompatibility;
221 #endif /* WITH_SSL */
222 BOOL bMsAddPrinterWizard;
227 BOOL bPreferredMaster;
230 BOOL bEncryptPasswords;
238 BOOL bReadPrediction;
245 BOOL bBindInterfacesOnly;
246 BOOL bUnixPasswdSync;
247 BOOL bPasswdChatDebug;
254 BOOL bAllowTrustedDomains;
255 BOOL bRestrictAnonymous;
256 BOOL bDebugHiresTimestamp;
263 static global Globals;
268 * This structure describes a single service.
277 char *szGuestaccount;
278 char *szInvalidUsers;
286 char *szRootPostExec;
287 char *szPrintcommand;
290 char *szLppausecommand;
291 char *szLpresumecommand;
292 char *szQueuepausecommand;
293 char *szQueueresumecommand;
295 char *szPrinterDriver;
296 char *szPrinterDriverLocation;
306 char *szVetoOplockFiles;
315 char *szVfsObjectFile;
320 int iCreate_force_mode;
322 int iSecurity_force_mode;
325 int iDir_Security_mask;
326 int iDir_Security_force_mode;
330 int iOplockContentionLimit;
333 BOOL bRootpreexecClose;
336 BOOL bShortCasePreserve;
368 BOOL bDeleteReadonly;
370 BOOL bDeleteVetoFiles;
372 BOOL bDosFiletimeResolution;
373 BOOL bFakeDirCreateTimes;
378 char dummy[3]; /* for alignment */
383 /* This is a default service used to prime a services structure */
384 static service sDefault = {
386 False, /* not autoloaded */
387 NULL, /* szService */
389 NULL, /* szUsername */
390 NULL, /* szGuestAccount - this is set in init_globals() */
391 NULL, /* szInvalidUsers */
392 NULL, /* szValidUsers */
393 NULL, /* szAdminUsers */
395 NULL, /* szInclude */
396 NULL, /* szPreExec */
397 NULL, /* szPostExec */
398 NULL, /* szRootPreExec */
399 NULL, /* szRootPostExec */
400 NULL, /* szPrintcommand */
401 NULL, /* szLpqcommand */
402 NULL, /* szLprmcommand */
403 NULL, /* szLppausecommand */
404 NULL, /* szLpresumecommand */
405 NULL, /* szQueuepausecommand */
406 NULL, /* szQueueresumecommand */
407 NULL, /* szPrintername */
408 NULL, /* szPrinterDriver - this is set in init_globals() */
409 NULL, /* szPrinterDriverLocation */
410 NULL, /* szDriverFile */
411 NULL, /* szDontdescend */
412 NULL, /* szHostsallow */
413 NULL, /* szHostsdeny */
414 NULL, /* szMagicScript */
415 NULL, /* szMagicOutput */
416 NULL, /* szMangledMap */
417 NULL, /* szVetoFiles */
418 NULL, /* szHideFiles */
419 NULL, /* szVetoOplockFiles */
421 NULL, /* force user */
422 NULL, /* force group */
424 NULL, /* writelist */
425 NULL, /* printer admin */
428 NULL, /* vfs object */
429 NULL, /* vfs options */
430 0, /* iMinPrintSpace */
431 0, /* iWriteCacheSize */
432 0744, /* iCreate_mask */
433 0000, /* iCreate_force_mode */
434 -1, /* iSecurity_mask */
435 -1, /* iSecurity_force_mode */
436 0755, /* iDir_mask */
437 0000, /* iDir_force_mode */
438 -1, /* iDir_Security_mask */
439 -1, /* iDir_Security_force_mode */
440 0, /* iMaxConnections */
441 CASE_LOWER, /* iDefaultCase */
442 DEFAULT_PRINTING, /* iPrinting */
443 2, /* iOplockContentionLimit */
444 False, /* bAlternatePerm */
445 False, /* bPreexecClose */
446 False, /* bRootpreexecClose */
447 False, /* case sensitive */
448 True, /* case preserve */
449 True, /* short case preserve */
450 False, /* case mangle */
452 True, /* bHideDotFiles */
453 True, /* bBrowseable */
454 True, /* bAvailable */
455 True, /* bRead_only */
456 True, /* bNo_set_dir */
457 False, /* bGuest_only */
458 False, /* bGuest_ok */
459 False, /* bPrint_ok */
460 False, /* bPostscript */
461 False, /* bMap_system */
462 False, /* bMap_hidden */
463 True, /* bMap_archive */
465 False, /* bStrictLocking */
466 True, /* bPosixLocking */
470 True, /* bShareModes */
472 True, /* bLevel2OpLocks */
473 False, /* bOnlyUser */
474 True, /* bMangledNames */
475 True, /* bWidelinks */
476 True, /* bSymlinks */
477 False, /* bSyncAlways */
478 False, /* bStrictSync */
479 '~', /* magic char */
481 False, /* bDeleteReadonly */
482 False, /* bFakeOplocks */
483 False, /* bDeleteVetoFiles */
484 False, /* bDosFiletimes */
485 False, /* bDosFiletimeResolution */
486 False, /* bFakeDirCreateTimes */
487 True, /* bBlockingLocks */
488 False, /* bInheritPerms */
489 False, /* bMSDfsRoot */
496 /* local variables */
497 static service **ServicePtrs = NULL;
498 static int iNumServices = 0;
499 static int iServiceIndex = 0;
500 static BOOL bInGlobalSection = True;
501 static BOOL bGlobalOnly = False;
502 static int server_role;
503 static int default_server_announce;
505 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
507 /* prototypes for the special type handlers */
508 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
509 static BOOL handle_include(char *pszParmValue, char **ptr);
510 static BOOL handle_copy(char *pszParmValue, char **ptr);
511 static BOOL handle_character_set(char *pszParmValue, char **ptr);
512 static BOOL handle_coding_system(char *pszParmValue, char **ptr);
513 static BOOL handle_client_code_page(char *pszParmValue, char **ptr);
514 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
515 static BOOL handle_source_env(char *pszParmValue, char **ptr);
516 static BOOL handle_netbios_name(char *pszParmValue, char **ptr);
517 static BOOL handle_winbind_id(char *pszParmValue, char **ptr);
518 static BOOL handle_wins_server_list(char *pszParmValue, char **ptr);
520 static void set_server_role(void);
521 static void set_default_server_announce_type(void);
523 static struct enum_list enum_protocol[] = {
524 {PROTOCOL_NT1, "NT1"},
525 {PROTOCOL_LANMAN2, "LANMAN2"},
526 {PROTOCOL_LANMAN1, "LANMAN1"},
527 {PROTOCOL_CORE, "CORE"},
528 {PROTOCOL_COREPLUS, "COREPLUS"},
529 {PROTOCOL_COREPLUS, "CORE+"},
533 static struct enum_list enum_security[] = {
534 {SEC_SHARE, "SHARE"},
536 {SEC_SERVER, "SERVER"},
537 {SEC_DOMAIN, "DOMAIN"},
541 static struct enum_list enum_printing[] = {
542 {PRINT_SYSV, "sysv"},
544 {PRINT_HPUX, "hpux"},
548 {PRINT_LPRNG, "lprng"},
549 {PRINT_SOFTQ, "softq"},
550 {PRINT_CUPS, "cups"},
554 /* Types of machine we can announce as. */
555 #define ANNOUNCE_AS_NT_SERVER 1
556 #define ANNOUNCE_AS_WIN95 2
557 #define ANNOUNCE_AS_WFW 3
558 #define ANNOUNCE_AS_NT_WORKSTATION 4
560 static struct enum_list enum_announce_as[] = {
561 {ANNOUNCE_AS_NT_SERVER, "NT"},
562 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
563 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
564 {ANNOUNCE_AS_WIN95, "win95"},
565 {ANNOUNCE_AS_WFW, "WfW"},
569 static struct enum_list enum_case[] = {
570 {CASE_LOWER, "lower"},
571 {CASE_UPPER, "upper"},
575 static struct enum_list enum_bool_auto[] = {
587 Do you want session setups at user level security with a invalid
588 password to be rejected or allowed in as guest? WinNT rejects them
589 but it can be a pain as it means "net view" needs to use a password
591 You have 3 choices in the setting of map_to_guest:
593 "Never" means session setups with an invalid password
594 are rejected. This is the default.
596 "Bad User" means session setups with an invalid password
597 are rejected, unless the username does not exist, in which case it
598 is treated as a guest login
600 "Bad Password" means session setups with an invalid password
601 are treated as a guest login
603 Note that map_to_guest only has an effect in user or server
607 static struct enum_list enum_map_to_guest[] = {
608 {NEVER_MAP_TO_GUEST, "Never"},
609 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
610 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
615 static struct enum_list enum_ssl_version[] = {
616 {SMB_SSL_V2, "ssl2"},
617 {SMB_SSL_V3, "ssl3"},
618 {SMB_SSL_V23, "ssl2or3"},
619 {SMB_SSL_TLS1, "tls1"},
624 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
625 static struct parm_struct parm_table[] = {
626 {"Base Options", P_SEP, P_SEPARATOR},
628 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
629 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, handle_client_code_page, NULL, 0},
630 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
631 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
632 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING},
633 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
634 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC | FLAG_DOS_STRING},
635 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING},
636 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, FLAG_DOS_STRING},
637 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
638 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC},
639 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, 0},
641 {"Security Options", P_SEP, P_SEPARATOR},
643 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC},
644 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC},
645 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
646 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, 0},
647 {"alternate permissions", P_BOOL, P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL | FLAG_DEPRECATED},
648 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
649 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
650 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
651 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
652 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
653 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
654 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
655 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
656 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
657 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
659 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
660 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
661 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
662 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
663 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
664 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
665 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
666 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0},
667 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
669 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
670 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
671 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
673 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
674 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
675 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
676 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
677 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
678 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
679 {"printer admin", P_STRING, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
680 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
681 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
682 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
684 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE},
685 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
686 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
687 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
689 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
690 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
691 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
692 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
693 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
694 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
695 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
696 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
697 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
698 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
699 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
700 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
701 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
703 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
704 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
706 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
707 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
708 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
709 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
710 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
713 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
714 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0},
716 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0},
717 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
718 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0},
719 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0},
720 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0},
721 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0},
722 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0},
723 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0},
724 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0},
725 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0},
726 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0},
727 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
728 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0},
729 #endif /* WITH_SSL */
731 {"Logging Options", P_SEP, P_SEPARATOR},
732 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_BASIC},
733 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, 0},
734 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
735 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
736 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
738 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
739 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
740 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
741 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
742 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
743 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
745 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT},
747 {"Protocol Options", P_SEP, P_SEPARATOR},
749 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
750 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
751 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
752 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
754 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
755 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
756 {"nt acl support", P_BOOL, P_GLOBAL, &Globals.bNTAclSupport, NULL, NULL, 0},
757 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
758 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
759 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
760 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
762 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
763 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
764 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
765 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
766 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
767 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
768 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
770 {"Tuning Options", P_SEP, P_SEPARATOR},
772 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
773 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
774 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
775 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
777 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
778 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
779 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
780 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
781 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
782 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
784 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
785 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
786 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
787 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
788 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
790 {"Printing Options", P_SEP, P_SEPARATOR},
792 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
793 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
794 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
795 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
796 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
797 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
798 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
799 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
800 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
801 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
802 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
803 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
804 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
805 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
807 {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, 0},
808 {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, 0},
809 {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, 0},
810 {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, 0},
812 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
813 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, 0},
814 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT},
815 {"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT},
816 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
818 {"Filename Handling", P_SEP, P_SEPARATOR},
819 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
821 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
822 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
823 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
824 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
825 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
826 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
827 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
828 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
829 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
830 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
831 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
832 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
833 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
834 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
835 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
836 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
837 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
838 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
839 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
840 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
842 {"Domain Options", P_SEP, P_SEPARATOR},
844 {"domain groups", P_STRING, P_GLOBAL, &Globals.szDomainGroups, NULL, NULL, 0},
845 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
846 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
847 {"domain admin users", P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL, NULL, 0},
848 {"domain guest users", P_STRING, P_GLOBAL, &Globals.szDomainGuestUsers, NULL, NULL, 0},
849 #ifdef USING_GROUPNAME_MAP
851 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
852 #endif /* USING_GROUPNAME_MAP */
854 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
856 {"Logon Options", P_SEP, P_SEPARATOR},
858 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
859 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
860 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
861 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
862 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
863 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
864 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
866 {"Browse Options", P_SEP, P_SEPARATOR},
868 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
869 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, 0},
870 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
871 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
872 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
873 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
874 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
875 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
876 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
877 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
879 {"WINS Options", P_SEP, P_SEPARATOR},
880 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
881 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
883 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, handle_wins_server_list, NULL, FLAG_BASIC},
884 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
885 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
887 {"Locking Options", P_SEP, P_SEPARATOR},
889 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
890 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
891 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
892 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
894 {"utmp", P_BOOL, P_LOCAL, &sDefault.bUtmp, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
897 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
898 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
899 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
900 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
901 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
902 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
903 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
906 {"Ldap Options", P_SEP, P_SEPARATOR},
908 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
909 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
910 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
911 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0},
912 {"ldap root", P_STRING, P_GLOBAL, &Globals.szLdapRoot, NULL, NULL, 0},
913 {"ldap root passwd", P_STRING, P_GLOBAL, &Globals.szLdapRootPassword, NULL, NULL, 0},
914 #endif /* WITH_LDAP */
916 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
917 {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
919 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
920 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
921 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
922 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
923 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
925 {"utmp dir", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
926 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
927 #endif /* WITH_UTMP */
929 {"default service", P_STRING, P_GLOBAL,
930 &Globals.szDefaultService, NULL, NULL, 0},
931 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
932 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
933 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
934 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
935 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
936 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0},
937 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
938 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
939 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
940 {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0},
941 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
942 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
944 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
945 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
946 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
947 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
949 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
950 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
951 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
952 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
953 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
954 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
955 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE},
956 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
957 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
958 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0},
959 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
960 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
961 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
962 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
963 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
964 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
965 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
966 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
968 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
969 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
971 {"VFS options", P_SEP, P_SEPARATOR},
973 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, 0},
974 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, 0},
977 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
978 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_GLOBAL},
980 {"Winbind options", P_SEP, P_SEPARATOR},
982 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_id, NULL, 0},
983 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_id, NULL, 0},
984 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, 0},
985 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, 0},
986 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, 0},
987 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
989 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
993 /***************************************************************************
994 Initialise the sDefault parameter structure for the printer values.
995 ***************************************************************************/
996 static void init_printer_values(void)
998 string_set(&sDefault.szPrinterDriver, "");
999 string_set(&sDefault.szDriverFile, DRIVERFILE);
1001 /* choose defaults depending on the type of printing */
1002 switch (sDefault.iPrinting)
1006 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1007 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1008 string_set(&sDefault.szPrintcommand,
1014 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1015 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1016 string_set(&sDefault.szPrintcommand,
1018 string_set(&sDefault.szQueuepausecommand,
1020 string_set(&sDefault.szQueueresumecommand,
1022 string_set(&sDefault.szLppausecommand,
1024 string_set(&sDefault.szLpresumecommand,
1025 "lpc release %p %j");
1029 string_set(&sDefault.szLpqcommand,
1030 "/usr/bin/lpstat -o%p");
1031 string_set(&sDefault.szLprmcommand,
1032 "/usr/bin/cancel %p-%j");
1033 string_set(&sDefault.szPrintcommand,
1034 "/usr/bin/lp -d%p -oraw %s; rm %s");
1035 string_set(&sDefault.szQueuepausecommand,
1036 "/usr/bin/disable %p");
1037 string_set(&sDefault.szQueueresumecommand,
1038 "/usr/bin/enable %p");
1043 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1044 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1045 string_set(&sDefault.szPrintcommand,
1046 "lp -c -d%p %s; rm %s");
1047 string_set(&sDefault.szQueuepausecommand,
1049 string_set(&sDefault.szQueueresumecommand,
1052 string_set(&sDefault.szLppausecommand,
1053 "lp -i %p-%j -H hold");
1054 string_set(&sDefault.szLpresumecommand,
1055 "lp -i %p-%j -H resume");
1060 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1061 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1062 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1066 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1067 string_set(&sDefault.szLprmcommand,
1068 "qstat -s -j%j -c");
1069 string_set(&sDefault.szPrintcommand,
1070 "lp -d%p -s %s; rm %s");
1071 string_set(&sDefault.szLppausecommand,
1072 "qstat -s -j%j -h");
1073 string_set(&sDefault.szLpresumecommand,
1074 "qstat -s -j%j -r");
1080 /***************************************************************************
1081 Initialise the global parameter structure.
1082 ***************************************************************************/
1083 static void init_globals(void)
1085 static BOOL done_init = False;
1091 memset((void *)&Globals, '\0', sizeof(Globals));
1093 for (i = 0; parm_table[i].label; i++)
1094 if ((parm_table[i].type == P_STRING ||
1095 parm_table[i].type == P_USTRING) &&
1097 string_set(parm_table[i].ptr, "");
1099 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
1100 string_set(&sDefault.fstype, FSTYPE_STRING);
1102 init_printer_values();
1108 DEBUG(3, ("Initialising global parameters\n"));
1110 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
1112 * Allow the default PASSWD_CHAT to be overridden in local.h.
1114 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1115 string_set(&Globals.szWorkGroup, WORKGROUP);
1116 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1117 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1118 string_set(&Globals.szLockDir, LOCKDIR);
1120 string_set(&Globals.szUtmpDir, "");
1121 #endif /* WITH_UTMP */
1122 string_set(&Globals.szSmbrun, SMBRUN);
1123 string_set(&Globals.szSocketAddress, "0.0.0.0");
1124 pstrcpy(s, "Samba ");
1125 pstrcat(s, VERSION);
1126 string_set(&Globals.szServerString, s);
1127 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1128 DEFAULT_MINOR_VERSION);
1129 string_set(&Globals.szAnnounceVersion, s);
1131 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1133 string_set(&Globals.szLogonDrive, "");
1134 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1135 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1136 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1138 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1140 Globals.bLoadPrinters = True;
1141 Globals.bUseRhosts = False;
1142 Globals.max_packet = 65535;
1143 Globals.mangled_stack = 50;
1144 Globals.max_xmit = 65535;
1145 Globals.max_mux = 50; /* This is *needed* for profile support. */
1146 Globals.lpqcachetime = 10;
1147 Globals.pwordlevel = 0;
1148 Globals.unamelevel = 0;
1149 Globals.deadtime = 0;
1150 Globals.max_log_size = 5000;
1151 Globals.max_open_files = MAX_OPEN_FILES;
1152 Globals.maxprotocol = PROTOCOL_NT1;
1153 Globals.security = SEC_USER;
1154 Globals.bEncryptPasswords = False;
1155 Globals.bUpdateEncrypt = False;
1156 Globals.bReadRaw = True;
1157 Globals.bWriteRaw = True;
1158 Globals.bReadPrediction = False;
1159 Globals.bReadbmpx = False;
1160 Globals.bNullPasswords = False;
1161 Globals.bStripDot = False;
1163 Globals.bSyslogOnly = False;
1164 Globals.bTimestampLogs = False;
1165 Globals.bDebugHiresTimestamp = False;
1166 Globals.bDebugPid = False;
1167 Globals.bDebugUid = False;
1168 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1169 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1170 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1171 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1172 Globals.change_notify_timeout = 60; /* 1 minute default. */
1173 Globals.ReadSize = 16 * 1024;
1174 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1175 Globals.lm_interval = 60;
1176 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1177 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1178 Globals.bUnixRealname = True;
1179 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1180 Globals.bNISHomeMap = False;
1181 #ifdef WITH_NISPLUS_HOME
1182 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1184 string_set(&Globals.szNISHomeMapName, "auto.home");
1187 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1188 Globals.bTimeServer = False;
1189 Globals.bBindInterfacesOnly = False;
1190 Globals.bUnixPasswdSync = False;
1191 Globals.bPasswdChatDebug = False;
1192 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
1193 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1194 Globals.bNTAclSupport = True; /* Use NT ACLs by default. */
1195 Globals.bStatCache = True; /* use stat cache by default */
1196 Globals.bRestrictAnonymous = False;
1197 Globals.map_to_guest = 0; /* By Default, "Never" */
1198 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1199 Globals.oplock_break_wait_time = 10; /* By Default, 10 msecs. */
1202 /* default values for ldap */
1203 string_set(&Globals.szLdapServer, "localhost");
1204 Globals.ldap_port = 389;
1205 #endif /* WITH_LDAP */
1208 Globals.sslVersion = SMB_SSL_V23;
1209 string_set(&Globals.sslHostsRequire, "");
1210 string_set(&Globals.sslHostsResign, "");
1211 string_set(&Globals.sslCaCertDir, "");
1212 string_set(&Globals.sslCaCertFile, "");
1213 string_set(&Globals.sslCert, "");
1214 string_set(&Globals.sslPrivKey, "");
1215 string_set(&Globals.sslClientCert, "");
1216 string_set(&Globals.sslClientPrivKey, "");
1217 string_set(&Globals.sslCiphers, "");
1218 Globals.sslEnabled = False;
1219 Globals.sslReqClientCert = False;
1220 Globals.sslReqServerCert = False;
1221 Globals.sslCompatibility = False;
1222 #endif /* WITH_SSL */
1224 /* these parameters are set to defaults that are more appropriate
1225 for the increasing samba install base:
1227 as a member of the workgroup, that will possibly become a
1228 _local_ master browser (lm = True). this is opposed to a forced
1229 local master browser startup (pm = True).
1231 doesn't provide WINS server service by default (wsupp = False),
1232 and doesn't provide domain master browser services by default, either.
1236 Globals.bMsAddPrinterWizard = True;
1237 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1238 Globals.os_level = 20;
1239 Globals.bLocalMaster = True;
1240 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1241 Globals.bDomainLogons = False;
1242 Globals.bBrowseList = True;
1243 Globals.bWINSsupport = False;
1244 Globals.bWINSproxy = False;
1246 Globals.bDNSproxy = True;
1248 /* this just means to use them if they exist */
1249 Globals.bKernelOplocks = True;
1251 Globals.bAllowTrustedDomains = True;
1253 string_set(&Globals.szTemplateShell, "/bin/false");
1254 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1255 string_set(&Globals.szWinbindSeparator, "\\");
1256 Globals.winbind_cache_time = 15;
1259 * This must be done last as it checks the value in
1263 interpret_coding_system(KANJI);
1266 static TALLOC_CTX *lp_talloc;
1268 /******************************************************************* a
1269 free up temporary memory - called from the main loop
1270 ********************************************************************/
1271 void lp_talloc_free(void)
1275 talloc_destroy(lp_talloc);
1279 /*******************************************************************
1280 convenience routine to grab string parameters into temporary memory
1281 and run standard_sub_basic on them. The buffers can be written to by
1282 callers without affecting the source string.
1283 ********************************************************************/
1284 static char *lp_string(const char *s)
1286 size_t len = s ? strlen(s) : 0;
1290 lp_talloc = talloc_init();
1292 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1300 StrnCpy(ret, s, len);
1302 trim_string(ret, "\"", "\"");
1304 standard_sub_basic(ret);
1310 In this section all the functions that are used to access the
1311 parameters from the rest of the program are defined
1314 #define FN_GLOBAL_STRING(fn_name,ptr) \
1315 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1316 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1317 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1318 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1319 char fn_name(void) {return(*(char *)(ptr));}
1320 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1321 int fn_name(void) {return(*(int *)(ptr));}
1323 #define FN_LOCAL_STRING(fn_name,val) \
1324 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1325 #define FN_LOCAL_BOOL(fn_name,val) \
1326 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1327 #define FN_LOCAL_CHAR(fn_name,val) \
1328 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1329 #define FN_LOCAL_INTEGER(fn_name,val) \
1330 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1332 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1333 FN_GLOBAL_STRING(lp_smbrun, &Globals.szSmbrun)
1334 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1335 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1336 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1337 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1338 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1339 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1340 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1341 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1343 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1344 #endif /* WITH_UTMP */
1345 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1346 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1347 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1348 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1349 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1350 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1351 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1352 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1353 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1354 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1355 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1356 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1357 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1358 #ifdef USING_GROUPNAME_MAP
1359 FN_GLOBAL_STRING(lp_groupname_map, &Globals.szGroupnameMap)
1360 #endif /* USING_GROUPNAME_MAP */
1361 FN_GLOBAL_STRING(lp_logon_script, &Globals.szLogonScript)
1362 FN_GLOBAL_STRING(lp_logon_path, &Globals.szLogonPath)
1363 FN_GLOBAL_STRING(lp_logon_drive, &Globals.szLogonDrive)
1364 FN_GLOBAL_STRING(lp_logon_home, &Globals.szLogonHome)
1365 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1366 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1367 FN_GLOBAL_STRING(lp_wins_server, &Globals.szWINSserver)
1368 FN_GLOBAL_STRING(lp_interfaces, &Globals.szInterfaces)
1369 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1370 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1371 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1372 FN_GLOBAL_STRING(lp_netbios_aliases, &Globals.szNetbiosAliases)
1373 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1374 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1375 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1376 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1377 FN_GLOBAL_STRING(lp_domain_groups, &Globals.szDomainGroups)
1378 FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
1379 FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
1380 FN_GLOBAL_STRING(lp_domain_admin_users, &Globals.szDomainAdminUsers)
1381 FN_GLOBAL_STRING(lp_domain_guest_users, &Globals.szDomainGuestUsers)
1382 FN_GLOBAL_STRING(lp_winbind_uid, &Globals.szWinbindUID)
1383 FN_GLOBAL_STRING(lp_winbind_gid, &Globals.szWinbindGID)
1384 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1385 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1386 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1388 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer);
1389 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix);
1390 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter);
1391 FN_GLOBAL_STRING(lp_ldap_root, &Globals.szLdapRoot);
1392 FN_GLOBAL_STRING(lp_ldap_rootpasswd, &Globals.szLdapRootPassword);
1393 #endif /* WITH_LDAP */
1396 FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion);
1397 FN_GLOBAL_STRING(lp_ssl_hosts, &Globals.sslHostsRequire);
1398 FN_GLOBAL_STRING(lp_ssl_hosts_resign, &Globals.sslHostsResign);
1399 FN_GLOBAL_STRING(lp_ssl_cacertdir, &Globals.sslCaCertDir);
1400 FN_GLOBAL_STRING(lp_ssl_cacertfile, &Globals.sslCaCertFile);
1401 FN_GLOBAL_STRING(lp_ssl_cert, &Globals.sslCert);
1402 FN_GLOBAL_STRING(lp_ssl_privkey, &Globals.sslPrivKey);
1403 FN_GLOBAL_STRING(lp_ssl_client_cert, &Globals.sslClientCert);
1404 FN_GLOBAL_STRING(lp_ssl_client_privkey, &Globals.sslClientPrivKey);
1405 FN_GLOBAL_STRING(lp_ssl_ciphers, &Globals.sslCiphers);
1406 FN_GLOBAL_BOOL(lp_ssl_enabled, &Globals.sslEnabled);
1407 FN_GLOBAL_BOOL(lp_ssl_reqClientCert, &Globals.sslReqClientCert);
1408 FN_GLOBAL_BOOL(lp_ssl_reqServerCert, &Globals.sslReqServerCert);
1409 FN_GLOBAL_BOOL(lp_ssl_compatibility, &Globals.sslCompatibility);
1410 #endif /* WITH_SSL */
1412 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1413 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1414 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1415 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1416 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1417 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1418 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1419 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1420 FN_GLOBAL_BOOL(lp_use_rhosts, &Globals.bUseRhosts)
1421 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1422 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1423 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1424 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1425 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1426 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1427 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1428 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1429 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1430 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1431 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1432 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1433 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1434 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1435 FN_GLOBAL_BOOL(lp_unix_realname, &Globals.bUnixRealname)
1436 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1437 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1438 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1439 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1440 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1441 FN_GLOBAL_BOOL(lp_nt_smb_support, &Globals.bNTSmbSupport)
1442 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1443 FN_GLOBAL_BOOL(lp_nt_acl_support, &Globals.bNTAclSupport)
1444 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1445 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1446 FN_GLOBAL_BOOL(lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1447 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1448 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1449 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1450 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1451 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1452 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.max_wins_ttl)
1453 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1454 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1455 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1456 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1457 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1458 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1459 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1460 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1461 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1462 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1463 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1464 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1465 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1466 FN_GLOBAL_INTEGER(lp_client_code_page, &Globals.client_code_page)
1467 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1468 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1469 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1470 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1471 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1472 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1473 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1474 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1475 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1477 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1478 #endif /* WITH_LDAP */
1479 FN_LOCAL_STRING(lp_preexec, szPreExec)
1480 FN_LOCAL_STRING(lp_postexec, szPostExec)
1481 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1482 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1483 FN_LOCAL_STRING(lp_servicename, szService)
1484 FN_LOCAL_STRING(lp_pathname, szPath)
1485 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1486 FN_LOCAL_STRING(lp_username, szUsername)
1487 FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
1488 FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
1489 FN_LOCAL_STRING(lp_valid_users, szValidUsers)
1490 FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
1491 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1492 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1493 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1494 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1495 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1496 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1497 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1498 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1499 FN_LOCAL_STRING(lp_driverfile, szDriverFile)
1500 FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)
1501 FN_LOCAL_STRING(lp_hostsallow, szHostsallow)
1502 FN_LOCAL_STRING(lp_hostsdeny, szHostsdeny)
1503 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1504 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1505 FN_LOCAL_STRING(lp_comment, comment)
1506 FN_LOCAL_STRING(lp_force_user, force_user)
1507 FN_LOCAL_STRING(lp_force_group, force_group)
1508 FN_LOCAL_STRING(lp_readlist, readlist)
1509 FN_LOCAL_STRING(lp_writelist, writelist)
1510 FN_LOCAL_STRING(lp_printer_admin, printer_admin)
1511 FN_LOCAL_STRING(lp_fstype, fstype)
1512 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1513 static FN_LOCAL_STRING(lp_volume, volume)
1514 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1515 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1516 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1517 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1518 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
1519 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1520 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1521 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1522 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1523 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1524 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1525 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1526 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1527 FN_LOCAL_BOOL(lp_status, status)
1528 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1529 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1530 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1531 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1532 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1533 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1534 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1535 FN_LOCAL_BOOL(lp_postscript, bPostscript)
1536 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1537 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1538 FN_LOCAL_BOOL(lp_locking, bLocking)
1539 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1540 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1542 FN_LOCAL_BOOL(lp_utmp, bUtmp)
1544 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1545 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1546 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1547 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1548 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1549 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1550 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1551 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1552 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1553 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1554 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1555 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1556 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1557 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1558 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1559 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1560 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1561 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1562 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1563 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1564 FN_LOCAL_INTEGER(_lp_security_mask, iSecurity_mask)
1565 FN_LOCAL_INTEGER(_lp_force_security_mode, iSecurity_force_mode)
1566 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1567 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1568 FN_LOCAL_INTEGER(_lp_dir_security_mask, iDir_Security_mask)
1569 FN_LOCAL_INTEGER(_lp_force_dir_security_mode, iDir_Security_force_mode)
1570 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1571 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1572 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1573 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1574 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1575 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1576 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1577 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1578 /* local prototypes */
1579 static int map_parameter(char *pszParmName);
1580 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1581 static int getservicebyname(char *pszServiceName,
1582 service * pserviceDest);
1583 static void copy_service(service * pserviceDest,
1584 service * pserviceSource, BOOL *pcopymapDest);
1585 static BOOL service_ok(int iService);
1586 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1587 static BOOL do_section(char *pszSectionName);
1588 static void init_copymap(service * pservice);
1591 /***************************************************************************
1592 initialise a service to the defaults
1593 ***************************************************************************/
1594 static void init_service(service * pservice)
1596 memset((char *)pservice, '\0', sizeof(service));
1597 copy_service(pservice, &sDefault, NULL);
1601 /***************************************************************************
1602 free the dynamically allocated parts of a service struct
1603 ***************************************************************************/
1604 static void free_service(service * pservice)
1610 if (pservice->szService)
1612 ("free_service: Freeing service %s\n",
1613 pservice->szService));
1615 string_free(&pservice->szService);
1616 if (pservice->copymap)
1618 free(pservice->copymap);
1619 pservice->copymap = NULL;
1622 for (i = 0; parm_table[i].label; i++)
1623 if ((parm_table[i].type == P_STRING ||
1624 parm_table[i].type == P_USTRING) &&
1625 parm_table[i].class == P_LOCAL)
1626 string_free((char **)
1627 (((char *)pservice) +
1628 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1631 /***************************************************************************
1632 add a new service to the services array initialising it with the given
1634 ***************************************************************************/
1635 static int add_a_service(service * pservice, char *name)
1639 int num_to_alloc = iNumServices + 1;
1641 tservice = *pservice;
1643 /* it might already exist */
1646 i = getservicebyname(name, NULL);
1651 /* find an invalid one */
1652 for (i = 0; i < iNumServices; i++)
1653 if (!pSERVICE(i)->valid)
1656 /* if not, then create one */
1657 if (i == iNumServices)
1660 (service **) Realloc(ServicePtrs,
1664 pSERVICE(iNumServices) =
1665 (service *) malloc(sizeof(service));
1667 if (!ServicePtrs || !pSERVICE(iNumServices))
1673 free_service(pSERVICE(i));
1675 pSERVICE(i)->valid = True;
1677 init_service(pSERVICE(i));
1678 copy_service(pSERVICE(i), &tservice, NULL);
1681 string_set(&iSERVICE(i).szService, name);
1682 unix_to_dos(iSERVICE(i).szService, True);
1687 /***************************************************************************
1688 add a new home service, with the specified home directory, defaults coming
1690 ***************************************************************************/
1691 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1693 int i = add_a_service(pSERVICE(iDefaultService), pszHomename);
1698 if (!(*(iSERVICE(i).szPath))
1699 || strequal(iSERVICE(i).szPath, lp_pathname(-1)))
1700 string_set(&iSERVICE(i).szPath, pszHomedir);
1701 if (!(*(iSERVICE(i).comment)))
1704 slprintf(comment, sizeof(comment) - 1,
1705 "Home directory of %s", pszHomename);
1706 string_set(&iSERVICE(i).comment, comment);
1708 iSERVICE(i).bAvailable = sDefault.bAvailable;
1709 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1712 ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1717 /***************************************************************************
1718 add a new service, based on an old one
1719 ***************************************************************************/
1720 int lp_add_service(char *pszService, int iDefaultService)
1722 return (add_a_service(pSERVICE(iDefaultService), pszService));
1726 /***************************************************************************
1728 ***************************************************************************/
1729 static BOOL lp_add_ipc(void)
1732 int i = add_a_service(&sDefault, "IPC$");
1737 slprintf(comment, sizeof(comment) - 1,
1738 "IPC Service (%s)", Globals.szServerString);
1740 string_set(&iSERVICE(i).szPath, tmpdir());
1741 string_set(&iSERVICE(i).szUsername, "");
1742 string_set(&iSERVICE(i).comment, comment);
1743 string_set(&iSERVICE(i).fstype, "IPC");
1744 iSERVICE(i).status = False;
1745 iSERVICE(i).iMaxConnections = 0;
1746 iSERVICE(i).bAvailable = True;
1747 iSERVICE(i).bRead_only = True;
1748 iSERVICE(i).bGuest_only = False;
1749 iSERVICE(i).bGuest_ok = True;
1750 iSERVICE(i).bPrint_ok = False;
1751 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1753 DEBUG(3, ("adding IPC service\n"));
1759 /***************************************************************************
1760 add a new printer service, with defaults coming from service iFrom
1761 ***************************************************************************/
1762 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
1764 char *comment = "From Printcap";
1765 int i = add_a_service(pSERVICE(iDefaultService), pszPrintername);
1770 /* note that we do NOT default the availability flag to True - */
1771 /* we take it from the default service passed. This allows all */
1772 /* dynamic printers to be disabled by disabling the [printers] */
1773 /* entry (if/when the 'available' keyword is implemented!). */
1775 /* the printer name is set to the service name. */
1776 string_set(&iSERVICE(i).szPrintername, pszPrintername);
1777 string_set(&iSERVICE(i).comment, comment);
1778 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1779 /* Printers cannot be read_only. */
1780 iSERVICE(i).bRead_only = False;
1781 /* No share modes on printer services. */
1782 iSERVICE(i).bShareModes = False;
1783 /* No oplocks on printer services. */
1784 iSERVICE(i).bOpLocks = False;
1785 /* Printer services must be printable. */
1786 iSERVICE(i).bPrint_ok = True;
1788 DEBUG(3, ("adding printer service %s\n", pszPrintername));
1793 /***************************************************************************
1794 Map a parameter's string representation to something we can use.
1795 Returns False if the parameter string is not recognised, else TRUE.
1796 ***************************************************************************/
1797 static int map_parameter(char *pszParmName)
1801 if (*pszParmName == '-')
1804 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1805 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1808 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
1813 /***************************************************************************
1814 Set a boolean variable from the text value stored in the passed string.
1815 Returns True in success, False if the passed string does not correctly
1816 represent a boolean.
1817 ***************************************************************************/
1818 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
1823 if (strwicmp(pszParmValue, "yes") == 0 ||
1824 strwicmp(pszParmValue, "true") == 0 ||
1825 strwicmp(pszParmValue, "1") == 0)
1828 if (strwicmp(pszParmValue, "no") == 0 ||
1829 strwicmp(pszParmValue, "False") == 0 ||
1830 strwicmp(pszParmValue, "0") == 0)
1835 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1842 /***************************************************************************
1843 Find a service by name. Otherwise works like get_service.
1844 ***************************************************************************/
1845 static int getservicebyname(char *pszServiceName, service * pserviceDest)
1849 for (iService = iNumServices - 1; iService >= 0; iService--)
1850 if (VALID(iService) &&
1851 strwicmp(iSERVICE(iService).szService,
1852 pszServiceName) == 0)
1854 if (pserviceDest != NULL)
1855 copy_service(pserviceDest, pSERVICE(iService),
1865 /***************************************************************************
1866 Copy a service structure to another
1868 If pcopymapDest is NULL then copy all fields
1869 ***************************************************************************/
1870 static void copy_service(service * pserviceDest,
1871 service * pserviceSource, BOOL *pcopymapDest)
1874 BOOL bcopyall = (pcopymapDest == NULL);
1876 for (i = 0; parm_table[i].label; i++)
1877 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
1878 (bcopyall || pcopymapDest[i]))
1880 void *def_ptr = parm_table[i].ptr;
1882 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
1885 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
1888 switch (parm_table[i].type)
1892 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
1898 *(int *)dest_ptr = *(int *)src_ptr;
1902 *(char *)dest_ptr = *(char *)src_ptr;
1906 string_set(dest_ptr,
1911 string_set(dest_ptr,
1913 strupper(*(char **)dest_ptr);
1922 init_copymap(pserviceDest);
1923 if (pserviceSource->copymap)
1924 memcpy((void *)pserviceDest->copymap,
1925 (void *)pserviceSource->copymap,
1926 sizeof(BOOL) * NUMPARAMETERS);
1930 /***************************************************************************
1931 Check a service for consistency. Return False if the service is in any way
1932 incomplete or faulty, else True.
1933 ***************************************************************************/
1934 static BOOL service_ok(int iService)
1939 if (iSERVICE(iService).szService[0] == '\0')
1942 ("The following message indicates an internal error:\n"));
1943 DEBUG(0, ("No service name in service entry.\n"));
1947 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
1948 /* I can't see why you'd want a non-printable printer service... */
1949 if (strwicmp(iSERVICE(iService).szService, PRINTERS_NAME) == 0) {
1950 if (!iSERVICE(iService).bPrint_ok) {
1952 ("WARNING: [%s] service MUST be printable!\n",
1953 iSERVICE(iService).szService));
1954 iSERVICE(iService).bPrint_ok = True;
1956 /* [printers] service must also be non-browsable. */
1957 if (iSERVICE(iService).bBrowseable)
1958 iSERVICE(iService).bBrowseable = False;
1961 if (iSERVICE(iService).szPath[0] == '\0' &&
1962 strwicmp(iSERVICE(iService).szService, HOMES_NAME) != 0)
1965 ("No path in service %s - using %s\n",
1966 iSERVICE(iService).szService, tmpdir()));
1967 string_set(&iSERVICE(iService).szPath, tmpdir());
1970 /* If a service is flagged unavailable, log the fact at level 0. */
1971 if (!iSERVICE(iService).bAvailable)
1972 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
1973 iSERVICE(iService).szService));
1978 static struct file_lists
1980 struct file_lists *next;
1986 /*******************************************************************
1987 keep a linked list of all config files so we know when one has changed
1988 it's date and needs to be reloaded
1989 ********************************************************************/
1990 static void add_to_file_list(char *fname)
1992 struct file_lists *f = file_lists;
1996 if (f->name && !strcmp(f->name, fname))
2003 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2006 f->next = file_lists;
2007 f->name = strdup(fname);
2019 standard_sub_basic(n2);
2020 f->modtime = file_modtime(n2);
2025 /*******************************************************************
2026 check if a config file has changed date
2027 ********************************************************************/
2028 BOOL lp_file_list_changed(void)
2030 struct file_lists *f = file_lists;
2031 DEBUG(6, ("lp_file_list_changed()\n"));
2038 pstrcpy(n2, f->name);
2039 standard_sub_basic(n2);
2041 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2042 f->name, n2, ctime(&f->modtime)));
2044 mod_time = file_modtime(n2);
2046 if (f->modtime != mod_time)
2049 ("file %s modified: %s\n", n2,
2051 f->modtime = mod_time;
2059 /***************************************************************************
2060 Run standard_sub_basic on netbios name... needed because global_myname
2061 is not accessed through any lp_ macro.
2062 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2063 ***************************************************************************/
2065 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2067 pstring netbios_name;
2069 pstrcpy(netbios_name, pszParmValue);
2071 standard_sub_basic(netbios_name);
2072 strupper(netbios_name);
2075 * Convert from UNIX to DOS string - the UNIX to DOS converter
2076 * isn't called on the special handlers.
2078 unix_to_dos(netbios_name, True);
2079 pstrcpy(global_myname, netbios_name);
2082 ("handle_netbios_name: set global_myname to: %s\n",
2088 /***************************************************************************
2089 Do the work of sourcing in environment variable/value pairs.
2090 ***************************************************************************/
2092 static BOOL source_env(char **lines)
2099 for (i = 0; lines[i]; i++)
2101 char *line = lines[i];
2103 if ((len = strlen(line)) == 0)
2106 if (line[len - 1] == '\n')
2109 if ((varval = malloc(len + 1)) == NULL)
2111 DEBUG(0, ("source_env: Not enough memory!\n"));
2115 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2116 strncpy(varval, line, len);
2119 p = strchr(line, (int)'=');
2122 DEBUG(4, ("source_env: missing '=': %s\n", line));
2129 ("source_env: Failed to put environment variable %s\n",
2137 ("source_env: getting var %s = %s\n", line,
2141 DEBUG(4, ("source_env: returning successfully\n"));
2145 /***************************************************************************
2146 Handle the source environment operation
2147 ***************************************************************************/
2149 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2156 pstrcpy(fname, pszParmValue);
2158 standard_sub_basic(fname);
2160 string_set(ptr, pszParmValue);
2162 DEBUG(4, ("handle_source_env: checking env type\n"));
2165 * Filename starting with '|' means popen and read from stdin.
2170 lines = file_lines_pload(p + 1, NULL);
2174 lines = file_lines_load(fname, NULL);
2180 ("handle_source_env: Failed to open file %s, Error was %s\n",
2181 fname, strerror(errno)));
2185 result = source_env(lines);
2186 file_lines_free(lines);
2191 /***************************************************************************
2192 handle the interpretation of the vfs object parameter
2193 *************************************************************************/
2194 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2196 /* Set string value */
2198 string_set(ptr, pszParmValue);
2200 /* Do any other initialisation required for vfs. Note that
2201 anything done here may have linking repercussions in nmbd. */
2206 /***************************************************************************
2207 handle the interpretation of the coding system parameter
2208 *************************************************************************/
2209 static BOOL handle_coding_system(char *pszParmValue, char **ptr)
2211 string_set(ptr, pszParmValue);
2212 interpret_coding_system(pszParmValue);
2216 /***************************************************************************
2217 Handle the interpretation of the character set system parameter.
2218 ***************************************************************************/
2220 static char *saved_character_set = NULL;
2222 static BOOL handle_character_set(char *pszParmValue, char **ptr)
2224 /* A dependency here is that the parameter client code page should be
2225 set before this is called.
2227 string_set(ptr, pszParmValue);
2229 saved_character_set = strdup(*ptr);
2230 interpret_character_set(*ptr, lp_client_code_page());
2234 /***************************************************************************
2235 Handle the interpretation of the client code page parameter.
2236 We handle this separately so that we can reset the character set
2237 parameter in case this came before 'client code page' in the smb.conf.
2238 ***************************************************************************/
2240 static BOOL handle_client_code_page(char *pszParmValue, char **ptr)
2242 Globals.client_code_page = atoi(pszParmValue);
2243 if (saved_character_set != NULL)
2244 interpret_character_set(saved_character_set,
2245 lp_client_code_page());
2246 codepage_initialise(lp_client_code_page());
2250 /***************************************************************************
2251 handle the valid chars lines
2252 ***************************************************************************/
2254 static BOOL handle_valid_chars(char *pszParmValue, char **ptr)
2256 string_set(ptr, pszParmValue);
2258 /* A dependency here is that the parameter client code page must be
2259 set before this is called - as calling codepage_initialise()
2260 would overwrite the valid char lines.
2262 codepage_initialise(lp_client_code_page());
2264 add_char_string(pszParmValue);
2268 /***************************************************************************
2269 handle the include operation
2270 ***************************************************************************/
2272 static BOOL handle_include(char *pszParmValue, char **ptr)
2275 pstrcpy(fname, pszParmValue);
2277 add_to_file_list(fname);
2279 standard_sub_basic(fname);
2281 string_set(ptr, fname);
2283 if (file_exist(fname, NULL))
2284 return (pm_process(fname, do_section, do_parameter));
2286 DEBUG(2, ("Can't find include file %s\n", fname));
2292 /***************************************************************************
2293 handle the interpretation of the copy parameter
2294 ***************************************************************************/
2295 static BOOL handle_copy(char *pszParmValue, char **ptr)
2299 service serviceTemp;
2301 string_set(ptr, pszParmValue);
2303 init_service(&serviceTemp);
2307 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2309 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2311 if (iTemp == iServiceIndex)
2314 ("Can't copy service %s - unable to copy self!\n",
2319 copy_service(pSERVICE(iServiceIndex),
2321 iSERVICE(iServiceIndex).copymap);
2327 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2332 free_service(&serviceTemp);
2336 /***************************************************************************
2337 Handle winbind uid and gid allocation parameters. The format of these
2342 winbind uid = 1000-1999
2343 winbind gid = 700-899
2345 We only do simple parsing checks here. The strings are parsed into useful
2346 structures in the winbind daemon code.
2348 ***************************************************************************/
2350 /* Do some simple checks on "winbind [ug]id" parameter value */
2352 static BOOL handle_winbind_id(char *pszParmValue, char **ptr)
2356 if (sscanf(pszParmValue, "%d-%d", &low, &high) != 2)
2363 string_set(ptr, pszParmValue);
2368 /***************************************************************************
2369 Handle the WINS SERVER list
2370 ***************************************************************************/
2371 static BOOL handle_wins_server_list( char *pszParmValue, char **ptr )
2373 if( !wins_srv_load_list( pszParmValue ) )
2374 return( False ); /* Parse failed. */
2376 string_set( ptr, pszParmValue );
2381 /***************************************************************************
2382 initialise a copymap
2383 ***************************************************************************/
2384 static void init_copymap(service * pservice)
2387 if (pservice->copymap)
2388 free(pservice->copymap);
2389 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2390 if (!pservice->copymap)
2392 ("Couldn't allocate copymap!! (size %d)\n",
2393 (int)NUMPARAMETERS));
2395 for (i = 0; i < NUMPARAMETERS; i++)
2396 pservice->copymap[i] = True;
2400 /***************************************************************************
2401 return the local pointer to a parameter given the service number and the
2402 pointer into the default structure
2403 ***************************************************************************/
2404 void *lp_local_ptr(int snum, void *ptr)
2406 return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr, &sDefault));
2409 /***************************************************************************
2410 Process a parameter for a particular service number. If snum < 0
2411 then assume we are in the globals
2412 ***************************************************************************/
2413 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2416 void *parm_ptr = NULL; /* where we are going to store the result */
2417 void *def_ptr = NULL;
2419 parmnum = map_parameter(pszParmName);
2424 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2428 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2430 DEBUG(1, ("WARNING: The \"%s\"option is deprecated\n",
2434 def_ptr = parm_table[parmnum].ptr;
2436 /* we might point at a service, the default service or a global */
2443 if (parm_table[parmnum].class == P_GLOBAL)
2446 ("Global parameter %s found in service section!\n",
2451 ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,
2457 if (!iSERVICE(snum).copymap)
2458 init_copymap(pSERVICE(snum));
2460 /* this handles the aliases - set the copymap for other entries with
2461 the same data pointer */
2462 for (i = 0; parm_table[i].label; i++)
2463 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2464 iSERVICE(snum).copymap[i] = False;
2467 /* if it is a special case then go ahead */
2468 if (parm_table[parmnum].special)
2470 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2474 /* now switch on the type of variable it is */
2475 switch (parm_table[parmnum].type)
2478 set_boolean(parm_ptr, pszParmValue);
2482 set_boolean(parm_ptr, pszParmValue);
2483 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2487 *(int *)parm_ptr = atoi(pszParmValue);
2491 *(char *)parm_ptr = *pszParmValue;
2495 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2499 string_set(parm_ptr, pszParmValue);
2500 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2501 unix_to_dos(*(char **)parm_ptr, True);
2505 string_set(parm_ptr, pszParmValue);
2506 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2507 unix_to_dos(*(char **)parm_ptr, True);
2508 strupper(*(char **)parm_ptr);
2512 pstrcpy((char *)parm_ptr, pszParmValue);
2513 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2514 unix_to_dos((char *)parm_ptr, True);
2518 pstrcpy((char *)parm_ptr, pszParmValue);
2519 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2520 unix_to_dos((char *)parm_ptr, True);
2521 strupper((char *)parm_ptr);
2525 for (i = 0; parm_table[parmnum].enum_list[i].name;
2530 parm_table[parmnum].enum_list[i].name))
2533 parm_table[parmnum].
2546 /***************************************************************************
2547 Process a parameter.
2548 ***************************************************************************/
2549 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2551 if (!bInGlobalSection && bGlobalOnly)
2554 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2556 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2557 pszParmName, pszParmValue));
2561 /***************************************************************************
2562 print a parameter of the specified type
2563 ***************************************************************************/
2564 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
2570 for (i = 0; p->enum_list[i].name; i++)
2572 if (*(int *)ptr == p->enum_list[i].value)
2575 p->enum_list[i].name);
2582 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2586 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2590 fprintf(f, "%d", *(int *)ptr);
2594 fprintf(f, "%c", *(char *)ptr);
2598 fprintf(f, "%s", octal_string(*(int *)ptr));
2604 fprintf(f, "%s", (char *)ptr);
2610 fprintf(f, "%s", *(char **)ptr);
2618 /***************************************************************************
2619 check if two parameters are equal
2620 ***************************************************************************/
2621 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2627 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2632 return (*((int *)ptr1) == *((int *)ptr2));
2635 return (*((char *)ptr1) == *((char *)ptr2));
2640 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2645 return (p1 == p2 || strequal(p1, p2));
2650 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2655 return (p1 == p2 || strequal(p1, p2));
2663 /***************************************************************************
2664 Initialize any local varients in the sDefault table.
2665 ***************************************************************************/
2667 void init_locals(void)
2672 /***************************************************************************
2673 Process a new section (service). At this stage all sections are services.
2674 Later we'll have special sections that permit server parameters to be set.
2675 Returns True on success, False on failure.
2676 ***************************************************************************/
2677 static BOOL do_section(char *pszSectionName)
2680 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2681 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2684 /* if we were in a global section then do the local inits */
2685 if (bInGlobalSection && !isglobal)
2688 /* if we've just struck a global section, note the fact. */
2689 bInGlobalSection = isglobal;
2691 /* check for multiple global sections */
2692 if (bInGlobalSection)
2694 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
2698 if (!bInGlobalSection && bGlobalOnly)
2701 /* if we have a current service, tidy it up before moving on */
2704 if (iServiceIndex >= 0)
2705 bRetval = service_ok(iServiceIndex);
2707 /* if all is still well, move to the next record in the services array */
2710 /* We put this here to avoid an odd message order if messages are */
2711 /* issued by the post-processing of a previous section. */
2712 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
2714 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
2717 DEBUG(0, ("Failed to add a new service\n"));
2726 /***************************************************************************
2727 determine if a partcular base parameter is currently set to the default value.
2728 ***************************************************************************/
2729 static BOOL is_default(int i)
2731 if (!defaults_saved)
2733 switch (parm_table[i].type)
2737 return strequal(parm_table[i].def.svalue,
2738 *(char **)parm_table[i].ptr);
2741 return strequal(parm_table[i].def.svalue,
2742 (char *)parm_table[i].ptr);
2745 return parm_table[i].def.bvalue ==
2746 *(BOOL *)parm_table[i].ptr;
2748 return parm_table[i].def.cvalue ==
2749 *(char *)parm_table[i].ptr;
2753 return parm_table[i].def.ivalue ==
2754 *(int *)parm_table[i].ptr;
2762 /***************************************************************************
2763 Display the contents of the global structure.
2764 ***************************************************************************/
2765 static void dump_globals(FILE * f)
2768 fprintf(f, "# Global parameters\n[global]\n");
2770 for (i = 0; parm_table[i].label; i++)
2771 if (parm_table[i].class == P_GLOBAL &&
2772 parm_table[i].ptr &&
2773 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2775 if (defaults_saved && is_default(i))
2777 fprintf(f, "\t%s = ", parm_table[i].label);
2778 print_parameter(&parm_table[i], parm_table[i].ptr, f);
2783 /***************************************************************************
2784 return True if a local parameter is currently set to the global default
2785 ***************************************************************************/
2786 BOOL lp_is_default(int snum, struct parm_struct *parm)
2788 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
2790 return equal_parameter(parm->type,
2791 ((char *)pSERVICE(snum)) + pdiff,
2792 ((char *)&sDefault) + pdiff);
2796 /***************************************************************************
2797 Display the contents of a single services record.
2798 ***************************************************************************/
2799 static void dump_a_service(service * pService, FILE * f)
2802 if (pService != &sDefault)
2803 fprintf(f, "\n[%s]\n", pService->szService);
2805 for (i = 0; parm_table[i].label; i++)
2806 if (parm_table[i].class == P_LOCAL &&
2807 parm_table[i].ptr &&
2808 (*parm_table[i].label != '-') &&
2809 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2811 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
2813 if (pService == &sDefault)
2815 if (defaults_saved && is_default(i))
2820 if (equal_parameter(parm_table[i].type,
2821 ((char *)pService) +
2823 ((char *)&sDefault) +
2828 fprintf(f, "\t%s = ", parm_table[i].label);
2829 print_parameter(&parm_table[i],
2830 ((char *)pService) + pdiff, f);
2836 /***************************************************************************
2837 return info about the next service in a service. snum==-1 gives the globals
2839 return NULL when out of parameters
2840 ***************************************************************************/
2841 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
2845 /* do the globals */
2846 for (; parm_table[*i].label; (*i)++)
2848 if (parm_table[*i].class == P_SEPARATOR)
2849 return &parm_table[(*i)++];
2851 if (!parm_table[*i].ptr
2852 || (*parm_table[*i].label == '-'))
2856 && (parm_table[*i].ptr ==
2857 parm_table[(*i) - 1].ptr))
2860 return &parm_table[(*i)++];
2865 service *pService = pSERVICE(snum);
2867 for (; parm_table[*i].label; (*i)++)
2869 if (parm_table[*i].class == P_SEPARATOR)
2870 return &parm_table[(*i)++];
2872 if (parm_table[*i].class == P_LOCAL &&
2873 parm_table[*i].ptr &&
2874 (*parm_table[*i].label != '-') &&
2876 (parm_table[*i].ptr !=
2877 parm_table[(*i) - 1].ptr)))
2880 PTR_DIFF(parm_table[*i].ptr,
2883 if (allparameters ||
2884 !equal_parameter(parm_table[*i].type,
2885 ((char *)pService) +
2887 ((char *)&sDefault) +
2890 return &parm_table[(*i)++];
2901 /***************************************************************************
2902 Display the contents of a single copy structure.
2903 ***************************************************************************/
2904 static void dump_copy_map(BOOL *pcopymap)
2910 printf("\n\tNon-Copied parameters:\n");
2912 for (i = 0; parm_table[i].label; i++)
2913 if (parm_table[i].class == P_LOCAL &&
2914 parm_table[i].ptr && !pcopymap[i] &&
2915 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2917 printf("\t\t%s\n", parm_table[i].label);
2922 /***************************************************************************
2923 Return TRUE if the passed service number is within range.
2924 ***************************************************************************/
2925 BOOL lp_snum_ok(int iService)
2927 return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
2931 /***************************************************************************
2932 auto-load some home services
2933 ***************************************************************************/
2934 static void lp_add_auto_services(char *str)
2947 homes = lp_servicenumber(HOMES_NAME);
2949 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP))
2951 char *home = get_user_home_dir(p);
2953 if (lp_servicenumber(p) >= 0)
2956 if (home && homes >= 0)
2958 lp_add_home(p, homes, home);
2964 /***************************************************************************
2965 auto-load one printer
2966 ***************************************************************************/
2967 void lp_add_one_printer(char *name, char *comment)
2969 int printers = lp_servicenumber(PRINTERS_NAME);
2972 if (lp_servicenumber(name) < 0)
2974 lp_add_printer(name, printers);
2975 if ((i = lp_servicenumber(name)) >= 0)
2977 string_set(&iSERVICE(i).comment, comment);
2978 iSERVICE(i).autoloaded = True;
2983 /***************************************************************************
2984 have we loaded a services file yet?
2985 ***************************************************************************/
2986 BOOL lp_loaded(void)
2991 /***************************************************************************
2992 unload unused services
2993 ***************************************************************************/
2994 void lp_killunused(BOOL (*snumused) (int))
2997 for (i = 0; i < iNumServices; i++)
3002 if (!snumused || !snumused(i))
3004 iSERVICE(i).valid = False;
3005 free_service(pSERVICE(i));
3011 /***************************************************************************
3013 ***************************************************************************/
3014 void lp_killservice(int iServiceIn)
3016 if (VALID(iServiceIn))
3018 iSERVICE(iServiceIn).valid = False;
3019 free_service(pSERVICE(iServiceIn));
3023 /***************************************************************************
3024 save the curent values of all global and sDefault parameters into the
3025 defaults union. This allows swat and testparm to show only the
3026 changed (ie. non-default) parameters.
3027 ***************************************************************************/
3028 static void lp_save_defaults(void)
3031 for (i = 0; parm_table[i].label; i++)
3033 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3035 switch (parm_table[i].type)
3039 parm_table[i].def.svalue =
3040 strdup(*(char **)parm_table[i].ptr);
3044 parm_table[i].def.svalue =
3045 strdup((char *)parm_table[i].ptr);
3049 parm_table[i].def.bvalue =
3050 *(BOOL *)parm_table[i].ptr;
3053 parm_table[i].def.cvalue =
3054 *(char *)parm_table[i].ptr;
3059 parm_table[i].def.ivalue =
3060 *(int *)parm_table[i].ptr;
3066 defaults_saved = True;
3069 /*******************************************************************
3070 Set the server type we will announce as via nmbd.
3071 ********************************************************************/
3072 static void set_server_role(void)
3074 server_role = ROLE_STANDALONE;
3076 switch (lp_security())
3080 if (lp_domain_logons())
3083 ("Server's Role (logon server) conflicts with share-level security\n"));
3090 if (lp_domain_logons())
3092 server_role = ROLE_DOMAIN_BDC;
3095 server_role = ROLE_DOMAIN_MEMBER;
3100 if (lp_domain_logons())
3102 server_role = ROLE_DOMAIN_PDC;
3110 ("Server's Role undefined due to unknown security mode\n"));
3116 /***************************************************************************
3117 Load the services array from the services file. Return True on success,
3119 ***************************************************************************/
3120 BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults,
3126 add_to_file_list(pszFname);
3130 bInGlobalSection = True;
3131 bGlobalOnly = global_only;
3141 pstrcpy(n2, pszFname);
3142 standard_sub_basic(n2);
3144 /* We get sections first, so have to start 'behind' to make up */
3146 bRetval = pm_process(n2, do_section, do_parameter);
3148 /* finish up the last section */
3149 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3151 if (iServiceIndex >= 0)
3152 bRetval = service_ok(iServiceIndex);
3154 lp_add_auto_services(lp_auto_services());
3160 set_default_server_announce_type();
3164 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3165 /* if bWINSsupport is true and we are in the client */
3167 if (in_client && Globals.bWINSsupport)
3170 string_set(&Globals.szWINSserver, "127.0.0.1");
3178 /***************************************************************************
3179 reset the max number of services
3180 ***************************************************************************/
3181 void lp_resetnumservices(void)
3186 /***************************************************************************
3187 return the max number of services
3188 ***************************************************************************/
3189 int lp_numservices(void)
3191 return (iNumServices);
3194 /***************************************************************************
3195 Display the contents of the services array in human-readable form.
3196 ***************************************************************************/
3197 void lp_dump(FILE * f, BOOL show_defaults, int maxtoprint)
3203 defaults_saved = False;
3208 dump_a_service(&sDefault, f);
3210 for (iService = 0; iService < maxtoprint; iService++)
3211 lp_dump_one(f, show_defaults, iService);
3214 /***************************************************************************
3215 Display the contents of one service in human-readable form.
3216 ***************************************************************************/
3217 void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
3221 if (iSERVICE(snum).szService[0] == '\0')
3223 dump_a_service(pSERVICE(snum), f);
3228 /***************************************************************************
3229 Return the number of the service with the given name, or -1 if it doesn't
3230 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3231 getservicebyname()! This works ONLY if all services have been loaded, and
3232 does not copy the found service.
3233 ***************************************************************************/
3234 int lp_servicenumber(char *pszServiceName)
3238 for (iService = iNumServices - 1; iService >= 0; iService--)
3239 if (VALID(iService) &&
3240 strequal(lp_servicename(iService), pszServiceName))
3245 ("lp_servicenumber: couldn't find %s\n",
3251 /*******************************************************************
3252 a useful volume label function
3253 ******************************************************************/
3254 char *volume_label(int snum)
3256 char *ret = lp_volume(snum);
3258 /* lp_volume returns a unix charset - lp_servicename returns a
3259 dos codepage - convert so volume_label() always returns UNIX.
3261 return (dos_to_unix(lp_servicename(snum), False));
3267 /*******************************************************************
3268 Set the server type we will announce as via nmbd.
3269 ********************************************************************/
3270 static void set_default_server_announce_type(void)
3272 default_server_announce = 0;
3273 default_server_announce |= SV_TYPE_WORKSTATION;
3274 default_server_announce |= SV_TYPE_SERVER;
3275 default_server_announce |= SV_TYPE_SERVER_UNIX;
3276 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3278 switch (lp_announce_as())
3280 case ANNOUNCE_AS_NT_SERVER:
3282 default_server_announce |= SV_TYPE_SERVER_NT;
3283 /* fall through... */
3285 case ANNOUNCE_AS_NT_WORKSTATION:
3287 default_server_announce |= SV_TYPE_NT;
3290 case ANNOUNCE_AS_WIN95:
3292 default_server_announce |= SV_TYPE_WIN95_PLUS;
3295 case ANNOUNCE_AS_WFW:
3297 default_server_announce |= SV_TYPE_WFW;
3306 switch (lp_server_role())
3308 case ROLE_DOMAIN_MEMBER:
3310 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3313 case ROLE_DOMAIN_PDC:
3315 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3318 case ROLE_DOMAIN_BDC:
3320 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3323 case ROLE_STANDALONE:
3330 if (lp_time_server())
3332 default_server_announce |= SV_TYPE_TIME_SOURCE;
3335 if (lp_host_msdfs())
3337 default_server_announce |= SV_TYPE_DFS_SERVER;
3341 /***********************************************************
3342 returns role of Samba server
3343 ************************************************************/
3345 int lp_server_role(void)
3350 /***********************************************************
3351 If we are PDC then prefer us as DMB
3352 ************************************************************/
3354 BOOL lp_domain_master(void)
3356 if (Globals.bDomainMaster == Auto)
3358 return (lp_server_role() == ROLE_DOMAIN_PDC);
3361 return Globals.bDomainMaster;
3364 /***********************************************************
3365 If we are DMB then prefer us as LMB
3366 ************************************************************/
3368 BOOL lp_preferred_master(void)
3370 if (Globals.bPreferredMaster == Auto)
3372 return (lp_local_master() && lp_domain_master());
3375 return Globals.bPreferredMaster;
3380 /*******************************************************************
3382 ********************************************************************/
3383 void lp_remove_service(int snum)
3385 pSERVICE(snum)->valid = False;
3388 /*******************************************************************
3390 ********************************************************************/
3391 void lp_copy_service(int snum, char *new_name)
3393 char *oldname = lp_servicename(snum);
3394 do_section(new_name);
3397 snum = lp_servicenumber(new_name);
3399 lp_do_parameter(snum, "copy", oldname);
3404 /*******************************************************************
3405 Get the default server type we will announce as via nmbd.
3406 ********************************************************************/
3407 int lp_default_server_announce(void)
3409 return default_server_announce;
3412 /*******************************************************************
3413 Split the announce version into major and minor numbers.
3414 ********************************************************************/
3415 int lp_major_announce_version(void)
3417 static BOOL got_major = False;
3418 static int major_version = DEFAULT_MAJOR_VERSION;
3423 return major_version;
3426 if ((vers = lp_announce_version()) == NULL)
3427 return major_version;
3429 if ((p = strchr(vers, '.')) == 0)
3430 return major_version;
3433 major_version = atoi(vers);
3434 return major_version;
3437 int lp_minor_announce_version(void)
3439 static BOOL got_minor = False;
3440 static int minor_version = DEFAULT_MINOR_VERSION;
3445 return minor_version;
3448 if ((vers = lp_announce_version()) == NULL)
3449 return minor_version;
3451 if ((p = strchr(vers, '.')) == 0)
3452 return minor_version;
3455 minor_version = atoi(p);
3456 return minor_version;
3459 /***********************************************************
3460 Set the global name resolution order (used in smbclient).
3461 ************************************************************/
3463 void lp_set_name_resolve_order(char *new_order)
3465 Globals.szNameResolveOrder = new_order;
3468 /***********************************************************
3469 Functions to return the current security masks/modes. If
3470 set to -1 then return the create mask/mode instead.
3471 ************************************************************/
3473 int lp_security_mask(int snum)
3475 int val = _lp_security_mask(snum);
3477 return lp_create_mask(snum);
3481 int lp_force_security_mode(int snum)
3483 int val = _lp_force_security_mode(snum);
3485 return lp_force_create_mode(snum);
3489 int lp_dir_security_mask(int snum)
3491 int val = _lp_dir_security_mask(snum);
3493 return lp_dir_mask(snum);
3497 int lp_force_dir_security_mode(int snum)
3499 int val = _lp_force_dir_security_mode(snum);
3501 return lp_force_dir_mode(snum);
3505 char *lp_printername(int snum)
3507 char *ret = _lp_printername(snum);
3508 if (ret == NULL || (ret != NULL && *ret == '\0'))
3509 ret = lp_servicename(snum);