2
Unix SMB/CIFS implementation.
3
Parameter loading functions
4
Copyright (C) Karl Auer 1993-1998
6
Largely re-written by Andrew Tridgell, September 1994
8
Copyright (C) Simo Sorce 2001
9
Copyright (C) Alexander Bokovoy 2002
10
Copyright (C) Stefan (metze) Metzmacher 2002
11
Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
13
This program is free software; you can redistribute it and/or modify
14
it under the terms of the GNU General Public License as published by
15
the Free Software Foundation; either version 2 of the License, or
16
(at your option) any later version.
18
This program is distributed in the hope that it will be useful,
19
but WITHOUT ANY WARRANTY; without even the implied warranty of
20
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
GNU General Public License for more details.
23
You should have received a copy of the GNU General Public License
24
along with this program; if not, write to the Free Software
25
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31
* This module provides suitable callback functions for the params
32
* module. It builds the internal table of service details which is
33
* then used by the rest of the server.
37
* 1) add it to the global or service structure definition
38
* 2) add it to the parm_table
39
* 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
40
* 4) If it's a global then initialise it in init_globals. If a local
41
* (ie. service) parameter then initialise it in the sDefault structure
45
* The configuration file is processed sequentially for speed. It is NOT
46
* accessed randomly as happens in 'real' Windows. For this reason, there
47
* is a fair bit of sequence-dependent code here - ie., code which assumes
48
* that certain things happen before others. In particular, the code which
49
* happens at the boundary between sections is delicately poised, so be
56
BOOL in_client = False; /* Not in the client by default */
59
extern pstring user_socket_options;
60
extern enum protocol_types Protocol;
61
extern userdom_struct current_user_info;
64
#define GLOBAL_NAME "global"
68
#define PRINTERS_NAME "printers"
72
#define HOMES_NAME "homes"
75
/* some helpful bits */
76
#define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
77
#define VALID(i) (ServicePtrs != NULL && ServicePtrs[i]->valid)
79
#define USERSHARE_VALID 1
80
#define USERSHARE_PENDING_DELETE 2
82
int keepalive = DEFAULT_KEEPALIVE;
83
BOOL use_getwd_cache = True;
85
extern int extra_time_offset;
87
static BOOL defaults_saved = False;
89
typedef struct _param_opt_struct param_opt_struct;
90
struct _param_opt_struct {
91
param_opt_struct *prev, *next;
98
* This structure describes global (ie., server-wide) parameters.
104
char *display_charset;
105
char *szPrintcapname;
106
char *szAddPortCommand;
107
char *szEnumPortsCommand;
108
char *szAddPrinterCommand;
109
char *szDeletePrinterCommand;
110
char *szOs2DriverMap;
114
char *szDefaultService;
118
char *szServerString;
119
char *szAutoServices;
120
char *szPasswdProgram;
124
char *szSMBPasswdFile;
126
char *szPassdbBackend;
127
char **szPreloadModules;
128
char *szPasswordServer;
129
char *szSocketOptions;
131
char *szAfsUsernameMap;
132
int iAfsTokenLifetime;
133
char *szLogNtTokenCommand;
139
char **szWINSservers;
141
char *szRemoteAnnounce;
142
char *szRemoteBrowseSync;
143
char *szSocketAddress;
144
char *szNISHomeMapName;
145
char *szAnnounceVersion; /* This is initialised in init_globals */
148
char **szNetbiosAliases;
149
char *szNetbiosScope;
150
char *szNameResolveOrder;
152
char *szAddUserScript;
153
char *szRenameUserScript;
154
char *szDelUserScript;
155
char *szAddGroupScript;
156
char *szDelGroupScript;
157
char *szAddUserToGroupScript;
158
char *szDelUserFromGroupScript;
159
char *szSetPrimaryGroupScript;
160
char *szAddMachineScript;
161
char *szShutdownScript;
162
char *szAbortShutdownScript;
163
char *szUsernameMapScript;
164
char *szCheckPasswordScript;
171
BOOL bPassdbExpandExplicit;
172
int AlgorithmicRidBase;
173
char *szTemplateHomedir;
174
char *szTemplateShell;
175
char *szWinbindSeparator;
176
BOOL bWinbindEnumUsers;
177
BOOL bWinbindEnumGroups;
178
BOOL bWinbindUseDefaultDomain;
179
BOOL bWinbindTrustedDomainsOnly;
180
BOOL bWinbindNestedGroups;
181
BOOL bWinbindRefreshTickets;
182
BOOL bWinbindOfflineLogon;
183
char **szIdmapBackend;
184
char *szAddShareCommand;
185
char *szChangeShareCommand;
186
char *szDeleteShareCommand;
188
char *szGuestaccount;
189
char *szManglingMethod;
190
char **szServicesList;
191
char *szUsersharePath;
192
char *szUsershareTemplateShare;
193
char **szUsersharePrefixAllowList;
194
char **szUsersharePrefixDenyList;
201
int open_files_db_hash_size;
209
BOOL paranoid_server_security;
212
int iMaxSmbdProcesses;
213
BOOL bDisableSpoolss;
216
int enhanced_browsing;
222
int announce_as; /* This is initialised in init_globals */
223
int machine_password_timeout;
225
int oplock_break_wait_time;
226
int winbind_cache_time;
227
int winbind_max_idle_children;
228
char **szWinbindNssInfo;
231
char *szLdapMachineSuffix;
232
char *szLdapUserSuffix;
233
char *szLdapIdmapSuffix;
234
char *szLdapGroupSuffix;
240
char *szIPrintServer;
241
int ldap_passwd_sync;
242
int ldap_replication_sleep;
243
int ldap_timeout; /* This is initialised in init_globals */
246
BOOL bMsAddPrinterWizard;
251
BOOL bPreferredMaster;
254
BOOL bEncryptPasswords;
259
BOOL bObeyPamRestrictions;
261
int PrintcapCacheTime;
262
BOOL bLargeReadwrite;
270
BOOL bBindInterfacesOnly;
271
BOOL bPamPasswordChange;
272
BOOL bUnixPasswdSync;
273
BOOL bPasswdChatDebug;
274
int iPasswdChatTimeout;
278
BOOL bNTStatusSupport;
280
int iMaxStatCacheSize;
282
BOOL bAllowTrustedDomains;
286
BOOL bClientLanManAuth;
287
BOOL bClientNTLMv2Auth;
288
BOOL bClientPlaintextAuth;
289
BOOL bClientUseSpnego;
290
BOOL bDebugHiresTimestamp;
293
BOOL bEnableCoreFiles;
296
BOOL bHostnameLookups;
297
BOOL bUnixExtensions;
298
BOOL bDisableNetbios;
299
BOOL bKernelChangeNotify;
300
BOOL bFamChangeNotify;
301
BOOL bUseKerberosKeytab;
302
BOOL bDeferSharingViolations;
303
BOOL bEnablePrivileges;
305
BOOL bUsershareOwnerOnly;
306
BOOL bUsershareAllowGuests;
307
int restrict_anonymous;
308
int name_cache_timeout;
311
int iUsershareMaxShares;
314
param_opt_struct *param_opt;
317
static global Globals;
320
* This structure describes a single service.
326
time_t usershare_last_mod;
330
char **szInvalidUsers;
338
char *szRootPostExec;
340
char *szPrintcommand;
343
char *szLppausecommand;
344
char *szLpresumecommand;
345
char *szQueuepausecommand;
346
char *szQueueresumecommand;
356
char *szVetoOplockFiles;
362
char **printer_admin;
367
char *szAioWriteBehind;
371
int iMaxReportedPrintJobs;
374
int iCreate_force_mode;
376
int iSecurity_force_mode;
379
int iDir_Security_mask;
380
int iDir_Security_force_mode;
384
int iOplockContentionLimit;
389
BOOL bRootpreexecClose;
392
BOOL bShortCasePreserve;
394
BOOL bHideSpecialFiles;
395
BOOL bHideUnReadable;
396
BOOL bHideUnWriteableFiles;
407
BOOL bStoreDosAttributes;
420
BOOL bStrictAllocate;
424
BOOL bDeleteReadonly;
426
BOOL bDeleteVetoFiles;
429
BOOL bDosFiletimeResolution;
430
BOOL bFakeDirCreateTimes;
436
BOOL bUseClientDriver;
437
BOOL bDefaultDevmode;
438
BOOL bForcePrintername;
440
BOOL bForceUnknownAclUser;
443
BOOL bMap_acl_inherit;
446
BOOL bAclCheckPermissions;
447
BOOL bAclMapFullControl;
448
BOOL bAclGroupControl;
449
int iallocation_roundup_size;
453
int ichange_notify_timeout;
454
param_opt_struct *param_opt;
456
char dummy[3]; /* for alignment */
460
/* This is a default service used to prime a services structure */
461
static service sDefault = {
463
False, /* not autoloaded */
464
0, /* not a usershare */
465
(time_t)0, /* No last mod time */
466
NULL, /* szService */
468
NULL, /* szUsername */
469
NULL, /* szInvalidUsers */
470
NULL, /* szValidUsers */
471
NULL, /* szAdminUsers */
473
NULL, /* szInclude */
474
NULL, /* szPreExec */
475
NULL, /* szPostExec */
476
NULL, /* szRootPreExec */
477
NULL, /* szRootPostExec */
478
NULL, /* szCupsOptions */
479
NULL, /* szPrintcommand */
480
NULL, /* szLpqcommand */
481
NULL, /* szLprmcommand */
482
NULL, /* szLppausecommand */
483
NULL, /* szLpresumecommand */
484
NULL, /* szQueuepausecommand */
485
NULL, /* szQueueresumecommand */
486
NULL, /* szPrintername */
487
NULL, /* szDontdescend */
488
NULL, /* szHostsallow */
489
NULL, /* szHostsdeny */
490
NULL, /* szMagicScript */
491
NULL, /* szMagicOutput */
492
NULL, /* szMangledMap */
493
NULL, /* szVetoFiles */
494
NULL, /* szHideFiles */
495
NULL, /* szVetoOplockFiles */
497
NULL, /* force user */
498
NULL, /* force group */
500
NULL, /* writelist */
501
NULL, /* printer admin */
504
NULL, /* vfs objects */
505
NULL, /* szMSDfsProxy */
506
NULL, /* szAioWriteBehind */
508
0, /* iMinPrintSpace */
509
1000, /* iMaxPrintJobs */
510
0, /* iMaxReportedPrintJobs */
511
0, /* iWriteCacheSize */
512
0744, /* iCreate_mask */
513
0000, /* iCreate_force_mode */
514
0777, /* iSecurity_mask */
515
0, /* iSecurity_force_mode */
516
0755, /* iDir_mask */
517
0000, /* iDir_force_mode */
518
0777, /* iDir_Security_mask */
519
0, /* iDir_Security_force_mode */
520
0, /* iMaxConnections */
521
CASE_LOWER, /* iDefaultCase */
522
DEFAULT_PRINTING, /* iPrinting */
523
2, /* iOplockContentionLimit */
525
1024, /* iBlock_size */
526
0, /* iDfreeCacheTime */
527
False, /* bPreexecClose */
528
False, /* bRootpreexecClose */
529
Auto, /* case sensitive */
530
True, /* case preserve */
531
True, /* short case preserve */
532
True, /* bHideDotFiles */
533
False, /* bHideSpecialFiles */
534
False, /* bHideUnReadable */
535
False, /* bHideUnWriteableFiles */
536
True, /* bBrowseable */
537
True, /* bAvailable */
538
True, /* bRead_only */
539
True, /* bNo_set_dir */
540
False, /* bGuest_only */
541
False, /* bGuest_ok */
542
False, /* bPrint_ok */
543
False, /* bMap_system */
544
False, /* bMap_hidden */
545
True, /* bMap_archive */
546
False, /* bStoreDosAttributes */
547
False, /* bDmapiSupport */
549
Auto, /* iStrictLocking */
550
True, /* bPosixLocking */
551
True, /* bShareModes */
553
True, /* bLevel2OpLocks */
554
False, /* bOnlyUser */
555
True, /* bMangledNames */
556
True, /* bWidelinks */
557
True, /* bSymlinks */
558
False, /* bSyncAlways */
559
False, /* bStrictAllocate */
560
False, /* bStrictSync */
561
'~', /* magic char */
563
False, /* bDeleteReadonly */
564
False, /* bFakeOplocks */
565
False, /* bDeleteVetoFiles */
566
False, /* bDosFilemode */
567
True, /* bDosFiletimes */
568
False, /* bDosFiletimeResolution */
569
False, /* bFakeDirCreateTimes */
570
True, /* bBlockingLocks */
571
False, /* bInheritPerms */
572
False, /* bInheritACLS */
573
False, /* bInheritOwner */
574
True, /* bMSDfsRoot */
575
False, /* bUseClientDriver */
576
True, /* bDefaultDevmode */
577
False, /* bForcePrintername */
578
True, /* bNTAclSupport */
579
False, /* bForceUnknownAclUser */
580
False, /* bUseSendfile */
581
False, /* bProfileAcls */
582
False, /* bMap_acl_inherit */
583
False, /* bAfs_Share */
584
False, /* bEASupport */
585
True, /* bAclCheckPermissions */
586
True, /* bAclMapFullControl */
587
False, /* bAclGroupControl */
588
SMB_ROUNDUP_ALLOCATION_SIZE, /* iallocation_roundup_size */
589
0, /* iAioReadSize */
590
0, /* iAioWriteSize */
591
MAP_READONLY_YES, /* iMap_readonly */
592
60, /* ichange_notify_timeout = 1 minute default. */
594
NULL, /* Parametric options */
599
/* local variables */
600
static service **ServicePtrs = NULL;
601
static int iNumServices = 0;
602
static int iServiceIndex = 0;
603
static TDB_CONTEXT *ServiceHash;
604
static int *invalid_services = NULL;
605
static int num_invalid_services = 0;
606
static BOOL bInGlobalSection = True;
607
static BOOL bGlobalOnly = False;
608
static int server_role;
609
static int default_server_announce;
611
#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
613
/* prototypes for the special type handlers */
614
static BOOL handle_include( int snum, const char *pszParmValue, char **ptr);
615
static BOOL handle_copy( int snum, const char *pszParmValue, char **ptr);
616
static BOOL handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
617
static BOOL handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
618
static BOOL handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
619
static BOOL handle_debug_list( int snum, const char *pszParmValue, char **ptr );
620
static BOOL handle_workgroup( int snum, const char *pszParmValue, char **ptr );
621
static BOOL handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
622
static BOOL handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
623
static BOOL handle_charset( int snum, const char *pszParmValue, char **ptr );
624
static BOOL handle_printing( int snum, const char *pszParmValue, char **ptr);
626
static void set_server_role(void);
627
static void set_default_server_announce_type(void);
628
static void set_allowed_client_auth(void);
630
static const struct enum_list enum_protocol[] = {
631
{PROTOCOL_NT1, "NT1"},
632
{PROTOCOL_LANMAN2, "LANMAN2"},
633
{PROTOCOL_LANMAN1, "LANMAN1"},
634
{PROTOCOL_CORE, "CORE"},
635
{PROTOCOL_COREPLUS, "COREPLUS"},
636
{PROTOCOL_COREPLUS, "CORE+"},
640
static const struct enum_list enum_security[] = {
641
{SEC_SHARE, "SHARE"},
643
{SEC_SERVER, "SERVER"},
644
{SEC_DOMAIN, "DOMAIN"},
651
static const struct enum_list enum_printing[] = {
652
{PRINT_SYSV, "sysv"},
654
{PRINT_HPUX, "hpux"},
658
{PRINT_LPRNG, "lprng"},
659
{PRINT_CUPS, "cups"},
660
{PRINT_IPRINT, "iprint"},
662
{PRINT_LPROS2, "os2"},
664
{PRINT_TEST, "test"},
666
#endif /* DEVELOPER */
670
static const struct enum_list enum_ldap_ssl[] = {
671
{LDAP_SSL_OFF, "no"},
672
{LDAP_SSL_OFF, "No"},
673
{LDAP_SSL_OFF, "off"},
674
{LDAP_SSL_OFF, "Off"},
675
{LDAP_SSL_START_TLS, "start tls"},
676
{LDAP_SSL_START_TLS, "Start_tls"},
680
static const struct enum_list enum_ldap_passwd_sync[] = {
681
{LDAP_PASSWD_SYNC_OFF, "no"},
682
{LDAP_PASSWD_SYNC_OFF, "No"},
683
{LDAP_PASSWD_SYNC_OFF, "off"},
684
{LDAP_PASSWD_SYNC_OFF, "Off"},
685
{LDAP_PASSWD_SYNC_ON, "Yes"},
686
{LDAP_PASSWD_SYNC_ON, "yes"},
687
{LDAP_PASSWD_SYNC_ON, "on"},
688
{LDAP_PASSWD_SYNC_ON, "On"},
689
{LDAP_PASSWD_SYNC_ONLY, "Only"},
690
{LDAP_PASSWD_SYNC_ONLY, "only"},
694
/* Types of machine we can announce as. */
695
#define ANNOUNCE_AS_NT_SERVER 1
696
#define ANNOUNCE_AS_WIN95 2
697
#define ANNOUNCE_AS_WFW 3
698
#define ANNOUNCE_AS_NT_WORKSTATION 4
700
static const struct enum_list enum_announce_as[] = {
701
{ANNOUNCE_AS_NT_SERVER, "NT"},
702
{ANNOUNCE_AS_NT_SERVER, "NT Server"},
703
{ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
704
{ANNOUNCE_AS_WIN95, "win95"},
705
{ANNOUNCE_AS_WFW, "WfW"},
709
static const struct enum_list enum_map_readonly[] = {
710
{MAP_READONLY_NO, "no"},
711
{MAP_READONLY_NO, "false"},
712
{MAP_READONLY_NO, "0"},
713
{MAP_READONLY_YES, "yes"},
714
{MAP_READONLY_YES, "true"},
715
{MAP_READONLY_YES, "1"},
716
{MAP_READONLY_PERMISSIONS, "permissions"},
717
{MAP_READONLY_PERMISSIONS, "perms"},
721
static const struct enum_list enum_case[] = {
722
{CASE_LOWER, "lower"},
723
{CASE_UPPER, "upper"},
727
static const struct enum_list enum_bool_auto[] = {
738
/* Client-side offline caching policy types */
739
#define CSC_POLICY_MANUAL 0
740
#define CSC_POLICY_DOCUMENTS 1
741
#define CSC_POLICY_PROGRAMS 2
742
#define CSC_POLICY_DISABLE 3
744
static const struct enum_list enum_csc_policy[] = {
745
{CSC_POLICY_MANUAL, "manual"},
746
{CSC_POLICY_DOCUMENTS, "documents"},
747
{CSC_POLICY_PROGRAMS, "programs"},
748
{CSC_POLICY_DISABLE, "disable"},
752
/* SMB signing types. */
753
static const struct enum_list enum_smb_signing_vals[] = {
765
{Required, "required"},
766
{Required, "mandatory"},
768
{Required, "forced"},
769
{Required, "enforced"},
773
/* ACL compatibility options. */
774
static const struct enum_list enum_acl_compat_vals[] = {
775
{ ACL_COMPAT_AUTO, "auto" },
776
{ ACL_COMPAT_WINNT, "winnt" },
777
{ ACL_COMPAT_WIN2K, "win2k" },
782
Do you want session setups at user level security with a invalid
783
password to be rejected or allowed in as guest? WinNT rejects them
784
but it can be a pain as it means "net view" needs to use a password
786
You have 3 choices in the setting of map_to_guest:
788
"Never" means session setups with an invalid password
789
are rejected. This is the default.
791
"Bad User" means session setups with an invalid password
792
are rejected, unless the username does not exist, in which case it
793
is treated as a guest login
795
"Bad Password" means session setups with an invalid password
796
are treated as a guest login
798
Note that map_to_guest only has an effect in user or server
802
static const struct enum_list enum_map_to_guest[] = {
803
{NEVER_MAP_TO_GUEST, "Never"},
804
{MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
805
{MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
806
{MAP_TO_GUEST_ON_BAD_UID, "Bad Uid"},
810
/* Note: We do not initialise the defaults union - it is not allowed in ANSI C
812
* The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
813
* screen in SWAT. This is used to exclude parameters as well as to squash all
814
* parameters that have been duplicated by pseudonyms.
816
* NOTE: To display a parameter in BASIC view set FLAG_BASIC
817
* Any parameter that does NOT have FLAG_ADVANCED will not disply at all
818
* Set FLAG_SHARE and FLAG_PRINT to specifically display parameters in
821
* NOTE2: Handling of duplicated (synonym) paramters:
822
* Only the first occurance of a parameter should be enabled by FLAG_BASIC
823
* and/or FLAG_ADVANCED. All duplicates following the first mention should be
824
* set to FLAG_HIDE. ie: Make you must place the parameter that has the preferred
825
* name first, and all synonyms must follow it with the FLAG_HIDE attribute.
828
static struct parm_struct parm_table[] = {
829
{N_("Base Options"), P_SEP, P_SEPARATOR},
831
{"dos charset", P_STRING, P_GLOBAL, &Globals.dos_charset, handle_charset, NULL, FLAG_ADVANCED},
832
{"unix charset", P_STRING, P_GLOBAL, &Globals.unix_charset, handle_charset, NULL, FLAG_ADVANCED},
833
{"display charset", P_STRING, P_GLOBAL, &Globals.display_charset, handle_charset, NULL, FLAG_ADVANCED},
834
{"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
835
{"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
836
{"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_HIDE},
837
{"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkgroup, handle_workgroup, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
839
{"realm", P_USTRING, P_GLOBAL, &Globals.szRealm, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
841
{"netbios name", P_USTRING, P_GLOBAL, &Globals.szNetbiosName, handle_netbios_name, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
842
{"netbios aliases", P_LIST, P_GLOBAL, &Globals.szNetbiosAliases, handle_netbios_aliases, NULL, FLAG_ADVANCED},
843
{"netbios scope", P_USTRING, P_GLOBAL, &Globals.szNetbiosScope, handle_netbios_scope, NULL, FLAG_ADVANCED},
844
{"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED },
845
{"interfaces", P_LIST, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
846
{"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD},
848
{N_("Security Options"), P_SEP, P_SEPARATOR},
850
{"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
851
{"auth methods", P_LIST, P_GLOBAL, &Globals.AuthMethods, NULL, NULL, FLAG_ADVANCED},
852
{"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
853
{"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_ADVANCED},
854
{"client schannel", P_ENUM, P_GLOBAL, &Globals.clientSchannel, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED},
855
{"server schannel", P_ENUM, P_GLOBAL, &Globals.serverSchannel, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED},
856
{"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, FLAG_ADVANCED},
857
{"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, FLAG_ADVANCED},
858
{"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED},
859
{"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED},
860
{"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD},
861
{"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED},
862
{"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED},
863
{"passdb backend", P_STRING, P_GLOBAL, &Globals.szPassdbBackend, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD},
864
{"algorithmic rid base", P_INTEGER, P_GLOBAL, &Globals.AlgorithmicRidBase, NULL, NULL, FLAG_ADVANCED},
865
{"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_ADVANCED},
866
{"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE},
867
{"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE},
868
{"guest account", P_STRING, P_GLOBAL, &Globals.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED},
869
{"enable privileges", P_BOOL, P_GLOBAL, &Globals.bEnablePrivileges, NULL, NULL, FLAG_ADVANCED},
871
{"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, FLAG_ADVANCED},
872
{"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, FLAG_ADVANCED},
873
{"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED},
874
{"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, FLAG_ADVANCED},
875
{"passwd chat timeout", P_INTEGER, P_GLOBAL, &Globals.iPasswdChatTimeout, NULL, NULL, FLAG_ADVANCED},
876
{"check password script", P_STRING, P_GLOBAL, &Globals.szCheckPasswordScript, NULL, NULL, FLAG_ADVANCED},
877
{"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, FLAG_ADVANCED},
878
{"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED},
879
{"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, FLAG_ADVANCED},
880
{"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, FLAG_ADVANCED},
881
{"restrict anonymous", P_INTEGER, P_GLOBAL, &Globals.restrict_anonymous, NULL, NULL, FLAG_ADVANCED},
882
{"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, FLAG_ADVANCED},
883
{"ntlm auth", P_BOOL, P_GLOBAL, &Globals.bNTLMAuth, NULL, NULL, FLAG_ADVANCED},
884
{"client NTLMv2 auth", P_BOOL, P_GLOBAL, &Globals.bClientNTLMv2Auth, NULL, NULL, FLAG_ADVANCED},
885
{"client lanman auth", P_BOOL, P_GLOBAL, &Globals.bClientLanManAuth, NULL, NULL, FLAG_ADVANCED},
886
{"client plaintext auth", P_BOOL, P_GLOBAL, &Globals.bClientPlaintextAuth, NULL, NULL, FLAG_ADVANCED},
888
{"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
889
{"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE},
890
{"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE},
892
{"invalid users", P_LIST, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
893
{"valid users", P_LIST, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
894
{"admin users", P_LIST, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
895
{"read list", P_LIST, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
896
{"write list", P_LIST, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
897
{"printer admin", P_LIST, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_PRINT | FLAG_DEPRECATED },
898
{"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
899
{"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
900
{"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_ADVANCED},
902
{"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE},
903
{"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE},
904
{"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE},
905
{"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE},
907
{"acl check permissions", P_BOOL, P_LOCAL, &sDefault.bAclCheckPermissions, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
908
{"acl group control", P_BOOL, P_LOCAL, &sDefault.bAclGroupControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE | FLAG_DEPRECATED },
909
{"acl map full control", P_BOOL, P_LOCAL, &sDefault.bAclMapFullControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
910
{"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
911
{"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_HIDE},
912
{"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
913
{"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
914
{"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
915
{"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
916
{"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
917
{"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
918
{"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
919
{"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
920
{"force unknown acl user", P_BOOL, P_LOCAL, &sDefault.bForceUnknownAclUser, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
921
{"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
922
{"inherit acls", P_BOOL, P_LOCAL, &sDefault.bInheritACLS, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
923
{"inherit owner", P_BOOL, P_LOCAL, &sDefault.bInheritOwner, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
924
{"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
925
{"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_HIDE},
927
{"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
928
{"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_HIDE},
930
{"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED},
931
{"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
932
{"allow hosts", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_HIDE},
933
{"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
934
{"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_HIDE},
935
{"preload modules", P_LIST, P_GLOBAL, &Globals.szPreloadModules, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
936
{"use kerberos keytab", P_BOOL, P_GLOBAL, &Globals.bUseKerberosKeytab, NULL, NULL, FLAG_ADVANCED},
938
{N_("Logging Options"), P_SEP, P_SEPARATOR},
940
{"log level", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_ADVANCED},
941
{"debuglevel", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_HIDE},
942
{"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, FLAG_ADVANCED},
943
{"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, FLAG_ADVANCED},
944
{"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, FLAG_ADVANCED},
946
{"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, FLAG_ADVANCED},
947
{"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_ADVANCED},
948
{"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_ADVANCED},
949
{"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, FLAG_ADVANCED},
950
{"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, FLAG_ADVANCED},
951
{"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, FLAG_ADVANCED},
952
{"enable core files", P_BOOL, P_GLOBAL, &Globals.bEnableCoreFiles, NULL, NULL, FLAG_ADVANCED},
954
{N_("Protocol Options"), P_SEP, P_SEPARATOR},
956
{"allocation roundup size", P_INTEGER, P_LOCAL, &sDefault.iallocation_roundup_size, NULL, NULL, FLAG_ADVANCED},
957
{"aio read size", P_INTEGER, P_LOCAL, &sDefault.iAioReadSize, NULL, NULL, FLAG_ADVANCED},
958
{"aio write size", P_INTEGER, P_LOCAL, &sDefault.iAioWriteSize, NULL, NULL, FLAG_ADVANCED},
959
{"aio write behind", P_STRING, P_LOCAL, &sDefault.szAioWriteBehind, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL },
960
{"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED},
961
{"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_ADVANCED},
962
{"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED},
963
{"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED},
964
{"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, FLAG_ADVANCED},
965
{"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, FLAG_ADVANCED},
966
{"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, FLAG_ADVANCED},
967
{"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, FLAG_ADVANCED},
968
{"disable netbios", P_BOOL, P_GLOBAL, &Globals.bDisableNetbios, NULL, NULL, FLAG_ADVANCED},
969
{"reset on zero vc", P_BOOL, P_GLOBAL, &Globals.bResetOnZeroVC, NULL, NULL, FLAG_ADVANCED},
971
{"acl compatibility", P_ENUM, P_GLOBAL, &Globals.iAclCompat, NULL, enum_acl_compat_vals, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
972
{"defer sharing violations", P_BOOL, P_GLOBAL, &Globals.bDeferSharingViolations, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
973
{"ea support", P_BOOL, P_LOCAL, &sDefault.bEASupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
974
{"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
975
{"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, FLAG_ADVANCED},
976
{"nt status support", P_BOOL, P_GLOBAL, &Globals.bNTStatusSupport, NULL, NULL, FLAG_ADVANCED},
977
{"profile acls", P_BOOL, P_LOCAL, &sDefault.bProfileAcls, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
979
{"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, FLAG_ADVANCED},
980
{"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, FLAG_ADVANCED},
981
{"map acl inherit", P_BOOL, P_LOCAL, &sDefault.bMap_acl_inherit, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
982
{"afs share", P_BOOL, P_LOCAL, &sDefault.bAfs_Share, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
983
{"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, FLAG_ADVANCED},
984
{"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, FLAG_ADVANCED},
986
{"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD},
987
{"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, FLAG_ADVANCED},
988
{"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, FLAG_ADVANCED},
989
{"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, FLAG_ADVANCED},
990
{"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, FLAG_ADVANCED},
991
{"unix extensions", P_BOOL, P_GLOBAL, &Globals.bUnixExtensions, NULL, NULL, FLAG_ADVANCED},
992
{"use spnego", P_BOOL, P_GLOBAL, &Globals.bUseSpnego, NULL, NULL, FLAG_ADVANCED},
993
{"client signing", P_ENUM, P_GLOBAL, &Globals.client_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED},
994
{"server signing", P_ENUM, P_GLOBAL, &Globals.server_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED},
995
{"client use spnego", P_BOOL, P_GLOBAL, &Globals.bClientUseSpnego, NULL, NULL, FLAG_ADVANCED},
997
{"enable asu support", P_BOOL, P_GLOBAL, &Globals.bASUSupport, NULL, NULL, FLAG_ADVANCED},
998
{"svcctl list", P_LIST, P_GLOBAL, &Globals.szServicesList, NULL, NULL, FLAG_ADVANCED},
1000
{N_("Tuning Options"), P_SEP, P_SEPARATOR},
1002
{"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1003
{"change notify timeout", P_INTEGER, P_LOCAL, &sDefault.ichange_notify_timeout, NULL, NULL, FLAG_ADVANCED},
1004
{"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, FLAG_ADVANCED},
1005
{"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_ADVANCED},
1006
{"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, FLAG_ADVANCED},
1007
{"kernel change notify", P_BOOL, P_GLOBAL, &Globals.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED},
1008
{"fam change notify", P_BOOL, P_GLOBAL, &Globals.bFamChangeNotify, NULL, NULL, FLAG_ADVANCED},
1010
{"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_ADVANCED},
1011
{"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, FLAG_ADVANCED},
1012
{"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1013
{"paranoid server security", P_BOOL, P_GLOBAL, &Globals.paranoid_server_security, NULL, NULL, FLAG_ADVANCED},
1014
{"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, FLAG_ADVANCED},
1015
{"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, FLAG_ADVANCED},
1016
{"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1017
{"open files database hash size", P_INTEGER, P_GLOBAL, &Globals.open_files_db_hash_size, NULL, NULL, FLAG_ADVANCED},
1019
{"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, FLAG_ADVANCED},
1020
{"strict allocate", P_BOOL, P_LOCAL, &sDefault.bStrictAllocate, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1021
{"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1022
{"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1023
{"use mmap", P_BOOL, P_GLOBAL, &Globals.bUseMmap, NULL, NULL, FLAG_ADVANCED},
1024
{"use sendfile", P_BOOL, P_LOCAL, &sDefault.bUseSendfile, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1025
{"hostname lookups", P_BOOL, P_GLOBAL, &Globals.bHostnameLookups, NULL, NULL, FLAG_ADVANCED},
1026
{"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED},
1028
{"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED},
1030
{N_("Printing Options"), P_SEP, P_SEPARATOR},
1032
{"max reported print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxReportedPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1033
{"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1034
{"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1035
{"printcap cache time", P_INTEGER, P_GLOBAL, &Globals.PrintcapCacheTime, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1036
{"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1037
{"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE},
1038
{"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1039
{"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE},
1040
{"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, handle_printing, enum_printing, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1041
{"cups options", P_STRING, P_LOCAL, &sDefault.szCupsOptions, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1042
{"cups server", P_STRING, P_GLOBAL, &Globals.szCupsServer, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1043
{"iprint server", P_STRING, P_GLOBAL, &Globals.szIPrintServer, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1044
{"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1045
{"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1046
{"enable spoolss", P_BOOLREV, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_HIDE},
1047
{"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1048
{"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1049
{"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1050
{"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1051
{"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1052
{"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL},
1054
{"addport command", P_STRING, P_GLOBAL, &Globals.szAddPortCommand, NULL, NULL, FLAG_ADVANCED},
1055
{"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, FLAG_ADVANCED},
1056
{"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, FLAG_ADVANCED},
1057
{"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, FLAG_ADVANCED},
1058
{"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, FLAG_ADVANCED},
1059
{"os2 driver map", P_STRING, P_GLOBAL, &Globals.szOs2DriverMap, NULL, NULL, FLAG_ADVANCED},
1061
{"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1062
{"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_HIDE},
1063
{"use client driver", P_BOOL, P_LOCAL, &sDefault.bUseClientDriver, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1064
{"default devmode", P_BOOL, P_LOCAL, &sDefault.bDefaultDevmode, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1065
{"force printername", P_BOOL, P_LOCAL, &sDefault.bForcePrintername, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1067
{N_("Filename Handling"), P_SEP, P_SEPARATOR},
1068
{"mangling method", P_STRING, P_GLOBAL, &Globals.szManglingMethod, NULL, NULL, FLAG_ADVANCED},
1069
{"mangle prefix", P_INTEGER, P_GLOBAL, &Globals.mangle_prefix, NULL, NULL, FLAG_ADVANCED},
1071
{"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_ADVANCED | FLAG_SHARE},
1072
{"case sensitive", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1073
{"casesignames", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_HIDE},
1074
{"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1075
{"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1076
{"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1077
{"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1078
{"hide special files", P_BOOL, P_LOCAL, &sDefault.bHideSpecialFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1079
{"hide unreadable", P_BOOL, P_LOCAL, &sDefault.bHideUnReadable, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1080
{"hide unwriteable files", P_BOOL, P_LOCAL, &sDefault.bHideUnWriteableFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1081
{"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1082
{"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL },
1083
{"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL },
1084
{"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL },
1085
{"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1086
{"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1087
{"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1088
{"map readonly", P_ENUM, P_LOCAL, &sDefault.iMap_readonly, NULL, enum_map_readonly, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1089
{"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1090
{"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_DEPRECATED },
1091
{"max stat cache size", P_INTEGER, P_GLOBAL, &Globals.iMaxStatCacheSize, NULL, NULL, FLAG_ADVANCED},
1092
{"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, FLAG_ADVANCED},
1093
{"store dos attributes", P_BOOL, P_LOCAL, &sDefault.bStoreDosAttributes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1094
{"dmapi support", P_BOOL, P_LOCAL, &sDefault.bDmapiSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1097
{N_("Domain Options"), P_SEP, P_SEPARATOR},
1099
{"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD},
1101
{N_("Logon Options"), P_SEP, P_SEPARATOR},
1103
{"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, FLAG_ADVANCED},
1104
{"rename user script", P_STRING, P_GLOBAL, &Globals.szRenameUserScript, NULL, NULL, FLAG_ADVANCED},
1105
{"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, FLAG_ADVANCED},
1106
{"add group script", P_STRING, P_GLOBAL, &Globals.szAddGroupScript, NULL, NULL, FLAG_ADVANCED},
1107
{"delete group script", P_STRING, P_GLOBAL, &Globals.szDelGroupScript, NULL, NULL, FLAG_ADVANCED},
1108
{"add user to group script", P_STRING, P_GLOBAL, &Globals.szAddUserToGroupScript, NULL, NULL, FLAG_ADVANCED},
1109
{"delete user from group script", P_STRING, P_GLOBAL, &Globals.szDelUserFromGroupScript, NULL, NULL, FLAG_ADVANCED},
1110
{"set primary group script", P_STRING, P_GLOBAL, &Globals.szSetPrimaryGroupScript, NULL, NULL, FLAG_ADVANCED},
1111
{"add machine script", P_STRING, P_GLOBAL, &Globals.szAddMachineScript, NULL, NULL, FLAG_ADVANCED},
1112
{"shutdown script", P_STRING, P_GLOBAL, &Globals.szShutdownScript, NULL, NULL, FLAG_ADVANCED},
1113
{"abort shutdown script", P_STRING, P_GLOBAL, &Globals.szAbortShutdownScript, NULL, NULL, FLAG_ADVANCED},
1114
{"username map script", P_STRING, P_GLOBAL, &Globals.szUsernameMapScript, NULL, NULL, FLAG_ADVANCED},
1116
{"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_ADVANCED},
1117
{"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_ADVANCED},
1118
{"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, FLAG_ADVANCED},
1119
{"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_ADVANCED},
1120
{"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, FLAG_ADVANCED},
1122
{N_("Browse Options"), P_SEP, P_SEPARATOR},
1124
{"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED},
1125
{"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, FLAG_ADVANCED},
1126
{"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, FLAG_ADVANCED},
1127
{"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED},
1128
{"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
1129
{"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED},
1130
{"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED},
1131
{"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, FLAG_ADVANCED},
1132
{"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
1133
{"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE},
1134
{"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL, FLAG_ADVANCED},
1136
{N_("WINS Options"), P_SEP, P_SEPARATOR},
1138
{"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, FLAG_ADVANCED},
1139
{"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, FLAG_ADVANCED},
1141
{"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
1142
{"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD},
1143
{"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED},
1145
{N_("Locking Options"), P_SEP, P_SEPARATOR},
1147
{"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1148
{"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1149
{"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1150
{"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
1151
{"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1152
{"lock spin count", P_INTEGER, P_GLOBAL, &Globals.iLockSpinCount, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
1153
{"lock spin time", P_INTEGER, P_GLOBAL, &Globals.iLockSpinTime, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
1155
{"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1156
{"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1157
{"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
1158
{"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1159
{"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1160
{"strict locking", P_ENUM, P_LOCAL, &sDefault.iStrictLocking, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1161
{"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1163
{N_("Ldap Options"), P_SEP, P_SEPARATOR},
1165
{"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, FLAG_ADVANCED},
1166
{"ldap delete dn", P_BOOL, P_GLOBAL, &Globals.ldap_delete_dn, NULL, NULL, FLAG_ADVANCED},
1167
{"ldap group suffix", P_STRING, P_GLOBAL, &Globals.szLdapGroupSuffix, NULL, NULL, FLAG_ADVANCED},
1168
{"ldap idmap suffix", P_STRING, P_GLOBAL, &Globals.szLdapIdmapSuffix, NULL, NULL, FLAG_ADVANCED},
1169
{"ldap machine suffix", P_STRING, P_GLOBAL, &Globals.szLdapMachineSuffix, NULL, NULL, FLAG_ADVANCED},
1170
{"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED},
1171
{"ldap password sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_HIDE},
1172
{"ldap replication sleep", P_INTEGER, P_GLOBAL, &Globals.ldap_replication_sleep, NULL, NULL, FLAG_ADVANCED},
1173
{"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, FLAG_ADVANCED},
1174
{"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED},
1175
{"ldap timeout", P_INTEGER, P_GLOBAL, &Globals.ldap_timeout, NULL, NULL, FLAG_ADVANCED},
1176
{"ldap page size", P_INTEGER, P_GLOBAL, &Globals.ldap_page_size, NULL, NULL, FLAG_ADVANCED},
1177
{"ldap user suffix", P_STRING, P_GLOBAL, &Globals.szLdapUserSuffix, NULL, NULL, FLAG_ADVANCED},
1179
{N_("Miscellaneous Options"), P_SEP, P_SEPARATOR},
1180
{"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED},
1181
{"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, FLAG_ADVANCED},
1182
{"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, FLAG_ADVANCED},
1184
{N_("EventLog Options"), P_SEP, P_SEPARATOR},
1185
{"eventlog list", P_LIST, P_GLOBAL, &Globals.szEventLogs, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
1187
{"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
1188
{"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED},
1189
{"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED},
1190
{"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_ADVANCED},
1191
{"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_HIDE},
1192
{"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, FLAG_ADVANCED},
1194
{"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, FLAG_ADVANCED},
1195
{"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, FLAG_ADVANCED},
1196
{"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, FLAG_ADVANCED},
1199
{"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED},
1200
{"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED},
1201
{"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, FLAG_ADVANCED},
1202
{"dfree cache time", P_INTEGER, P_LOCAL, &sDefault.iDfreeCacheTime, NULL, NULL, FLAG_ADVANCED},
1203
{"dfree command", P_STRING, P_LOCAL, &sDefault.szDfree, NULL, NULL, FLAG_ADVANCED},
1204
{"get quota command", P_STRING, P_GLOBAL, &Globals.szGetQuota, NULL, NULL, FLAG_ADVANCED},
1205
{"set quota command", P_STRING, P_GLOBAL, &Globals.szSetQuota, NULL, NULL, FLAG_ADVANCED},
1206
{"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, FLAG_ADVANCED},
1207
{"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, FLAG_ADVANCED},
1208
{"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, FLAG_ADVANCED},
1209
{"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, FLAG_ADVANCED},
1210
{"afs username map", P_STRING, P_GLOBAL, &Globals.szAfsUsernameMap, NULL, NULL, FLAG_ADVANCED},
1211
{"afs token lifetime", P_INTEGER, P_GLOBAL, &Globals.iAfsTokenLifetime, NULL, NULL, FLAG_ADVANCED},
1212
{"log nt token command", P_STRING, P_GLOBAL, &Globals.szLogNtTokenCommand, NULL, NULL, FLAG_ADVANCED},
1213
{"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, FLAG_ADVANCED},
1214
{"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, FLAG_ADVANCED},
1215
{"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
1217
{"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
1218
{"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
1219
{"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
1220
{"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_ADVANCED},
1222
{"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1223
{"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
1224
{"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
1225
{"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1226
{"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
1227
{"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
1228
{"usershare allow guests", P_BOOL, P_GLOBAL, &Globals.bUsershareAllowGuests, NULL, NULL, FLAG_ADVANCED},
1229
{"usershare max shares", P_INTEGER, P_GLOBAL, &Globals.iUsershareMaxShares, NULL, NULL, FLAG_ADVANCED},
1230
{"usershare owner only", P_BOOL, P_GLOBAL, &Globals.bUsershareOwnerOnly, NULL, NULL, FLAG_ADVANCED},
1231
{"usershare path", P_STRING, P_GLOBAL, &Globals.szUsersharePath, NULL, NULL, FLAG_ADVANCED},
1232
{"usershare prefix allow list", P_LIST, P_GLOBAL, &Globals.szUsersharePrefixAllowList, NULL, NULL, FLAG_ADVANCED},
1233
{"usershare prefix deny list", P_LIST, P_GLOBAL, &Globals.szUsersharePrefixDenyList, NULL, NULL, FLAG_ADVANCED},
1234
{"usershare template share", P_STRING, P_GLOBAL, &Globals.szUsershareTemplateShare, NULL, NULL, FLAG_ADVANCED},
1235
{"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
1236
{"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1237
{"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1238
{"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1239
{"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1240
{"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1241
{"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1242
{"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1243
{"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1244
{"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1245
{"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1246
{"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1248
{"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1249
{"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, FLAG_ADVANCED},
1251
{N_("VFS module options"), P_SEP, P_SEPARATOR},
1253
{"vfs objects", P_LIST, P_LOCAL, &sDefault.szVfsObjects, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1254
{"vfs object", P_LIST, P_LOCAL, &sDefault.szVfsObjects, NULL, NULL, FLAG_HIDE},
1257
{"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1258
{"msdfs proxy", P_STRING, P_LOCAL, &sDefault.szMSDfsProxy, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
1259
{"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED},
1261
{N_("Winbind options"), P_SEP, P_SEPARATOR},
1263
{"passdb expand explicit", P_BOOL, P_GLOBAL, &Globals.bPassdbExpandExplicit, NULL, NULL, FLAG_ADVANCED},
1264
{"idmap backend", P_LIST, P_GLOBAL, &Globals.szIdmapBackend, NULL, NULL, FLAG_ADVANCED},
1265
{"idmap uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_ADVANCED},
1266
{"winbind uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_HIDE},
1267
{"idmap gid", P_STRING, P_GLOBAL, &Globals.szIdmapGID, handle_idmap_gid, NULL, FLAG_ADVANCED},
1268
{"winbind gid", P_STRING, P_GLOBAL, &Globals.szIdmapGID, handle_idmap_gid, NULL, FLAG_HIDE},
1269
{"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, FLAG_ADVANCED},
1270
{"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, FLAG_ADVANCED},
1271
{"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED},
1272
{"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, FLAG_ADVANCED},
1273
{"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, FLAG_ADVANCED},
1274
{"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED},
1275
{"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED},
1276
{"winbind trusted domains only", P_BOOL, P_GLOBAL, &Globals.bWinbindTrustedDomainsOnly, NULL, NULL, FLAG_ADVANCED},
1277
{"winbind nested groups", P_BOOL, P_GLOBAL, &Globals.bWinbindNestedGroups, NULL, NULL, FLAG_ADVANCED},
1278
{"winbind nss info", P_LIST, P_GLOBAL, &Globals.szWinbindNssInfo, NULL, NULL, FLAG_ADVANCED},
1279
{"winbind refresh tickets", P_BOOL, P_GLOBAL, &Globals.bWinbindRefreshTickets, NULL, NULL, FLAG_ADVANCED},
1280
{"winbind offline logon", P_BOOL, P_GLOBAL, &Globals.bWinbindOfflineLogon, NULL, NULL, FLAG_ADVANCED},
1282
{NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
1285
/***************************************************************************
1286
Initialise the sDefault parameter structure for the printer values.
1287
***************************************************************************/
1289
static void init_printer_values(service *pService)
1291
/* choose defaults depending on the type of printing */
1292
switch (pService->iPrinting) {
1297
string_set(&pService->szLpqcommand, "lpq -P'%p'");
1298
string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1299
string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
1304
string_set(&pService->szLpqcommand, "lpq -P'%p'");
1305
string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1306
string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
1307
string_set(&pService->szQueuepausecommand, "lpc stop '%p'");
1308
string_set(&pService->szQueueresumecommand, "lpc start '%p'");
1309
string_set(&pService->szLppausecommand, "lpc hold '%p' %j");
1310
string_set(&pService->szLpresumecommand, "lpc release '%p' %j");
1316
/* set the lpq command to contain the destination printer
1317
name only. This is used by cups_queue_get() */
1318
string_set(&pService->szLpqcommand, "%p");
1319
string_set(&pService->szLprmcommand, "");
1320
string_set(&pService->szPrintcommand, "");
1321
string_set(&pService->szLppausecommand, "");
1322
string_set(&pService->szLpresumecommand, "");
1323
string_set(&pService->szQueuepausecommand, "");
1324
string_set(&pService->szQueueresumecommand, "");
1326
string_set(&pService->szLpqcommand, "lpq -P'%p'");
1327
string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1328
string_set(&pService->szPrintcommand, "lpr -P'%p' %s; rm %s");
1329
string_set(&pService->szLppausecommand, "lp -i '%p-%j' -H hold");
1330
string_set(&pService->szLpresumecommand, "lp -i '%p-%j' -H resume");
1331
string_set(&pService->szQueuepausecommand, "disable '%p'");
1332
string_set(&pService->szQueueresumecommand, "enable '%p'");
1333
#endif /* HAVE_CUPS */
1338
string_set(&pService->szLpqcommand, "lpstat -o%p");
1339
string_set(&pService->szLprmcommand, "cancel %p-%j");
1340
string_set(&pService->szPrintcommand, "lp -c -d%p %s; rm %s");
1341
string_set(&pService->szQueuepausecommand, "disable %p");
1342
string_set(&pService->szQueueresumecommand, "enable %p");
1344
string_set(&pService->szLppausecommand, "lp -i %p-%j -H hold");
1345
string_set(&pService->szLpresumecommand, "lp -i %p-%j -H resume");
1350
string_set(&pService->szLpqcommand, "lpq -P%p");
1351
string_set(&pService->szLprmcommand, "lprm -P%p %j");
1352
string_set(&pService->szPrintcommand, "lp -r -P%p %s");
1358
string_set(&pService->szPrintcommand, "vlp print %p %s");
1359
string_set(&pService->szLpqcommand, "vlp lpq %p");
1360
string_set(&pService->szLprmcommand, "vlp lprm %p %j");
1361
string_set(&pService->szLppausecommand, "vlp lppause %p %j");
1362
string_set(&pService->szLpresumecommand, "vlp lpresum %p %j");
1363
string_set(&pService->szQueuepausecommand, "vlp queuepause %p");
1364
string_set(&pService->szQueueresumecommand, "vlp queueresume %p");
1366
#endif /* DEVELOPER */
1371
/***************************************************************************
1372
Initialise the global parameter structure.
1373
***************************************************************************/
1375
static void init_globals(BOOL first_time_only)
1377
static BOOL done_init = False;
1380
/* If requested to initialize only once and we've already done it... */
1381
if (first_time_only && done_init) {
1382
/* ... then we have nothing more to do */
1389
/* The logfile can be set before this is invoked. Free it if so. */
1390
if (Globals.szLogFile != NULL) {
1391
string_free(&Globals.szLogFile);
1392
Globals.szLogFile = NULL;
1395
memset((void *)&Globals, '\0', sizeof(Globals));
1397
for (i = 0; parm_table[i].label; i++)
1398
if ((parm_table[i].type == P_STRING ||
1399
parm_table[i].type == P_USTRING) &&
1401
string_set((char **)parm_table[i].ptr, "");
1403
string_set(&sDefault.fstype, FSTYPE_STRING);
1405
init_printer_values(&sDefault);
1411
DEBUG(3, ("Initialising global parameters\n"));
1413
string_set(&Globals.szSMBPasswdFile, dyn_SMB_PASSWD_FILE);
1414
string_set(&Globals.szPrivateDir, dyn_PRIVATE_DIR);
1416
/* use the new 'hash2' method by default, with a prefix of 1 */
1417
string_set(&Globals.szManglingMethod, "hash2");
1418
Globals.mangle_prefix = 1;
1420
string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
1422
/* using UTF8 by default allows us to support all chars */
1423
string_set(&Globals.unix_charset, DEFAULT_UNIX_CHARSET);
1425
#if defined(HAVE_NL_LANGINFO) && defined(CODESET)
1426
/* If the system supports nl_langinfo(), try to grab the value
1427
from the user's locale */
1428
string_set(&Globals.display_charset, "LOCALE");
1430
string_set(&Globals.display_charset, DEFAULT_DISPLAY_CHARSET);
1433
/* Use codepage 850 as a default for the dos character set */
1434
string_set(&Globals.dos_charset, DEFAULT_DOS_CHARSET);
1437
* Allow the default PASSWD_CHAT to be overridden in local.h.
1439
string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1441
set_global_myname(myhostname());
1442
string_set(&Globals.szNetbiosName,global_myname());
1444
set_global_myworkgroup(WORKGROUP);
1445
string_set(&Globals.szWorkgroup, lp_workgroup());
1447
string_set(&Globals.szPasswdProgram, "");
1448
string_set(&Globals.szPidDir, dyn_PIDDIR);
1449
string_set(&Globals.szLockDir, dyn_LOCKDIR);
1450
string_set(&Globals.szSocketAddress, "0.0.0.0");
1451
pstrcpy(s, "Samba ");
1452
pstrcat(s, SAMBA_VERSION_STRING);
1453
string_set(&Globals.szServerString, s);
1454
slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1455
DEFAULT_MINOR_VERSION);
1456
string_set(&Globals.szAnnounceVersion, s);
1458
string_set(&Globals.szPanicAction, "/bin/sleep 999999999");
1461
pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1463
string_set(&Globals.szLogonDrive, "");
1464
/* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1465
string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1466
string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1468
string_set(&Globals.szNameResolveOrder, "lmhosts wins host bcast");
1469
string_set(&Globals.szPasswordServer, "*");
1471
Globals.AlgorithmicRidBase = BASE_RID;
1473
Globals.bLoadPrinters = True;
1474
Globals.PrintcapCacheTime = 750; /* 12.5 minutes */
1476
/* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
1477
/* Discovered by 2 days of pain by Don McCall @ HP :-). */
1478
Globals.max_xmit = 0x4104;
1479
Globals.max_mux = 50; /* This is *needed* for profile support. */
1480
Globals.lpqcachetime = 30; /* changed to handle large print servers better -- jerry */
1481
Globals.bDisableSpoolss = False;
1482
Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1483
Globals.pwordlevel = 0;
1484
Globals.unamelevel = 0;
1485
Globals.deadtime = 0;
1486
Globals.bLargeReadwrite = True;
1487
Globals.max_log_size = 5000;
1488
Globals.max_open_files = MAX_OPEN_FILES;
1489
Globals.open_files_db_hash_size = SMB_OPEN_DATABASE_TDB_HASH_SIZE;
1490
Globals.maxprotocol = PROTOCOL_NT1;
1491
Globals.minprotocol = PROTOCOL_CORE;
1492
Globals.security = SEC_USER;
1493
Globals.paranoid_server_security = True;
1494
Globals.bEncryptPasswords = True;
1495
Globals.bUpdateEncrypt = False;
1496
Globals.clientSchannel = Auto;
1497
Globals.serverSchannel = Auto;
1498
Globals.bReadRaw = True;
1499
Globals.bWriteRaw = True;
1500
Globals.bReadbmpx = False;
1501
Globals.bNullPasswords = False;
1502
Globals.bObeyPamRestrictions = False;
1504
Globals.bSyslogOnly = False;
1505
Globals.bTimestampLogs = True;
1506
string_set(&Globals.szLogLevel, "0");
1507
Globals.bDebugHiresTimestamp = False;
1508
Globals.bDebugPid = False;
1509
Globals.bDebugUid = False;
1510
Globals.bEnableCoreFiles = True;
1511
Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1512
Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1513
Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1514
Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1515
Globals.bKernelChangeNotify = True; /* On if we have it. */
1516
Globals.bFamChangeNotify = True; /* On if we have it. */
1517
Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1518
Globals.lm_interval = 60;
1519
Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1520
#if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1521
Globals.bNISHomeMap = False;
1522
#ifdef WITH_NISPLUS_HOME
1523
string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1525
string_set(&Globals.szNISHomeMapName, "auto.home");
1528
Globals.bTimeServer = False;
1529
Globals.bBindInterfacesOnly = False;
1530
Globals.bUnixPasswdSync = False;
1531
Globals.bPamPasswordChange = False;
1532
Globals.bPasswdChatDebug = False;
1533
Globals.iPasswdChatTimeout = 2; /* 2 second default. */
1534
Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1535
Globals.bNTStatusSupport = True; /* Use NT status by default. */
1536
Globals.bStatCache = True; /* use stat cache by default */
1537
Globals.iMaxStatCacheSize = 0; /* unlimited size in kb by default. */
1538
Globals.restrict_anonymous = 0;
1539
Globals.bClientLanManAuth = True; /* Do use the LanMan hash if it is available */
1540
Globals.bClientPlaintextAuth = True; /* Do use a plaintext password if is requested by the server */
1541
Globals.bLanmanAuth = True; /* Do use the LanMan hash if it is available */
1542
Globals.bNTLMAuth = True; /* Do use NTLMv1 if it is available (otherwise NTLMv2) */
1543
Globals.bClientNTLMv2Auth = False; /* Client should not use NTLMv2, as we can't tell that the server supports it. */
1544
/* Note, that we will use NTLM2 session security (which is different), if it is available */
1546
Globals.map_to_guest = 0; /* By Default, "Never" */
1547
Globals.oplock_break_wait_time = 0; /* By Default, 0 msecs. */
1548
Globals.enhanced_browsing = True;
1549
Globals.iLockSpinCount = 3; /* Try 3 times. */
1550
Globals.iLockSpinTime = 10; /* usec. */
1551
#ifdef MMAP_BLACKLIST
1552
Globals.bUseMmap = False;
1554
Globals.bUseMmap = True;
1556
Globals.bUnixExtensions = True;
1557
Globals.bResetOnZeroVC = False;
1559
/* hostname lookups can be very expensive and are broken on
1560
a large number of sites (tridge) */
1561
Globals.bHostnameLookups = False;
1563
string_set(&Globals.szPassdbBackend, "smbpasswd");
1564
string_set(&Globals.szLdapSuffix, "");
1565
string_set(&Globals.szLdapMachineSuffix, "");
1566
string_set(&Globals.szLdapUserSuffix, "");
1567
string_set(&Globals.szLdapGroupSuffix, "");
1568
string_set(&Globals.szLdapIdmapSuffix, "");
1570
string_set(&Globals.szLdapAdminDn, "");
1571
Globals.ldap_ssl = LDAP_SSL_ON;
1572
Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
1573
Globals.ldap_delete_dn = False;
1574
Globals.ldap_replication_sleep = 1000; /* wait 1 sec for replication */
1575
Globals.ldap_timeout = LDAP_CONNECT_DEFAULT_TIMEOUT;
1576
Globals.ldap_page_size = LDAP_PAGE_SIZE;
1578
/* This is what we tell the afs client. in reality we set the token
1579
* to never expire, though, when this runs out the afs client will
1580
* forget the token. Set to 0 to get NEVERDATE.*/
1581
Globals.iAfsTokenLifetime = 604800;
1583
/* these parameters are set to defaults that are more appropriate
1584
for the increasing samba install base:
1586
as a member of the workgroup, that will possibly become a
1587
_local_ master browser (lm = True). this is opposed to a forced
1588
local master browser startup (pm = True).
1590
doesn't provide WINS server service by default (wsupp = False),
1591
and doesn't provide domain master browser services by default, either.
1595
Globals.bMsAddPrinterWizard = True;
1596
Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1597
Globals.os_level = 20;
1598
Globals.bLocalMaster = True;
1599
Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1600
Globals.bDomainLogons = False;
1601
Globals.bBrowseList = True;
1602
Globals.bWINSsupport = False;
1603
Globals.bWINSproxy = False;
1605
Globals.bDNSproxy = True;
1607
/* this just means to use them if they exist */
1608
Globals.bKernelOplocks = True;
1610
Globals.bAllowTrustedDomains = True;
1612
string_set(&Globals.szTemplateShell, "/bin/false");
1613
string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1614
string_set(&Globals.szWinbindSeparator, "\\");
1615
string_set(&Globals.szCupsServer, "");
1616
string_set(&Globals.szIPrintServer, "");
1618
Globals.winbind_cache_time = 300; /* 5 minutes */
1619
Globals.bWinbindEnumUsers = False;
1620
Globals.bWinbindEnumGroups = False;
1621
Globals.bWinbindUseDefaultDomain = False;
1622
Globals.bWinbindTrustedDomainsOnly = False;
1623
Globals.bWinbindNestedGroups = True;
1624
Globals.szWinbindNssInfo = str_list_make("template", NULL);
1625
Globals.bWinbindRefreshTickets = False;
1626
Globals.bWinbindOfflineLogon = False;
1628
Globals.bPassdbExpandExplicit = False;
1630
Globals.name_cache_timeout = 660; /* In seconds */
1632
Globals.bUseSpnego = True;
1633
Globals.bClientUseSpnego = True;
1635
Globals.client_signing = Auto;
1636
Globals.server_signing = False;
1638
Globals.bDeferSharingViolations = True;
1639
string_set(&Globals.smb_ports, SMB_PORTS);
1641
Globals.bEnablePrivileges = True;
1642
Globals.bHostMSDfs = True;
1643
Globals.bASUSupport = False;
1645
/* User defined shares. */
1646
pstrcpy(s, dyn_LOCKDIR);
1647
pstrcat(s, "/usershares");
1648
string_set(&Globals.szUsersharePath, s);
1649
string_set(&Globals.szUsershareTemplateShare, "");
1650
Globals.iUsershareMaxShares = 0;
1651
/* By default disallow sharing of directories not owned by the sharer. */
1652
Globals.bUsershareOwnerOnly = True;
1653
/* By default disallow guest access to usershares. */
1654
Globals.bUsershareAllowGuests = False;
1657
static TALLOC_CTX *lp_talloc;
1659
/******************************************************************* a
1660
Free up temporary memory - called from the main loop.
1661
********************************************************************/
1663
void lp_TALLOC_FREE(void)
1667
TALLOC_FREE(lp_talloc);
1671
TALLOC_CTX *tmp_talloc_ctx(void)
1673
if (lp_talloc == NULL) {
1674
lp_talloc = talloc_init("tmp_talloc_ctx");
1677
if (lp_talloc == NULL) {
1678
smb_panic("Could not create temporary talloc context\n");
1684
/*******************************************************************
1685
Convenience routine to grab string parameters into temporary memory
1686
and run standard_sub_basic on them. The buffers can be written to by
1687
callers without affecting the source string.
1688
********************************************************************/
1690
static char *lp_string(const char *s)
1694
/* The follow debug is useful for tracking down memory problems
1695
especially if you have an inner loop that is calling a lp_*()
1696
function that returns a string. Perhaps this debug should be
1697
present all the time? */
1700
DEBUG(10, ("lp_string(%s)\n", s));
1704
lp_talloc = talloc_init("lp_talloc");
1706
tmpstr = alloc_sub_basic(get_current_username(),
1707
current_user_info.domain, s);
1708
if (trim_char(tmpstr, '\"', '\"')) {
1709
if (strchr(tmpstr,'\"') != NULL) {
1711
tmpstr = alloc_sub_basic(get_current_username(),
1712
current_user_info.domain, s);
1715
ret = talloc_strdup(lp_talloc, tmpstr);
1722
In this section all the functions that are used to access the
1723
parameters from the rest of the program are defined
1726
#define FN_GLOBAL_STRING(fn_name,ptr) \
1727
char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1728
#define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
1729
const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
1730
#define FN_GLOBAL_LIST(fn_name,ptr) \
1731
const char **fn_name(void) {return(*(const char ***)(ptr));}
1732
#define FN_GLOBAL_BOOL(fn_name,ptr) \
1733
BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1734
#define FN_GLOBAL_CHAR(fn_name,ptr) \
1735
char fn_name(void) {return(*(char *)(ptr));}
1736
#define FN_GLOBAL_INTEGER(fn_name,ptr) \
1737
int fn_name(void) {return(*(int *)(ptr));}
1739
#define FN_LOCAL_STRING(fn_name,val) \
1740
char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1741
#define FN_LOCAL_CONST_STRING(fn_name,val) \
1742
const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1743
#define FN_LOCAL_LIST(fn_name,val) \
1744
const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1745
#define FN_LOCAL_BOOL(fn_name,val) \
1746
BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1747
#define FN_LOCAL_INTEGER(fn_name,val) \
1748
int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1750
#define FN_LOCAL_PARM_BOOL(fn_name,val) \
1751
BOOL fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
1752
#define FN_LOCAL_PARM_STRING(fn_name,val) \
1753
char *fn_name(const struct share_params *p) {return(lp_string((LP_SNUM_OK(p->service) && ServicePtrs[(p->service)]->val) ? ServicePtrs[(p->service)]->val : sDefault.val));}
1754
#define FN_LOCAL_CHAR(fn_name,val) \
1755
char fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
1757
FN_GLOBAL_STRING(lp_smb_ports, &Globals.smb_ports)
1758
FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
1759
FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
1760
FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
1761
FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1762
FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1763
FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1764
FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
1765
FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1766
FN_GLOBAL_INTEGER(lp_printcap_cache_time, &Globals.PrintcapCacheTime)
1767
FN_GLOBAL_STRING(lp_addport_cmd, &Globals.szAddPortCommand)
1768
FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1769
FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1770
FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1771
FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
1772
FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1773
FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
1774
FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
1775
FN_GLOBAL_INTEGER(lp_mangle_prefix, &Globals.mangle_prefix)
1776
FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1777
FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1778
FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
1779
FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1780
FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1781
FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1782
FN_GLOBAL_STRING(lp_get_quota_command, &Globals.szGetQuota)
1783
FN_GLOBAL_STRING(lp_set_quota_command, &Globals.szSetQuota)
1784
FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1785
FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1786
FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1787
FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1788
FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1789
FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
1790
FN_GLOBAL_CONST_STRING(lp_afs_username_map, &Globals.szAfsUsernameMap)
1791
FN_GLOBAL_INTEGER(lp_afs_token_lifetime, &Globals.iAfsTokenLifetime)
1792
FN_GLOBAL_STRING(lp_log_nt_token_command, &Globals.szLogNtTokenCommand)
1793
FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1794
FN_GLOBAL_CONST_STRING(lp_logon_script, &Globals.szLogonScript)
1795
FN_GLOBAL_CONST_STRING(lp_logon_path, &Globals.szLogonPath)
1796
FN_GLOBAL_CONST_STRING(lp_logon_drive, &Globals.szLogonDrive)
1797
FN_GLOBAL_CONST_STRING(lp_logon_home, &Globals.szLogonHome)
1798
FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1799
FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1800
FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
1801
FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
1802
FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1803
FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1804
static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1805
FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
1806
FN_GLOBAL_STRING(lp_passdb_backend, &Globals.szPassdbBackend)
1807
FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules)
1808
FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1809
FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1810
FN_GLOBAL_STRING(lp_renameuser_script, &Globals.szRenameUserScript)
1811
FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1813
FN_GLOBAL_CONST_STRING(lp_guestaccount, &Globals.szGuestaccount)
1814
FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
1815
FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
1816
FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
1817
FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserFromGroupScript)
1818
FN_GLOBAL_STRING(lp_setprimarygroup_script, &Globals.szSetPrimaryGroupScript)
1820
FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
1822
FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript)
1823
FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript)
1824
FN_GLOBAL_STRING(lp_username_map_script, &Globals.szUsernameMapScript)
1826
FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript)
1828
FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1829
FN_GLOBAL_CONST_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1830
FN_GLOBAL_CONST_STRING(lp_template_shell, &Globals.szTemplateShell)
1831
FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1832
FN_GLOBAL_INTEGER(lp_acl_compatibility, &Globals.iAclCompat)
1833
FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1834
FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1835
FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
1836
FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only, &Globals.bWinbindTrustedDomainsOnly)
1837
FN_GLOBAL_BOOL(lp_winbind_nested_groups, &Globals.bWinbindNestedGroups)
1838
FN_GLOBAL_BOOL(lp_winbind_refresh_tickets, &Globals.bWinbindRefreshTickets)
1839
FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon)
1841
FN_GLOBAL_LIST(lp_idmap_backend, &Globals.szIdmapBackend)
1842
FN_GLOBAL_BOOL(lp_passdb_expand_explicit, &Globals.bPassdbExpandExplicit)
1844
FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1845
FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
1846
FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
1847
FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
1848
FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
1849
FN_GLOBAL_INTEGER(lp_ldap_replication_sleep, &Globals.ldap_replication_sleep)
1850
FN_GLOBAL_INTEGER(lp_ldap_timeout, &Globals.ldap_timeout)
1851
FN_GLOBAL_INTEGER(lp_ldap_page_size, &Globals.ldap_page_size)
1852
FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
1853
FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
1854
FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
1855
FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
1856
FN_GLOBAL_LIST(lp_usershare_prefix_allow_list, &Globals.szUsersharePrefixAllowList)
1857
FN_GLOBAL_LIST(lp_usershare_prefix_deny_list, &Globals.szUsersharePrefixDenyList)
1859
FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
1861
FN_GLOBAL_BOOL(lp_usershare_allow_guests, &Globals.bUsershareAllowGuests)
1862
FN_GLOBAL_BOOL(lp_usershare_owner_only, &Globals.bUsershareOwnerOnly)
1863
FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
1864
FN_GLOBAL_BOOL(lp_reset_on_zero_vc, &Globals.bResetOnZeroVC)
1865
FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1866
FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1867
FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1868
FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1869
FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1870
FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1871
FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1872
FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1873
FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1874
FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1875
FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1876
FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1877
FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1878
FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
1879
FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1880
FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1881
FN_GLOBAL_INTEGER(lp_client_schannel, &Globals.clientSchannel)
1882
FN_GLOBAL_INTEGER(lp_server_schannel, &Globals.serverSchannel)
1883
FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1884
FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1885
FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1886
FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1887
FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1888
FN_GLOBAL_BOOL(lp_enable_core_files, &Globals.bEnableCoreFiles)
1889
FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1890
FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1891
static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1892
FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1893
FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
1894
FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1895
FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1896
FN_GLOBAL_INTEGER(lp_passwd_chat_timeout, &Globals.iPasswdChatTimeout)
1897
FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1898
FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
1899
FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1900
FN_GLOBAL_INTEGER(lp_max_stat_cache_size, &Globals.iMaxStatCacheSize)
1901
FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1902
FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
1903
FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1904
FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
1905
FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
1906
FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
1907
FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
1908
FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1909
FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1910
FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1911
FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
1912
FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
1913
FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
1914
FN_GLOBAL_BOOL(lp_client_use_spnego, &Globals.bClientUseSpnego)
1915
FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
1916
FN_GLOBAL_BOOL(lp_kernel_change_notify, &Globals.bKernelChangeNotify)
1917
FN_GLOBAL_BOOL(lp_fam_change_notify, &Globals.bFamChangeNotify)
1918
FN_GLOBAL_BOOL(lp_use_kerberos_keytab, &Globals.bUseKerberosKeytab)
1919
FN_GLOBAL_BOOL(lp_defer_sharing_violations, &Globals.bDeferSharingViolations)
1920
FN_GLOBAL_BOOL(lp_enable_privileges, &Globals.bEnablePrivileges)
1921
FN_GLOBAL_BOOL(lp_enable_asu_support, &Globals.bASUSupport)
1922
FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1923
FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1924
FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1925
FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1926
FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1927
FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1928
FN_GLOBAL_INTEGER(lp_open_files_db_hash_size, &Globals.open_files_db_hash_size)
1929
FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1930
FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1931
FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1932
FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1933
FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1934
FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1935
FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1936
FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1937
FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
1938
FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
1939
FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1940
FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1941
FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
1942
FN_GLOBAL_INTEGER(_lp_disable_spoolss, &Globals.bDisableSpoolss)
1943
FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1944
static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1945
FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1946
FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1947
FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1948
FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1949
FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1950
FN_GLOBAL_INTEGER(lp_lock_spin_count, &Globals.iLockSpinCount)
1951
FN_GLOBAL_INTEGER(lp_lock_sleep_time, &Globals.iLockSpinTime)
1952
FN_GLOBAL_INTEGER(lp_usershare_max_shares, &Globals.iUsershareMaxShares)
1954
FN_LOCAL_STRING(lp_preexec, szPreExec)
1955
FN_LOCAL_STRING(lp_postexec, szPostExec)
1956
FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1957
FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1958
FN_LOCAL_STRING(lp_servicename, szService)
1959
FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
1960
FN_LOCAL_STRING(lp_pathname, szPath)
1961
FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1962
FN_LOCAL_STRING(lp_username, szUsername)
1963
FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
1964
FN_LOCAL_LIST(lp_valid_users, szValidUsers)
1965
FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
1966
FN_GLOBAL_LIST(lp_svcctl_list, &Globals.szServicesList)
1967
FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
1968
FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
1969
FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer)
1970
FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1971
FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1972
FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1973
FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1974
FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1975
FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1976
FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1977
static FN_LOCAL_STRING(_lp_printername, szPrintername)
1978
FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
1979
FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
1980
FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1981
FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1982
FN_LOCAL_STRING(lp_comment, comment)
1983
FN_LOCAL_STRING(lp_force_user, force_user)
1984
FN_LOCAL_STRING(lp_force_group, force_group)
1985
FN_LOCAL_LIST(lp_readlist, readlist)
1986
FN_LOCAL_LIST(lp_writelist, writelist)
1987
FN_LOCAL_LIST(lp_printer_admin, printer_admin)
1988
FN_LOCAL_STRING(lp_fstype, fstype)
1989
FN_LOCAL_LIST(lp_vfs_objects, szVfsObjects)
1990
FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
1991
static FN_LOCAL_STRING(lp_volume, volume)
1992
FN_LOCAL_PARM_STRING(lp_mangled_map, szMangledMap)
1993
FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1994
FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1995
FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1996
FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1997
FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
1998
FN_LOCAL_STRING(lp_dfree_command, szDfree)
1999
FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
2000
FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
2001
FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
2002
FN_LOCAL_INTEGER(lp_casesensitive, iCaseSensitive)
2003
FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
2004
FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
2005
FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
2006
FN_LOCAL_BOOL(lp_hide_special_files, bHideSpecialFiles)
2007
FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
2008
FN_LOCAL_BOOL(lp_hideunwriteable_files, bHideUnWriteableFiles)
2009
FN_LOCAL_BOOL(lp_browseable, bBrowseable)
2010
FN_LOCAL_BOOL(lp_readonly, bRead_only)
2011
FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
2012
FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
2013
FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
2014
FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
2015
FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
2016
FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
2017
FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
2018
FN_LOCAL_BOOL(lp_dmapi_support, bDmapiSupport)
2019
FN_LOCAL_BOOL(lp_locking, bLocking)
2020
FN_LOCAL_INTEGER(lp_strict_locking, iStrictLocking)
2021
FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
2022
FN_LOCAL_BOOL(lp_share_modes, bShareModes)
2023
FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
2024
FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
2025
FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
2026
FN_LOCAL_PARM_BOOL(lp_manglednames, bMangledNames)
2027
FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
2028
FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
2029
FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
2030
FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
2031
FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
2032
FN_LOCAL_BOOL(lp_map_system, bMap_system)
2033
FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
2034
FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
2035
FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
2036
FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
2037
FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
2038
FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
2039
FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
2040
FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
2041
FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
2042
FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
2043
FN_LOCAL_BOOL(lp_inherit_owner, bInheritOwner)
2044
FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
2045
FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
2046
FN_LOCAL_BOOL(lp_force_printername, bForcePrintername)
2047
FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
2048
FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
2049
FN_LOCAL_BOOL(lp_ea_support, bEASupport)
2050
FN_LOCAL_BOOL(_lp_use_sendfile, bUseSendfile)
2051
FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
2052
FN_LOCAL_BOOL(lp_map_acl_inherit, bMap_acl_inherit)
2053
FN_LOCAL_BOOL(lp_afs_share, bAfs_Share)
2054
FN_LOCAL_BOOL(lp_acl_check_permissions, bAclCheckPermissions)
2055
FN_LOCAL_BOOL(lp_acl_group_control, bAclGroupControl)
2056
FN_LOCAL_BOOL(lp_acl_map_full_control, bAclMapFullControl)
2057
FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
2058
FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
2059
FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
2060
FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
2061
FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
2062
FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
2063
FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
2064
FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
2065
FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
2066
FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
2067
FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
2068
FN_LOCAL_INTEGER(lp_printing, iPrinting)
2069
FN_LOCAL_INTEGER(lp_max_reported_jobs, iMaxReportedPrintJobs)
2070
FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
2071
FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
2072
FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
2073
FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
2074
FN_LOCAL_INTEGER(lp_dfree_cache_time, iDfreeCacheTime)
2075
FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size)
2076
FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
2077
FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
2078
FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
2079
FN_LOCAL_INTEGER(lp_change_notify_timeout, ichange_notify_timeout)
2080
FN_LOCAL_CHAR(lp_magicchar, magic_char)
2081
FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
2082
FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)
2083
FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
2084
FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
2085
FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
2086
FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
2088
/* local prototypes */
2090
static int map_parameter(const char *pszParmName);
2091
static BOOL set_boolean(BOOL *pb, const char *pszParmValue);
2092
static int getservicebyname(const char *pszServiceName,
2093
service * pserviceDest);
2094
static void copy_service(service * pserviceDest,
2095
service * pserviceSource, BOOL *pcopymapDest);
2096
static BOOL service_ok(int iService);
2097
static BOOL do_parameter(const char *pszParmName, const char *pszParmValue);
2098
static BOOL do_section(const char *pszSectionName);
2099
static void init_copymap(service * pservice);
2100
static BOOL hash_a_service(const char *name, int number);
2101
static void free_service_byindex(int iService);
2102
static char * canonicalize_servicename(const char *name);
2104
/* This is a helper function for parametrical options support. */
2105
/* It returns a pointer to parametrical option value if it exists or NULL otherwise */
2106
/* Actual parametrical functions are quite simple */
2107
static param_opt_struct *get_parametrics(int snum, const char *type, const char *option)
2109
BOOL global_section = False;
2111
param_opt_struct *data;
2113
if (snum >= iNumServices) return NULL;
2116
data = Globals.param_opt;
2117
global_section = True;
2119
data = ServicePtrs[snum]->param_opt;
2122
asprintf(¶m_key, "%s:%s", type, option);
2124
DEBUG(0,("asprintf failed!\n"));
2129
if (strcmp(data->key, param_key) == 0) {
2130
string_free(¶m_key);
2136
if (!global_section) {
2137
/* Try to fetch the same option but from globals */
2138
/* but only if we are not already working with Globals */
2139
data = Globals.param_opt;
2141
if (strcmp(data->key, param_key) == 0) {
2142
string_free(¶m_key);
2149
string_free(¶m_key);
2155
#define MISSING_PARAMETER(name) \
2156
DEBUG(0, ("%s(): value is NULL or empty!\n", #name))
2158
/*******************************************************************
2159
convenience routine to return int parameters.
2160
********************************************************************/
2161
static int lp_int(const char *s)
2165
MISSING_PARAMETER(lp_int);
2172
/*******************************************************************
2173
convenience routine to return unsigned long parameters.
2174
********************************************************************/
2175
static unsigned long lp_ulong(const char *s)
2179
MISSING_PARAMETER(lp_ulong);
2183
return strtoul(s, NULL, 10);
2186
/*******************************************************************
2187
convenience routine to return boolean parameters.
2188
********************************************************************/
2189
static BOOL lp_bool(const char *s)
2194
MISSING_PARAMETER(lp_bool);
2198
if (!set_boolean(&ret,s)) {
2199
DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
2206
/*******************************************************************
2207
convenience routine to return enum parameters.
2208
********************************************************************/
2209
static int lp_enum(const char *s,const struct enum_list *_enum)
2213
if (!s || !*s || !_enum) {
2214
MISSING_PARAMETER(lp_enum);
2218
for (i=0; _enum[i].name; i++) {
2219
if (strequal(_enum[i].name,s))
2220
return _enum[i].value;
2223
DEBUG(0,("lp_enum(%s,enum): value is not in enum_list!\n",s));
2227
#undef MISSING_PARAMETER
2229
/* DO NOT USE lp_parm_string ANYMORE!!!!
2230
* use lp_parm_const_string or lp_parm_talloc_string
2232
* lp_parm_string is only used to let old modules find this symbol
2234
#undef lp_parm_string
2235
char *lp_parm_string(const char *servicename, const char *type, const char *option)
2237
return lp_parm_talloc_string(lp_servicenumber(servicename), type, option, NULL);
2240
/* Return parametric option from a given service. Type is a part of option before ':' */
2241
/* Parametric option has following syntax: 'Type: option = value' */
2242
/* the returned value is talloced in lp_talloc */
2243
char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def)
2245
param_opt_struct *data = get_parametrics(snum, type, option);
2247
if (data == NULL||data->value==NULL) {
2249
return lp_string(def);
2255
return lp_string(data->value);
2258
/* Return parametric option from a given service. Type is a part of option before ':' */
2259
/* Parametric option has following syntax: 'Type: option = value' */
2260
const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def)
2262
param_opt_struct *data = get_parametrics(snum, type, option);
2264
if (data == NULL||data->value==NULL)
2270
/* Return parametric option from a given service. Type is a part of option before ':' */
2271
/* Parametric option has following syntax: 'Type: option = value' */
2273
const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def)
2275
param_opt_struct *data = get_parametrics(snum, type, option);
2277
if (data == NULL||data->value==NULL)
2278
return (const char **)def;
2280
if (data->list==NULL) {
2281
data->list = str_list_make(data->value, NULL);
2284
return (const char **)data->list;
2287
/* Return parametric option from a given service. Type is a part of option before ':' */
2288
/* Parametric option has following syntax: 'Type: option = value' */
2290
int lp_parm_int(int snum, const char *type, const char *option, int def)
2292
param_opt_struct *data = get_parametrics(snum, type, option);
2294
if (data && data->value && *data->value)
2295
return lp_int(data->value);
2300
/* Return parametric option from a given service. Type is a part of option before ':' */
2301
/* Parametric option has following syntax: 'Type: option = value' */
2303
unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsigned long def)
2305
param_opt_struct *data = get_parametrics(snum, type, option);
2307
if (data && data->value && *data->value)
2308
return lp_ulong(data->value);
2313
/* Return parametric option from a given service. Type is a part of option before ':' */
2314
/* Parametric option has following syntax: 'Type: option = value' */
2316
BOOL lp_parm_bool(int snum, const char *type, const char *option, BOOL def)
2318
param_opt_struct *data = get_parametrics(snum, type, option);
2320
if (data && data->value && *data->value)
2321
return lp_bool(data->value);
2326
/* Return parametric option from a given service. Type is a part of option before ':' */
2327
/* Parametric option has following syntax: 'Type: option = value' */
2329
int lp_parm_enum(int snum, const char *type, const char *option,
2330
const struct enum_list *_enum, int def)
2332
param_opt_struct *data = get_parametrics(snum, type, option);
2334
if (data && data->value && *data->value && _enum)
2335
return lp_enum(data->value, _enum);
2341
/***************************************************************************
2342
Initialise a service to the defaults.
2343
***************************************************************************/
2345
static void init_service(service * pservice)
2347
memset((char *)pservice, '\0', sizeof(service));
2348
copy_service(pservice, &sDefault, NULL);
2351
/***************************************************************************
2352
Free the dynamically allocated parts of a service struct.
2353
***************************************************************************/
2355
static void free_service(service *pservice)
2358
param_opt_struct *data, *pdata;
2362
if (pservice->szService)
2363
DEBUG(5, ("free_service: Freeing service %s\n",
2364
pservice->szService));
2366
string_free(&pservice->szService);
2367
SAFE_FREE(pservice->copymap);
2369
for (i = 0; parm_table[i].label; i++) {
2370
if ((parm_table[i].type == P_STRING ||
2371
parm_table[i].type == P_USTRING) &&
2372
parm_table[i].p_class == P_LOCAL)
2373
string_free((char **)
2374
(((char *)pservice) +
2375
PTR_DIFF(parm_table[i].ptr, &sDefault)));
2376
else if (parm_table[i].type == P_LIST &&
2377
parm_table[i].p_class == P_LOCAL)
2378
str_list_free((char ***)
2379
(((char *)pservice) +
2380
PTR_DIFF(parm_table[i].ptr, &sDefault)));
2383
data = pservice->param_opt;
2385
DEBUG(5,("Freeing parametrics:\n"));
2387
DEBUG(5,("[%s = %s]\n", data->key, data->value));
2388
string_free(&data->key);
2389
string_free(&data->value);
2390
str_list_free(&data->list);
2396
ZERO_STRUCTP(pservice);
2400
/***************************************************************************
2401
remove a service indexed in the ServicePtrs array from the ServiceHash
2402
and free the dynamically allocated parts
2403
***************************************************************************/
2405
static void free_service_byindex(int idx)
2407
if ( !LP_SNUM_OK(idx) )
2410
ServicePtrs[idx]->valid = False;
2411
invalid_services[num_invalid_services++] = idx;
2413
/* we have to cleanup the hash record */
2415
if (ServicePtrs[idx]->szService) {
2416
char *canon_name = canonicalize_servicename( ServicePtrs[idx]->szService );
2418
tdb_delete_bystring(ServiceHash, canon_name );
2421
free_service(ServicePtrs[idx]);
2424
/***************************************************************************
2425
Add a new service to the services array initialising it with the given
2427
***************************************************************************/
2429
static int add_a_service(const service *pservice, const char *name)
2433
int num_to_alloc = iNumServices + 1;
2434
param_opt_struct *data, *pdata;
2436
tservice = *pservice;
2438
/* it might already exist */
2440
i = getservicebyname(name, NULL);
2442
/* Clean all parametric options for service */
2443
/* They will be added during parsing again */
2444
data = ServicePtrs[i]->param_opt;
2446
string_free(&data->key);
2447
string_free(&data->value);
2448
str_list_free(&data->list);
2453
ServicePtrs[i]->param_opt = NULL;
2458
/* find an invalid one */
2460
if (num_invalid_services > 0) {
2461
i = invalid_services[--num_invalid_services];
2464
/* if not, then create one */
2465
if (i == iNumServices) {
2469
tsp = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(ServicePtrs, service *, num_to_alloc);
2471
DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
2475
ServicePtrs[iNumServices] = SMB_MALLOC_P(service);
2476
if (!ServicePtrs[iNumServices]) {
2477
DEBUG(0,("add_a_service: out of memory!\n"));
2482
/* enlarge invalid_services here for now... */
2483
tinvalid = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(invalid_services, int,
2485
if (tinvalid == NULL) {
2486
DEBUG(0,("add_a_service: failed to enlarge "
2487
"invalid_services!\n"));
2490
invalid_services = tinvalid;
2492
free_service_byindex(i);
2495
ServicePtrs[i]->valid = True;
2497
init_service(ServicePtrs[i]);
2498
copy_service(ServicePtrs[i], &tservice, NULL);
2500
string_set(&ServicePtrs[i]->szService, name);
2502
DEBUG(8,("add_a_service: Creating snum = %d for %s\n",
2503
i, ServicePtrs[i]->szService));
2505
if (!hash_a_service(ServicePtrs[i]->szService, i)) {
2512
/***************************************************************************
2513
Convert a string to uppercase and remove whitespaces.
2514
***************************************************************************/
2516
static char *canonicalize_servicename(const char *src)
2518
static fstring canon; /* is fstring large enough? */
2521
DEBUG(0,("canonicalize_servicename: NULL source name!\n"));
2525
fstrcpy( canon, src );
2526
strlower_m( canon );
2531
/***************************************************************************
2532
Add a name/index pair for the services array to the hash table.
2533
***************************************************************************/
2535
static BOOL hash_a_service(const char *name, int idx)
2539
if ( !ServiceHash ) {
2540
DEBUG(10,("hash_a_service: creating tdb servicehash\n"));
2541
ServiceHash = tdb_open("servicehash", 1031, TDB_INTERNAL,
2542
(O_RDWR|O_CREAT), 0600);
2543
if ( !ServiceHash ) {
2544
DEBUG(0,("hash_a_service: open tdb servicehash failed!\n"));
2549
DEBUG(10,("hash_a_service: hashing index %d for service name %s\n",
2552
if ( !(canon_name = canonicalize_servicename( name )) )
2555
tdb_store_int32(ServiceHash, canon_name, idx);
2560
/***************************************************************************
2561
Add a new home service, with the specified home directory, defaults coming
2563
***************************************************************************/
2565
BOOL lp_add_home(const char *pszHomename, int iDefaultService,
2566
const char *user, const char *pszHomedir)
2571
i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
2576
if (!(*(ServicePtrs[iDefaultService]->szPath))
2577
|| strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(GLOBAL_SECTION_SNUM))) {
2578
pstrcpy(newHomedir, pszHomedir);
2579
string_set(&ServicePtrs[i]->szPath, newHomedir);
2582
if (!(*(ServicePtrs[i]->comment))) {
2584
slprintf(comment, sizeof(comment) - 1,
2585
"Home directory of %s", user);
2586
string_set(&ServicePtrs[i]->comment, comment);
2589
/* set the browseable flag from the global default */
2591
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2593
ServicePtrs[i]->autoloaded = True;
2595
DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename,
2596
user, ServicePtrs[i]->szPath ));
2601
/***************************************************************************
2602
Add a new service, based on an old one.
2603
***************************************************************************/
2605
int lp_add_service(const char *pszService, int iDefaultService)
2607
return (add_a_service(ServicePtrs[iDefaultService], pszService));
2610
/***************************************************************************
2611
Add the IPC service.
2612
***************************************************************************/
2614
static BOOL lp_add_ipc(const char *ipc_name, BOOL guest_ok)
2617
int i = add_a_service(&sDefault, ipc_name);
2622
slprintf(comment, sizeof(comment) - 1,
2623
"IPC Service (%s)", Globals.szServerString);
2625
string_set(&ServicePtrs[i]->szPath, tmpdir());
2626
string_set(&ServicePtrs[i]->szUsername, "");
2627
string_set(&ServicePtrs[i]->comment, comment);
2628
string_set(&ServicePtrs[i]->fstype, "IPC");
2629
ServicePtrs[i]->iMaxConnections = 0;
2630
ServicePtrs[i]->bAvailable = True;
2631
ServicePtrs[i]->bRead_only = True;
2632
ServicePtrs[i]->bGuest_only = False;
2633
ServicePtrs[i]->bGuest_ok = guest_ok;
2634
ServicePtrs[i]->bPrint_ok = False;
2635
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2637
DEBUG(3, ("adding IPC service\n"));
2642
/***************************************************************************
2643
Add a new printer service, with defaults coming from service iFrom.
2644
***************************************************************************/
2646
BOOL lp_add_printer(const char *pszPrintername, int iDefaultService)
2648
const char *comment = "From Printcap";
2649
int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
2654
/* note that we do NOT default the availability flag to True - */
2655
/* we take it from the default service passed. This allows all */
2656
/* dynamic printers to be disabled by disabling the [printers] */
2657
/* entry (if/when the 'available' keyword is implemented!). */
2659
/* the printer name is set to the service name. */
2660
string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
2661
string_set(&ServicePtrs[i]->comment, comment);
2663
/* set the browseable flag from the gloabl default */
2664
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2666
/* Printers cannot be read_only. */
2667
ServicePtrs[i]->bRead_only = False;
2668
/* No share modes on printer services. */
2669
ServicePtrs[i]->bShareModes = False;
2670
/* No oplocks on printer services. */
2671
ServicePtrs[i]->bOpLocks = False;
2672
/* Printer services must be printable. */
2673
ServicePtrs[i]->bPrint_ok = True;
2675
DEBUG(3, ("adding printer service %s\n", pszPrintername));
2680
/***************************************************************************
2681
Map a parameter's string representation to something we can use.
2682
Returns False if the parameter string is not recognised, else TRUE.
2683
***************************************************************************/
2685
static int map_parameter(const char *pszParmName)
2689
if (*pszParmName == '-')
2692
for (iIndex = 0; parm_table[iIndex].label; iIndex++)
2693
if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
2696
/* Warn only if it isn't parametric option */
2697
if (strchr(pszParmName, ':') == NULL)
2698
DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
2699
/* We do return 'fail' for parametric options as well because they are
2700
stored in different storage
2705
/***************************************************************************
2706
Show all parameter's name, type, [values,] and flags.
2707
***************************************************************************/
2709
void show_parameter_list(void)
2711
int classIndex, parmIndex, enumIndex, flagIndex;
2713
const char *section_names[] = { "local", "global", NULL};
2714
const char *type[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
2715
"P_OCTAL", "P_LIST", "P_STRING", "P_USTRING", "P_GSTRING",
2716
"P_UGSTRING", "P_ENUM", "P_SEP"};
2717
unsigned flags[] = { FLAG_BASIC, FLAG_SHARE, FLAG_PRINT, FLAG_GLOBAL,
2718
FLAG_WIZARD, FLAG_ADVANCED, FLAG_DEVELOPER, FLAG_DEPRECATED,
2719
FLAG_HIDE, FLAG_DOS_STRING};
2720
const char *flag_names[] = { "FLAG_BASIC", "FLAG_SHARE", "FLAG_PRINT",
2721
"FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
2722
"FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL};
2724
for ( classIndex=0; section_names[classIndex]; classIndex++) {
2725
printf("[%s]\n", section_names[classIndex]);
2726
for (parmIndex = 0; parm_table[parmIndex].label; parmIndex++) {
2727
if (parm_table[parmIndex].p_class == classIndex) {
2729
parm_table[parmIndex].label,
2730
type[parm_table[parmIndex].type]);
2731
switch (parm_table[parmIndex].type) {
2734
for (enumIndex=0; parm_table[parmIndex].enum_list[enumIndex].name; enumIndex++)
2736
enumIndex ? "|" : "",
2737
parm_table[parmIndex].enum_list[enumIndex].name);
2744
for ( flagIndex=0; flag_names[flagIndex]; flagIndex++ ) {
2745
if (parm_table[parmIndex].flags & flags[flagIndex]) {
2748
flag_names[flagIndex]);
2758
/***************************************************************************
2759
Set a boolean variable from the text value stored in the passed string.
2760
Returns True in success, False if the passed string does not correctly
2761
represent a boolean.
2762
***************************************************************************/
2764
static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
2769
if (strwicmp(pszParmValue, "yes") == 0 ||
2770
strwicmp(pszParmValue, "true") == 0 ||
2771
strwicmp(pszParmValue, "1") == 0)
2773
else if (strwicmp(pszParmValue, "no") == 0 ||
2774
strwicmp(pszParmValue, "False") == 0 ||
2775
strwicmp(pszParmValue, "0") == 0)
2779
("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
2786
/***************************************************************************
2787
Find a service by name. Otherwise works like get_service.
2788
***************************************************************************/
2790
static int getservicebyname(const char *pszServiceName, service * pserviceDest)
2795
if (ServiceHash != NULL) {
2796
if ( !(canon_name = canonicalize_servicename( pszServiceName )) )
2799
iService = tdb_fetch_int32(ServiceHash, canon_name );
2801
if (LP_SNUM_OK(iService)) {
2802
if (pserviceDest != NULL) {
2803
copy_service(pserviceDest, ServicePtrs[iService], NULL);
2813
/***************************************************************************
2814
Copy a service structure to another.
2815
If pcopymapDest is NULL then copy all fields
2816
***************************************************************************/
2818
static void copy_service(service * pserviceDest, service * pserviceSource, BOOL *pcopymapDest)
2821
BOOL bcopyall = (pcopymapDest == NULL);
2822
param_opt_struct *data, *pdata, *paramo;
2825
for (i = 0; parm_table[i].label; i++)
2826
if (parm_table[i].ptr && parm_table[i].p_class == P_LOCAL &&
2827
(bcopyall || pcopymapDest[i])) {
2828
void *def_ptr = parm_table[i].ptr;
2830
((char *)pserviceSource) + PTR_DIFF(def_ptr,
2833
((char *)pserviceDest) + PTR_DIFF(def_ptr,
2836
switch (parm_table[i].type) {
2839
*(BOOL *)dest_ptr = *(BOOL *)src_ptr;
2845
*(int *)dest_ptr = *(int *)src_ptr;
2849
*(char *)dest_ptr = *(char *)src_ptr;
2853
string_set((char **)dest_ptr,
2858
string_set((char **)dest_ptr,
2860
strupper_m(*(char **)dest_ptr);
2863
str_list_free((char ***)dest_ptr);
2864
str_list_copy((char ***)dest_ptr, *(const char ***)src_ptr);
2872
init_copymap(pserviceDest);
2873
if (pserviceSource->copymap)
2874
memcpy((void *)pserviceDest->copymap,
2875
(void *)pserviceSource->copymap,
2876
sizeof(BOOL) * NUMPARAMETERS);
2879
data = pserviceSource->param_opt;
2882
pdata = pserviceDest->param_opt;
2883
/* Traverse destination */
2885
/* If we already have same option, override it */
2886
if (strcmp(pdata->key, data->key) == 0) {
2887
string_free(&pdata->value);
2888
str_list_free(&data->list);
2889
pdata->value = SMB_STRDUP(data->value);
2893
pdata = pdata->next;
2896
paramo = SMB_XMALLOC_P(param_opt_struct);
2897
paramo->key = SMB_STRDUP(data->key);
2898
paramo->value = SMB_STRDUP(data->value);
2899
paramo->list = NULL;
2900
DLIST_ADD(pserviceDest->param_opt, paramo);
2906
/***************************************************************************
2907
Check a service for consistency. Return False if the service is in any way
2908
incomplete or faulty, else True.
2909
***************************************************************************/
2911
static BOOL service_ok(int iService)
2916
if (ServicePtrs[iService]->szService[0] == '\0') {
2917
DEBUG(0, ("The following message indicates an internal error:\n"));
2918
DEBUG(0, ("No service name in service entry.\n"));
2922
/* The [printers] entry MUST be printable. I'm all for flexibility, but */
2923
/* I can't see why you'd want a non-printable printer service... */
2924
if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
2925
if (!ServicePtrs[iService]->bPrint_ok) {
2926
DEBUG(0, ("WARNING: [%s] service MUST be printable!\n",
2927
ServicePtrs[iService]->szService));
2928
ServicePtrs[iService]->bPrint_ok = True;
2930
/* [printers] service must also be non-browsable. */
2931
if (ServicePtrs[iService]->bBrowseable)
2932
ServicePtrs[iService]->bBrowseable = False;
2935
if (ServicePtrs[iService]->szPath[0] == '\0' &&
2936
strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0 &&
2937
ServicePtrs[iService]->szMSDfsProxy[0] == '\0'
2939
DEBUG(0, ("WARNING: No path in service %s - making it unavailable!\n",
2940
ServicePtrs[iService]->szService));
2941
ServicePtrs[iService]->bAvailable = False;
2944
/* If a service is flagged unavailable, log the fact at level 0. */
2945
if (!ServicePtrs[iService]->bAvailable)
2946
DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2947
ServicePtrs[iService]->szService));
2952
static struct file_lists {
2953
struct file_lists *next;
2957
} *file_lists = NULL;
2959
/*******************************************************************
2960
Keep a linked list of all config files so we know when one has changed
2961
it's date and needs to be reloaded.
2962
********************************************************************/
2964
static void add_to_file_list(const char *fname, const char *subfname)
2966
struct file_lists *f = file_lists;
2969
if (f->name && !strcmp(f->name, fname))
2975
f = SMB_MALLOC_P(struct file_lists);
2978
f->next = file_lists;
2979
f->name = SMB_STRDUP(fname);
2984
f->subfname = SMB_STRDUP(subfname);
2990
f->modtime = file_modtime(subfname);
2992
time_t t = file_modtime(subfname);
2998
/*******************************************************************
2999
Check if a config file has changed date.
3000
********************************************************************/
3002
BOOL lp_file_list_changed(void)
3004
struct file_lists *f = file_lists;
3006
DEBUG(6, ("lp_file_list_changed()\n"));
3012
pstrcpy(n2, f->name);
3013
standard_sub_basic( get_current_username(),
3014
current_user_info.domain,
3017
DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
3018
f->name, n2, ctime(&f->modtime)));
3020
mod_time = file_modtime(n2);
3022
if (mod_time && ((f->modtime != mod_time) || (f->subfname == NULL) || (strcmp(n2, f->subfname) != 0))) {
3024
("file %s modified: %s\n", n2,
3026
f->modtime = mod_time;
3027
SAFE_FREE(f->subfname);
3028
f->subfname = SMB_STRDUP(n2);
3036
/***************************************************************************
3037
Run standard_sub_basic on netbios name... needed because global_myname
3038
is not accessed through any lp_ macro.
3039
Note: We must *NOT* use string_set() here as ptr points to global_myname.
3040
***************************************************************************/
3042
static BOOL handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
3045
pstring netbios_name;
3047
pstrcpy(netbios_name, pszParmValue);
3049
standard_sub_basic(get_current_username(), current_user_info.domain,
3050
netbios_name, sizeof(netbios_name));
3052
ret = set_global_myname(netbios_name);
3053
string_set(&Globals.szNetbiosName,global_myname());
3055
DEBUG(4, ("handle_netbios_name: set global_myname to: %s\n",
3061
static BOOL handle_charset(int snum, const char *pszParmValue, char **ptr)
3063
if (strcmp(*ptr, pszParmValue) != 0) {
3064
string_set(ptr, pszParmValue);
3072
static BOOL handle_workgroup(int snum, const char *pszParmValue, char **ptr)
3076
ret = set_global_myworkgroup(pszParmValue);
3077
string_set(&Globals.szWorkgroup,lp_workgroup());
3082
static BOOL handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
3086
ret = set_global_scope(pszParmValue);
3087
string_set(&Globals.szNetbiosScope,global_scope());
3092
static BOOL handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
3094
str_list_free(&Globals.szNetbiosAliases);
3095
Globals.szNetbiosAliases = str_list_make(pszParmValue, NULL);
3096
return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
3099
/***************************************************************************
3100
Handle the include operation.
3101
***************************************************************************/
3103
static BOOL handle_include(int snum, const char *pszParmValue, char **ptr)
3106
pstrcpy(fname, pszParmValue);
3108
standard_sub_basic(get_current_username(), current_user_info.domain,
3109
fname,sizeof(fname));
3111
add_to_file_list(pszParmValue, fname);
3113
string_set(ptr, fname);
3115
if (file_exist(fname, NULL))
3116
return (pm_process(fname, do_section, do_parameter));
3118
DEBUG(2, ("Can't find include file %s\n", fname));
3123
/***************************************************************************
3124
Handle the interpretation of the copy parameter.
3125
***************************************************************************/
3127
static BOOL handle_copy(int snum, const char *pszParmValue, char **ptr)
3131
service serviceTemp;
3133
string_set(ptr, pszParmValue);
3135
init_service(&serviceTemp);
3139
DEBUG(3, ("Copying service from service %s\n", pszParmValue));
3141
if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0) {
3142
if (iTemp == iServiceIndex) {
3143
DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue));
3145
copy_service(ServicePtrs[iServiceIndex],
3147
ServicePtrs[iServiceIndex]->copymap);
3151
DEBUG(0, ("Unable to copy service - source not found: %s\n", pszParmValue));
3155
free_service(&serviceTemp);
3159
/***************************************************************************
3160
Handle idmap/non unix account uid and gid allocation parameters. The format of these
3165
idmap uid = 1000-1999
3168
We only do simple parsing checks here. The strings are parsed into useful
3169
structures in the idmap daemon code.
3171
***************************************************************************/
3173
/* Some lp_ routines to return idmap [ug]id information */
3175
static uid_t idmap_uid_low, idmap_uid_high;
3176
static gid_t idmap_gid_low, idmap_gid_high;
3178
BOOL lp_idmap_uid(uid_t *low, uid_t *high)
3180
if (idmap_uid_low == 0 || idmap_uid_high == 0)
3184
*low = idmap_uid_low;
3187
*high = idmap_uid_high;
3192
BOOL lp_idmap_gid(gid_t *low, gid_t *high)
3194
if (idmap_gid_low == 0 || idmap_gid_high == 0)
3198
*low = idmap_gid_low;
3201
*high = idmap_gid_high;
3206
/* Do some simple checks on "idmap [ug]id" parameter values */
3208
static BOOL handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
3212
if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
3217
string_set(ptr, pszParmValue);
3219
idmap_uid_low = low;
3220
idmap_uid_high = high;
3225
static BOOL handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
3229
if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
3234
string_set(ptr, pszParmValue);
3236
idmap_gid_low = low;
3237
idmap_gid_high = high;
3242
/***************************************************************************
3243
Handle the DEBUG level list.
3244
***************************************************************************/
3246
static BOOL handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
3248
pstring pszParmValue;
3250
pstrcpy(pszParmValue, pszParmValueIn);
3251
string_set(ptr, pszParmValueIn);
3252
return debug_parse_levels( pszParmValue );
3255
/***************************************************************************
3256
Handle ldap suffixes - default to ldapsuffix if sub-suffixes are not defined.
3257
***************************************************************************/
3259
static const char *append_ldap_suffix( const char *str )
3261
const char *suffix_string;
3265
lp_talloc = talloc_init("lp_talloc");
3267
suffix_string = talloc_asprintf( lp_talloc, "%s,%s", str, Globals.szLdapSuffix );
3268
if ( !suffix_string ) {
3269
DEBUG(0,("append_ldap_suffix: talloc_asprintf() failed!\n"));
3273
return suffix_string;
3276
const char *lp_ldap_machine_suffix(void)
3278
if (Globals.szLdapMachineSuffix[0])
3279
return append_ldap_suffix(Globals.szLdapMachineSuffix);
3281
return lp_string(Globals.szLdapSuffix);
3284
const char *lp_ldap_user_suffix(void)
3286
if (Globals.szLdapUserSuffix[0])
3287
return append_ldap_suffix(Globals.szLdapUserSuffix);
3289
return lp_string(Globals.szLdapSuffix);
3292
const char *lp_ldap_group_suffix(void)
3294
if (Globals.szLdapGroupSuffix[0])
3295
return append_ldap_suffix(Globals.szLdapGroupSuffix);
3297
return lp_string(Globals.szLdapSuffix);
3300
const char *lp_ldap_idmap_suffix(void)
3302
if (Globals.szLdapIdmapSuffix[0])
3303
return append_ldap_suffix(Globals.szLdapIdmapSuffix);
3305
return lp_string(Globals.szLdapSuffix);
3308
/****************************************************************************
3309
set the value for a P_ENUM
3310
***************************************************************************/
3312
static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue,
3317
for (i = 0; parm->enum_list[i].name; i++) {
3318
if ( strequal(pszParmValue, parm->enum_list[i].name)) {
3319
*ptr = parm->enum_list[i].value;
3325
/***************************************************************************
3326
***************************************************************************/
3328
static BOOL handle_printing(int snum, const char *pszParmValue, char **ptr)
3330
static int parm_num = -1;
3333
if ( parm_num == -1 )
3334
parm_num = map_parameter( "printing" );
3336
lp_set_enum_parm( &parm_table[parm_num], pszParmValue, (int*)ptr );
3341
s = ServicePtrs[snum];
3343
init_printer_values( s );
3349
/***************************************************************************
3350
Initialise a copymap.
3351
***************************************************************************/
3353
static void init_copymap(service * pservice)
3356
SAFE_FREE(pservice->copymap);
3357
pservice->copymap = SMB_MALLOC_ARRAY(BOOL,NUMPARAMETERS);
3358
if (!pservice->copymap)
3360
("Couldn't allocate copymap!! (size %d)\n",
3361
(int)NUMPARAMETERS));
3363
for (i = 0; i < NUMPARAMETERS; i++)
3364
pservice->copymap[i] = True;
3367
/***************************************************************************
3368
Return the local pointer to a parameter given the service number and the
3369
pointer into the default structure.
3370
***************************************************************************/
3372
void *lp_local_ptr(int snum, void *ptr)
3374
return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
3377
/***************************************************************************
3378
Process a parameter for a particular service number. If snum < 0
3379
then assume we are in the globals.
3380
***************************************************************************/
3382
BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
3384
int parmnum, i, slen;
3385
void *parm_ptr = NULL; /* where we are going to store the result */
3386
void *def_ptr = NULL;
3389
param_opt_struct *paramo, *data;
3392
parmnum = map_parameter(pszParmName);
3395
if ((sep=strchr(pszParmName, ':')) != NULL) {
3397
ZERO_STRUCT(param_key);
3398
pstr_sprintf(param_key, "%s:", pszParmName);
3399
slen = strlen(param_key);
3400
pstrcat(param_key, sep+1);
3401
trim_char(param_key+slen, ' ', ' ');
3403
data = (snum < 0) ? Globals.param_opt :
3404
ServicePtrs[snum]->param_opt;
3405
/* Traverse destination */
3407
/* If we already have same option, override it */
3408
if (strcmp(data->key, param_key) == 0) {
3409
string_free(&data->value);
3410
str_list_free(&data->list);
3411
data->value = SMB_STRDUP(pszParmValue);
3418
paramo = SMB_XMALLOC_P(param_opt_struct);
3419
paramo->key = SMB_STRDUP(param_key);
3420
paramo->value = SMB_STRDUP(pszParmValue);
3421
paramo->list = NULL;
3423
DLIST_ADD(Globals.param_opt, paramo);
3425
DLIST_ADD(ServicePtrs[snum]->param_opt, paramo);
3432
DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName));
3436
if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
3437
DEBUG(1, ("WARNING: The \"%s\" option is deprecated\n",
3441
def_ptr = parm_table[parmnum].ptr;
3443
/* we might point at a service, the default service or a global */
3447
if (parm_table[parmnum].p_class == P_GLOBAL) {
3449
("Global parameter %s found in service section!\n",
3454
((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
3459
if (!ServicePtrs[snum]->copymap)
3460
init_copymap(ServicePtrs[snum]);
3462
/* this handles the aliases - set the copymap for other entries with
3463
the same data pointer */
3464
for (i = 0; parm_table[i].label; i++)
3465
if (parm_table[i].ptr == parm_table[parmnum].ptr)
3466
ServicePtrs[snum]->copymap[i] = False;
3469
/* if it is a special case then go ahead */
3470
if (parm_table[parmnum].special) {
3471
parm_table[parmnum].special(snum, pszParmValue, (char **)parm_ptr);
3475
/* now switch on the type of variable it is */
3476
switch (parm_table[parmnum].type)
3479
*(BOOL *)parm_ptr = lp_bool(pszParmValue);
3483
*(BOOL *)parm_ptr = !lp_bool(pszParmValue);
3487
*(int *)parm_ptr = lp_int(pszParmValue);
3491
*(char *)parm_ptr = *pszParmValue;
3495
i = sscanf(pszParmValue, "%o", (int *)parm_ptr);
3497
DEBUG ( 0, ("Invalid octal number %s\n", pszParmName ));
3502
str_list_free((char ***)parm_ptr);
3503
*(char ***)parm_ptr = str_list_make(pszParmValue, NULL);
3507
string_set((char **)parm_ptr, pszParmValue);
3511
string_set((char **)parm_ptr, pszParmValue);
3512
strupper_m(*(char **)parm_ptr);
3516
pstrcpy((char *)parm_ptr, pszParmValue);
3520
pstrcpy((char *)parm_ptr, pszParmValue);
3521
strupper_m((char *)parm_ptr);
3525
lp_set_enum_parm( &parm_table[parmnum], pszParmValue, (int*)parm_ptr );
3534
/***************************************************************************
3535
Process a parameter.
3536
***************************************************************************/
3538
static BOOL do_parameter(const char *pszParmName, const char *pszParmValue)
3540
if (!bInGlobalSection && bGlobalOnly)
3543
DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
3545
return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
3546
pszParmName, pszParmValue));
3549
/***************************************************************************
3550
Print a parameter of the specified type.
3551
***************************************************************************/
3553
static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
3559
for (i = 0; p->enum_list[i].name; i++) {
3560
if (*(int *)ptr == p->enum_list[i].value) {
3562
p->enum_list[i].name);
3569
fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
3573
fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
3577
fprintf(f, "%d", *(int *)ptr);
3581
fprintf(f, "%c", *(char *)ptr);
3585
fprintf(f, "%s", octal_string(*(int *)ptr));
3589
if ((char ***)ptr && *(char ***)ptr) {
3590
char **list = *(char ***)ptr;
3592
for (; *list; list++) {
3593
/* surround strings with whitespace in double quotes */
3594
if ( strchr_m( *list, ' ' ) )
3595
fprintf(f, "\"%s\"%s", *list, ((*(list+1))?", ":""));
3597
fprintf(f, "%s%s", *list, ((*(list+1))?", ":""));
3605
fprintf(f, "%s", (char *)ptr);
3611
if (*(char **)ptr) {
3612
fprintf(f, "%s", *(char **)ptr);
3620
/***************************************************************************
3621
Check if two parameters are equal.
3622
***************************************************************************/
3624
static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
3629
return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
3634
return (*((int *)ptr1) == *((int *)ptr2));
3637
return (*((char *)ptr1) == *((char *)ptr2));
3640
return str_list_compare(*(char ***)ptr1, *(char ***)ptr2);
3645
char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
3650
return (p1 == p2 || strequal(p1, p2));
3655
char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
3660
return (p1 == p2 || strequal(p1, p2));
3668
/***************************************************************************
3669
Initialize any local varients in the sDefault table.
3670
***************************************************************************/
3672
void init_locals(void)
3677
/***************************************************************************
3678
Process a new section (service). At this stage all sections are services.
3679
Later we'll have special sections that permit server parameters to be set.
3680
Returns True on success, False on failure.
3681
***************************************************************************/
3683
static BOOL do_section(const char *pszSectionName)
3686
BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
3687
(strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
3690
/* if we were in a global section then do the local inits */
3691
if (bInGlobalSection && !isglobal)
3694
/* if we've just struck a global section, note the fact. */
3695
bInGlobalSection = isglobal;
3697
/* check for multiple global sections */
3698
if (bInGlobalSection) {
3699
DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
3703
if (!bInGlobalSection && bGlobalOnly)
3706
/* if we have a current service, tidy it up before moving on */
3709
if (iServiceIndex >= 0)
3710
bRetval = service_ok(iServiceIndex);
3712
/* if all is still well, move to the next record in the services array */
3714
/* We put this here to avoid an odd message order if messages are */
3715
/* issued by the post-processing of a previous section. */
3716
DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
3718
if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
3720
DEBUG(0, ("Failed to add a new service\n"));
3729
/***************************************************************************
3730
Determine if a partcular base parameter is currentl set to the default value.
3731
***************************************************************************/
3733
static BOOL is_default(int i)
3735
if (!defaults_saved)
3737
switch (parm_table[i].type) {
3739
return str_list_compare (parm_table[i].def.lvalue,
3740
*(char ***)parm_table[i].ptr);
3743
return strequal(parm_table[i].def.svalue,
3744
*(char **)parm_table[i].ptr);
3747
return strequal(parm_table[i].def.svalue,
3748
(char *)parm_table[i].ptr);
3751
return parm_table[i].def.bvalue ==
3752
*(BOOL *)parm_table[i].ptr;
3754
return parm_table[i].def.cvalue ==
3755
*(char *)parm_table[i].ptr;
3759
return parm_table[i].def.ivalue ==
3760
*(int *)parm_table[i].ptr;
3767
/***************************************************************************
3768
Display the contents of the global structure.
3769
***************************************************************************/
3771
static void dump_globals(FILE *f)
3774
param_opt_struct *data;
3776
fprintf(f, "[global]\n");
3778
for (i = 0; parm_table[i].label; i++)
3779
if (parm_table[i].p_class == P_GLOBAL &&
3780
parm_table[i].ptr &&
3781
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
3782
if (defaults_saved && is_default(i))
3784
fprintf(f, "\t%s = ", parm_table[i].label);
3785
print_parameter(&parm_table[i], parm_table[i].ptr, f);
3788
if (Globals.param_opt != NULL) {
3789
data = Globals.param_opt;
3791
fprintf(f, "\t%s = %s\n", data->key, data->value);
3798
/***************************************************************************
3799
Return True if a local parameter is currently set to the global default.
3800
***************************************************************************/
3802
BOOL lp_is_default(int snum, struct parm_struct *parm)
3804
int pdiff = PTR_DIFF(parm->ptr, &sDefault);
3806
return equal_parameter(parm->type,
3807
((char *)ServicePtrs[snum]) + pdiff,
3808
((char *)&sDefault) + pdiff);
3811
/***************************************************************************
3812
Display the contents of a single services record.
3813
***************************************************************************/
3815
static void dump_a_service(service * pService, FILE * f)
3818
param_opt_struct *data;
3820
if (pService != &sDefault)
3821
fprintf(f, "[%s]\n", pService->szService);
3823
for (i = 0; parm_table[i].label; i++) {
3825
if (parm_table[i].p_class == P_LOCAL &&
3826
parm_table[i].ptr &&
3827
(*parm_table[i].label != '-') &&
3828
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3831
int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
3833
if (pService == &sDefault) {
3834
if (defaults_saved && is_default(i))
3837
if (equal_parameter(parm_table[i].type,
3838
((char *)pService) +
3840
((char *)&sDefault) +
3845
fprintf(f, "\t%s = ", parm_table[i].label);
3846
print_parameter(&parm_table[i],
3847
((char *)pService) + pdiff, f);
3852
if (pService->param_opt != NULL) {
3853
data = pService->param_opt;
3855
fprintf(f, "\t%s = %s\n", data->key, data->value);
3861
/***************************************************************************
3862
Display the contents of a parameter of a single services record.
3863
***************************************************************************/
3865
BOOL dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
3867
service * pService = ServicePtrs[snum];
3869
BOOL result = False;
3872
fstring local_parm_name;
3874
const char *parm_opt_value;
3876
/* check for parametrical option */
3877
fstrcpy( local_parm_name, parm_name);
3878
parm_opt = strchr( local_parm_name, ':');
3883
if (strlen(parm_opt)) {
3884
parm_opt_value = lp_parm_const_string( snum,
3885
local_parm_name, parm_opt, NULL);
3886
if (parm_opt_value) {
3887
printf( "%s\n", parm_opt_value);
3894
/* check for a key and print the value */
3901
for (i = 0; parm_table[i].label; i++) {
3902
if (strwicmp(parm_table[i].label, parm_name) == 0 &&
3903
(parm_table[i].p_class == p_class || parm_table[i].flags & flag) &&
3904
parm_table[i].ptr &&
3905
(*parm_table[i].label != '-') &&
3906
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3911
ptr = parm_table[i].ptr;
3913
ptr = ((char *)pService) +
3914
PTR_DIFF(parm_table[i].ptr, &sDefault);
3916
print_parameter(&parm_table[i],
3927
/***************************************************************************
3928
Return info about the next service in a service. snum==GLOBAL_SECTION_SNUM gives the globals.
3929
Return NULL when out of parameters.
3930
***************************************************************************/
3932
struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
3935
/* do the globals */
3936
for (; parm_table[*i].label; (*i)++) {
3937
if (parm_table[*i].p_class == P_SEPARATOR)
3938
return &parm_table[(*i)++];
3940
if (!parm_table[*i].ptr
3941
|| (*parm_table[*i].label == '-'))
3945
&& (parm_table[*i].ptr ==
3946
parm_table[(*i) - 1].ptr))
3949
return &parm_table[(*i)++];
3952
service *pService = ServicePtrs[snum];
3954
for (; parm_table[*i].label; (*i)++) {
3955
if (parm_table[*i].p_class == P_SEPARATOR)
3956
return &parm_table[(*i)++];
3958
if (parm_table[*i].p_class == P_LOCAL &&
3959
parm_table[*i].ptr &&
3960
(*parm_table[*i].label != '-') &&
3962
(parm_table[*i].ptr !=
3963
parm_table[(*i) - 1].ptr)))
3966
PTR_DIFF(parm_table[*i].ptr,
3969
if (allparameters ||
3970
!equal_parameter(parm_table[*i].type,
3971
((char *)pService) +
3973
((char *)&sDefault) +
3976
return &parm_table[(*i)++];
3987
/***************************************************************************
3988
Display the contents of a single copy structure.
3989
***************************************************************************/
3990
static void dump_copy_map(BOOL *pcopymap)
3996
printf("\n\tNon-Copied parameters:\n");
3998
for (i = 0; parm_table[i].label; i++)
3999
if (parm_table[i].p_class == P_LOCAL &&
4000
parm_table[i].ptr && !pcopymap[i] &&
4001
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
4003
printf("\t\t%s\n", parm_table[i].label);
4008
/***************************************************************************
4009
Return TRUE if the passed service number is within range.
4010
***************************************************************************/
4012
BOOL lp_snum_ok(int iService)
4014
return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
4017
/***************************************************************************
4018
Auto-load some home services.
4019
***************************************************************************/
4021
static void lp_add_auto_services(char *str)
4030
s = SMB_STRDUP(str);
4034
homes = lp_servicenumber(HOMES_NAME);
4036
for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP)) {
4037
char *home = get_user_home_dir(p);
4039
if (lp_servicenumber(p) >= 0)
4042
if (home && homes >= 0)
4043
lp_add_home(p, homes, p, home);
4048
/***************************************************************************
4049
Auto-load one printer.
4050
***************************************************************************/
4052
void lp_add_one_printer(char *name, char *comment)
4054
int printers = lp_servicenumber(PRINTERS_NAME);
4057
if (lp_servicenumber(name) < 0) {
4058
lp_add_printer(name, printers);
4059
if ((i = lp_servicenumber(name)) >= 0) {
4060
string_set(&ServicePtrs[i]->comment, comment);
4061
ServicePtrs[i]->autoloaded = True;
4066
/***************************************************************************
4067
Have we loaded a services file yet?
4068
***************************************************************************/
4070
BOOL lp_loaded(void)
4075
/***************************************************************************
4076
Unload unused services.
4077
***************************************************************************/
4079
void lp_killunused(BOOL (*snumused) (int))
4082
for (i = 0; i < iNumServices; i++) {
4086
/* don't kill autoloaded or usershare services */
4087
if ( ServicePtrs[i]->autoloaded ||
4088
ServicePtrs[i]->usershare == USERSHARE_VALID) {
4092
if (!snumused || !snumused(i)) {
4093
free_service_byindex(i);
4098
/***************************************************************************
4100
***************************************************************************/
4102
void lp_killservice(int iServiceIn)
4104
if (VALID(iServiceIn)) {
4105
free_service_byindex(iServiceIn);
4109
/***************************************************************************
4110
Save the curent values of all global and sDefault parameters into the
4111
defaults union. This allows swat and testparm to show only the
4112
changed (ie. non-default) parameters.
4113
***************************************************************************/
4115
static void lp_save_defaults(void)
4118
for (i = 0; parm_table[i].label; i++) {
4119
if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
4121
switch (parm_table[i].type) {
4123
str_list_copy(&(parm_table[i].def.lvalue),
4124
*(const char ***)parm_table[i].ptr);
4128
if (parm_table[i].ptr) {
4129
parm_table[i].def.svalue = SMB_STRDUP(*(char **)parm_table[i].ptr);
4131
parm_table[i].def.svalue = NULL;
4136
if (parm_table[i].ptr) {
4137
parm_table[i].def.svalue = SMB_STRDUP((char *)parm_table[i].ptr);
4139
parm_table[i].def.svalue = NULL;
4144
parm_table[i].def.bvalue =
4145
*(BOOL *)parm_table[i].ptr;
4148
parm_table[i].def.cvalue =
4149
*(char *)parm_table[i].ptr;
4154
parm_table[i].def.ivalue =
4155
*(int *)parm_table[i].ptr;
4161
defaults_saved = True;
4164
/*******************************************************************
4165
Set the server type we will announce as via nmbd.
4166
********************************************************************/
4168
static const struct srv_role_tab {
4170
const char *role_str;
4171
} srv_role_tab [] = {
4172
{ ROLE_STANDALONE, "ROLE_STANDALONE" },
4173
{ ROLE_DOMAIN_MEMBER, "ROLE_DOMAIN_MEMBER" },
4174
{ ROLE_DOMAIN_BDC, "ROLE_DOMAIN_BDC" },
4175
{ ROLE_DOMAIN_PDC, "ROLE_DOMAIN_PDC" },
4179
const char* server_role_str(uint32 role)
4182
for (i=0; srv_role_tab[i].role_str; i++) {
4183
if (role == srv_role_tab[i].role) {
4184
return srv_role_tab[i].role_str;
4190
static void set_server_role(void)
4192
server_role = ROLE_STANDALONE;
4194
switch (lp_security()) {
4196
if (lp_domain_logons())
4197
DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
4200
if (lp_domain_logons())
4201
DEBUG(0, ("Server's Role (logon server) conflicts with server-level security\n"));
4202
/* this used to be considered ROLE_DOMAIN_MEMBER but that's just wrong */
4203
server_role = ROLE_STANDALONE;
4206
if (lp_domain_logons()) {
4207
DEBUG(1, ("Server's Role (logon server) NOT ADVISED with domain-level security\n"));
4208
server_role = ROLE_DOMAIN_BDC;
4211
server_role = ROLE_DOMAIN_MEMBER;
4214
if (lp_domain_logons()) {
4215
server_role = ROLE_DOMAIN_PDC;
4218
server_role = ROLE_DOMAIN_MEMBER;
4221
if (lp_domain_logons()) {
4223
if (Globals.bDomainMaster) /* auto or yes */
4224
server_role = ROLE_DOMAIN_PDC;
4226
server_role = ROLE_DOMAIN_BDC;
4230
DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
4234
DEBUG(10, ("set_server_role: role = %s\n", server_role_str(server_role)));
4237
/***********************************************************
4238
If we should send plaintext/LANMAN passwords in the clinet
4239
************************************************************/
4241
static void set_allowed_client_auth(void)
4243
if (Globals.bClientNTLMv2Auth) {
4244
Globals.bClientLanManAuth = False;
4246
if (!Globals.bClientLanManAuth) {
4247
Globals.bClientPlaintextAuth = False;
4251
/***************************************************************************
4253
The following code allows smbd to read a user defined share file.
4254
Yes, this is my intent. Yes, I'm comfortable with that...
4256
THE FOLLOWING IS SECURITY CRITICAL CODE.
4258
It washes your clothes, it cleans your house, it guards you while you sleep...
4259
Do not f%^k with it....
4260
***************************************************************************/
4262
#define MAX_USERSHARE_FILE_SIZE (10*1024)
4264
/***************************************************************************
4265
Check allowed stat state of a usershare file.
4266
Ensure we print out who is dicking with us so the admin can
4267
get their sorry ass fired.
4268
***************************************************************************/
4270
static BOOL check_usershare_stat(const char *fname, SMB_STRUCT_STAT *psbuf)
4272
if (!S_ISREG(psbuf->st_mode)) {
4273
DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
4274
"not a regular file\n",
4275
fname, (unsigned int)psbuf->st_uid ));
4279
/* Ensure this doesn't have the other write bit set. */
4280
if (psbuf->st_mode & S_IWOTH) {
4281
DEBUG(0,("check_usershare_stat: file %s owned by uid %u allows "
4282
"public write. Refusing to allow as a usershare file.\n",
4283
fname, (unsigned int)psbuf->st_uid ));
4287
/* Should be 10k or less. */
4288
if (psbuf->st_size > MAX_USERSHARE_FILE_SIZE) {
4289
DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
4290
"too large (%u) to be a user share file.\n",
4291
fname, (unsigned int)psbuf->st_uid,
4292
(unsigned int)psbuf->st_size ));
4299
/***************************************************************************
4300
Parse the contents of a usershare file.
4301
***************************************************************************/
4303
enum usershare_err parse_usershare_file(TALLOC_CTX *ctx,
4304
SMB_STRUCT_STAT *psbuf,
4305
const char *servicename,
4314
const char **prefixallowlist = lp_usershare_prefix_allow_list();
4315
const char **prefixdenylist = lp_usershare_prefix_deny_list();
4318
SMB_STRUCT_STAT sbuf;
4320
*pallow_guest = False;
4323
return USERSHARE_MALFORMED_FILE;
4326
if (strcmp(lines[0], "#VERSION 1") == 0) {
4328
} else if (strcmp(lines[0], "#VERSION 2") == 0) {
4331
return USERSHARE_MALFORMED_FILE;
4334
return USERSHARE_BAD_VERSION;
4337
if (strncmp(lines[1], "path=", 5) != 0) {
4338
return USERSHARE_MALFORMED_PATH;
4341
pstrcpy(sharepath, &lines[1][5]);
4342
trim_string(sharepath, " ", " ");
4344
if (strncmp(lines[2], "comment=", 8) != 0) {
4345
return USERSHARE_MALFORMED_COMMENT_DEF;
4348
pstrcpy(comment, &lines[2][8]);
4349
trim_string(comment, " ", " ");
4350
trim_char(comment, '"', '"');
4352
if (strncmp(lines[3], "usershare_acl=", 14) != 0) {
4353
return USERSHARE_MALFORMED_ACL_DEF;
4356
if (!parse_usershare_acl(ctx, &lines[3][14], ppsd)) {
4357
return USERSHARE_ACL_ERR;
4361
if (strncmp(lines[4], "guest_ok=", 9) != 0) {
4362
return USERSHARE_MALFORMED_ACL_DEF;
4364
if (lines[4][9] == 'y') {
4365
*pallow_guest = True;
4369
if (snum != -1 && (strcmp(sharepath, ServicePtrs[snum]->szPath) == 0)) {
4370
/* Path didn't change, no checks needed. */
4371
return USERSHARE_OK;
4374
/* The path *must* be absolute. */
4375
if (sharepath[0] != '/') {
4376
DEBUG(2,("parse_usershare_file: share %s: path %s is not an absolute path.\n",
4377
servicename, sharepath));
4378
return USERSHARE_PATH_NOT_ABSOLUTE;
4381
/* If there is a usershare prefix deny list ensure one of these paths
4382
doesn't match the start of the user given path. */
4383
if (prefixdenylist) {
4385
for ( i=0; prefixdenylist[i]; i++ ) {
4386
DEBUG(10,("parse_usershare_file: share %s : checking prefixdenylist[%d]='%s' against %s\n",
4387
servicename, i, prefixdenylist[i], sharepath ));
4388
if (memcmp( sharepath, prefixdenylist[i], strlen(prefixdenylist[i])) == 0) {
4389
DEBUG(2,("parse_usershare_file: share %s path %s starts with one of the "
4390
"usershare prefix deny list entries.\n",
4391
servicename, sharepath));
4392
return USERSHARE_PATH_IS_DENIED;
4397
/* If there is a usershare prefix allow list ensure one of these paths
4398
does match the start of the user given path. */
4400
if (prefixallowlist) {
4402
for ( i=0; prefixallowlist[i]; i++ ) {
4403
DEBUG(10,("parse_usershare_file: share %s checking prefixallowlist[%d]='%s' against %s\n",
4404
servicename, i, prefixallowlist[i], sharepath ));
4405
if (memcmp( sharepath, prefixallowlist[i], strlen(prefixallowlist[i])) == 0) {
4409
if (prefixallowlist[i] == NULL) {
4410
DEBUG(2,("parse_usershare_file: share %s path %s doesn't start with one of the "
4411
"usershare prefix allow list entries.\n",
4412
servicename, sharepath));
4413
return USERSHARE_PATH_NOT_ALLOWED;
4417
/* Ensure this is pointing to a directory. */
4418
dp = sys_opendir(sharepath);
4421
DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
4422
servicename, sharepath));
4423
return USERSHARE_PATH_NOT_DIRECTORY;
4426
/* Ensure the owner of the usershare file has permission to share
4429
if (sys_stat(sharepath, &sbuf) == -1) {
4430
DEBUG(2,("parse_usershare_file: share %s : stat failed on path %s. %s\n",
4431
servicename, sharepath, strerror(errno) ));
4433
return USERSHARE_POSIX_ERR;
4438
if (!S_ISDIR(sbuf.st_mode)) {
4439
DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
4440
servicename, sharepath ));
4441
return USERSHARE_PATH_NOT_DIRECTORY;
4444
/* Check if sharing is restricted to owner-only. */
4445
/* psbuf is the stat of the usershare definition file,
4446
sbuf is the stat of the target directory to be shared. */
4448
if (lp_usershare_owner_only()) {
4449
/* root can share anything. */
4450
if ((psbuf->st_uid != 0) && (sbuf.st_uid != psbuf->st_uid)) {
4451
return USERSHARE_PATH_NOT_ALLOWED;
4455
return USERSHARE_OK;
4458
/***************************************************************************
4459
Deal with a usershare file.
4462
-1 - Bad name, invalid contents.
4463
- service name already existed and not a usershare, problem
4464
with permissions to share directory etc.
4465
***************************************************************************/
4467
static int process_usershare_file(const char *dir_name, const char *file_name, int snum_template)
4469
SMB_STRUCT_STAT sbuf;
4470
SMB_STRUCT_STAT lsbuf;
4474
fstring service_name;
4475
char **lines = NULL;
4479
TALLOC_CTX *ctx = NULL;
4480
SEC_DESC *psd = NULL;
4481
BOOL guest_ok = False;
4483
/* Ensure share name doesn't contain invalid characters. */
4484
if (!validate_net_name(file_name, INVALID_SHARENAME_CHARS, strlen(file_name))) {
4485
DEBUG(0,("process_usershare_file: share name %s contains "
4486
"invalid characters (any of %s)\n",
4487
file_name, INVALID_SHARENAME_CHARS ));
4491
fstrcpy(service_name, file_name);
4493
pstrcpy(fname, dir_name);
4494
pstrcat(fname, "/");
4495
pstrcat(fname, file_name);
4497
/* Minimize the race condition by doing an lstat before we
4498
open and fstat. Ensure this isn't a symlink link. */
4500
if (sys_lstat(fname, &lsbuf) != 0) {
4501
DEBUG(0,("process_usershare_file: stat of %s failed. %s\n",
4502
fname, strerror(errno) ));
4506
/* This must be a regular file, not a symlink, directory or
4507
other strange filetype. */
4508
if (!check_usershare_stat(fname, &lsbuf)) {
4512
/* See if there is already a servicenum for this name. */
4513
/* tdb_fetch_int32 returns -1 if not found. */
4514
iService = (int)tdb_fetch_int32(ServiceHash, canonicalize_servicename(service_name) );
4516
if (iService != -1 && ServicePtrs[iService]->usershare_last_mod == lsbuf.st_mtime) {
4517
/* Nothing changed - Mark valid and return. */
4518
DEBUG(10,("process_usershare_file: service %s not changed.\n",
4520
ServicePtrs[iService]->usershare = USERSHARE_VALID;
4524
/* Try and open the file read only - no symlinks allowed. */
4526
fd = sys_open(fname, O_RDONLY|O_NOFOLLOW, 0);
4528
fd = sys_open(fname, O_RDONLY, 0);
4532
DEBUG(0,("process_usershare_file: unable to open %s. %s\n",
4533
fname, strerror(errno) ));
4537
/* Now fstat to be *SURE* it's a regular file. */
4538
if (sys_fstat(fd, &sbuf) != 0) {
4540
DEBUG(0,("process_usershare_file: fstat of %s failed. %s\n",
4541
fname, strerror(errno) ));
4545
/* Is it the same dev/inode as was lstated ? */
4546
if (lsbuf.st_dev != sbuf.st_dev || lsbuf.st_ino != sbuf.st_ino) {
4548
DEBUG(0,("process_usershare_file: fstat of %s is a different file from lstat. "
4549
"Symlink spoofing going on ?\n", fname ));
4553
/* This must be a regular file, not a symlink, directory or
4554
other strange filetype. */
4555
if (!check_usershare_stat(fname, &sbuf)) {
4559
lines = fd_lines_load(fd, &numlines, MAX_USERSHARE_FILE_SIZE);
4562
if (lines == NULL) {
4563
DEBUG(0,("process_usershare_file: loading file %s owned by %u failed.\n",
4564
fname, (unsigned int)sbuf.st_uid ));
4568
/* Should we allow printers to be shared... ? */
4569
ctx = talloc_init("usershare_sd_xctx");
4575
if (parse_usershare_file(ctx, &sbuf, service_name,
4576
iService, lines, numlines, sharepath,
4577
comment, &psd, &guest_ok) != USERSHARE_OK) {
4578
talloc_destroy(ctx);
4585
/* Everything ok - add the service possibly using a template. */
4587
const service *sp = &sDefault;
4588
if (snum_template != -1) {
4589
sp = ServicePtrs[snum_template];
4592
if ((iService = add_a_service(sp, service_name)) < 0) {
4593
DEBUG(0, ("process_usershare_file: Failed to add "
4594
"new service %s\n", service_name));
4595
talloc_destroy(ctx);
4599
/* Read only is controlled by usershare ACL below. */
4600
ServicePtrs[iService]->bRead_only = False;
4603
/* Write the ACL of the new/modified share. */
4604
if (!set_share_security(ctx, service_name, psd)) {
4605
DEBUG(0, ("process_usershare_file: Failed to set share "
4606
"security for user share %s\n",
4608
lp_remove_service(iService);
4609
talloc_destroy(ctx);
4613
talloc_destroy(ctx);
4615
/* If from a template it may be marked invalid. */
4616
ServicePtrs[iService]->valid = True;
4618
/* Set the service as a valid usershare. */
4619
ServicePtrs[iService]->usershare = USERSHARE_VALID;
4621
/* Set guest access. */
4622
if (lp_usershare_allow_guests()) {
4623
ServicePtrs[iService]->bGuest_ok = guest_ok;
4626
/* And note when it was loaded. */
4627
ServicePtrs[iService]->usershare_last_mod = sbuf.st_mtime;
4628
string_set(&ServicePtrs[iService]->szPath, sharepath);
4629
string_set(&ServicePtrs[iService]->comment, comment);
4634
/***************************************************************************
4635
Checks if a usershare entry has been modified since last load.
4636
***************************************************************************/
4638
static BOOL usershare_exists(int iService, time_t *last_mod)
4640
SMB_STRUCT_STAT lsbuf;
4641
const char *usersharepath = Globals.szUsersharePath;
4644
pstrcpy(fname, usersharepath);
4645
pstrcat(fname, "/");
4646
pstrcat(fname, ServicePtrs[iService]->szService);
4648
if (sys_lstat(fname, &lsbuf) != 0) {
4652
if (!S_ISREG(lsbuf.st_mode)) {
4656
*last_mod = lsbuf.st_mtime;
4660
/***************************************************************************
4661
Load a usershare service by name. Returns a valid servicenumber or -1.
4662
***************************************************************************/
4664
int load_usershare_service(const char *servicename)
4666
SMB_STRUCT_STAT sbuf;
4667
const char *usersharepath = Globals.szUsersharePath;
4668
int max_user_shares = Globals.iUsershareMaxShares;
4669
int snum_template = -1;
4671
if (*usersharepath == 0 || max_user_shares == 0) {
4675
if (sys_stat(usersharepath, &sbuf) != 0) {
4676
DEBUG(0,("load_usershare_service: stat of %s failed. %s\n",
4677
usersharepath, strerror(errno) ));
4681
if (!S_ISDIR(sbuf.st_mode)) {
4682
DEBUG(0,("load_usershare_service: %s is not a directory.\n",
4688
* This directory must be owned by root, and have the 't' bit set.
4689
* It also must not be writable by "other".
4693
if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
4695
if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
4697
DEBUG(0,("load_usershare_service: directory %s is not owned by root "
4698
"or does not have the sticky bit 't' set or is writable by anyone.\n",
4703
/* Ensure the template share exists if it's set. */
4704
if (Globals.szUsershareTemplateShare[0]) {
4705
/* We can't use lp_servicenumber here as we are recommending that
4706
template shares have -valid=False set. */
4707
for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
4708
if (ServicePtrs[snum_template]->szService &&
4709
strequal(ServicePtrs[snum_template]->szService,
4710
Globals.szUsershareTemplateShare)) {
4715
if (snum_template == -1) {
4716
DEBUG(0,("load_usershare_service: usershare template share %s "
4717
"does not exist.\n",
4718
Globals.szUsershareTemplateShare ));
4723
return process_usershare_file(usersharepath, servicename, snum_template);
4726
/***************************************************************************
4727
Load all user defined shares from the user share directory.
4728
We only do this if we're enumerating the share list.
4729
This is the function that can delete usershares that have
4731
***************************************************************************/
4733
int load_usershare_shares(void)
4736
SMB_STRUCT_STAT sbuf;
4737
SMB_STRUCT_DIRENT *de;
4738
int num_usershares = 0;
4739
int max_user_shares = Globals.iUsershareMaxShares;
4740
unsigned int num_dir_entries, num_bad_dir_entries, num_tmp_dir_entries;
4741
unsigned int allowed_bad_entries = ((2*max_user_shares)/10);
4742
unsigned int allowed_tmp_entries = ((2*max_user_shares)/10);
4744
int snum_template = -1;
4745
const char *usersharepath = Globals.szUsersharePath;
4746
int ret = lp_numservices();
4748
if (max_user_shares == 0 || *usersharepath == '\0') {
4749
return lp_numservices();
4752
if (sys_stat(usersharepath, &sbuf) != 0) {
4753
DEBUG(0,("load_usershare_shares: stat of %s failed. %s\n",
4754
usersharepath, strerror(errno) ));
4759
* This directory must be owned by root, and have the 't' bit set.
4760
* It also must not be writable by "other".
4764
if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
4766
if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
4768
DEBUG(0,("load_usershare_shares: directory %s is not owned by root "
4769
"or does not have the sticky bit 't' set or is writable by anyone.\n",
4774
/* Ensure the template share exists if it's set. */
4775
if (Globals.szUsershareTemplateShare[0]) {
4776
/* We can't use lp_servicenumber here as we are recommending that
4777
template shares have -valid=False set. */
4778
for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
4779
if (ServicePtrs[snum_template]->szService &&
4780
strequal(ServicePtrs[snum_template]->szService,
4781
Globals.szUsershareTemplateShare)) {
4786
if (snum_template == -1) {
4787
DEBUG(0,("load_usershare_shares: usershare template share %s "
4788
"does not exist.\n",
4789
Globals.szUsershareTemplateShare ));
4794
/* Mark all existing usershares as pending delete. */
4795
for (iService = iNumServices - 1; iService >= 0; iService--) {
4796
if (VALID(iService) && ServicePtrs[iService]->usershare) {
4797
ServicePtrs[iService]->usershare = USERSHARE_PENDING_DELETE;
4801
dp = sys_opendir(usersharepath);
4803
DEBUG(0,("load_usershare_shares:: failed to open directory %s. %s\n",
4804
usersharepath, strerror(errno) ));
4808
for (num_dir_entries = 0, num_bad_dir_entries = 0, num_tmp_dir_entries = 0;
4809
(de = sys_readdir(dp));
4810
num_dir_entries++ ) {
4812
const char *n = de->d_name;
4814
/* Ignore . and .. */
4816
if ((n[1] == '\0') || (n[1] == '.' && n[2] == '\0')) {
4822
/* Temporary file used when creating a share. */
4823
num_tmp_dir_entries++;
4826
/* Allow 20% tmp entries. */
4827
if (num_tmp_dir_entries > allowed_tmp_entries) {
4828
DEBUG(0,("load_usershare_shares: too many temp entries (%u) "
4829
"in directory %s\n",
4830
num_tmp_dir_entries, usersharepath));
4834
r = process_usershare_file(usersharepath, n, snum_template);
4836
/* Update the services count. */
4838
if (num_usershares >= max_user_shares) {
4839
DEBUG(0,("load_usershare_shares: max user shares reached "
4840
"on file %s in directory %s\n",
4841
n, usersharepath ));
4844
} else if (r == -1) {
4845
num_bad_dir_entries++;
4848
/* Allow 20% bad entries. */
4849
if (num_bad_dir_entries > allowed_bad_entries) {
4850
DEBUG(0,("load_usershare_shares: too many bad entries (%u) "
4851
"in directory %s\n",
4852
num_bad_dir_entries, usersharepath));
4856
/* Allow 20% bad entries. */
4857
if (num_dir_entries > max_user_shares + allowed_bad_entries) {
4858
DEBUG(0,("load_usershare_shares: too many total entries (%u) "
4859
"in directory %s\n",
4860
num_dir_entries, usersharepath));
4867
/* Sweep through and delete any non-refreshed usershares that are
4868
not currently in use. */
4869
for (iService = iNumServices - 1; iService >= 0; iService--) {
4870
if (VALID(iService) && (ServicePtrs[iService]->usershare == USERSHARE_PENDING_DELETE)) {
4871
if (conn_snum_used(iService)) {
4874
/* Remove from the share ACL db. */
4875
DEBUG(10,("load_usershare_shares: Removing deleted usershare %s\n",
4876
lp_servicename(iService) ));
4877
delete_share_security(iService);
4878
free_service_byindex(iService);
4882
return lp_numservices();
4885
/********************************************************
4886
Destroy global resources allocated in this file
4887
********************************************************/
4889
void gfree_loadparm(void)
4891
struct file_lists *f;
4892
struct file_lists *next;
4897
/* Free the file lists */
4902
SAFE_FREE( f->name );
4903
SAFE_FREE( f->subfname );
4908
/* Free resources allocated to services */
4910
for ( i = 0; i < iNumServices; i++ ) {
4912
free_service_byindex(i);
4916
SAFE_FREE( ServicePtrs );
4919
/* Now release all resources allocated to global
4920
parameters and the default service */
4922
for (i = 0; parm_table[i].label; i++)
4924
if ( parm_table[i].type == P_STRING
4925
|| parm_table[i].type == P_USTRING )
4927
string_free( (char**)parm_table[i].ptr );
4929
else if (parm_table[i].type == P_LIST) {
4930
str_list_free( (char***)parm_table[i].ptr );
4935
/***************************************************************************
4936
Load the services array from the services file. Return True on success,
4938
***************************************************************************/
4940
BOOL lp_load(const char *pszFname,
4944
BOOL initialize_globals)
4948
param_opt_struct *data, *pdata;
4950
pstrcpy(n2, pszFname);
4952
standard_sub_basic( get_current_username(), current_user_info.domain,
4955
add_to_file_list(pszFname, n2);
4959
DEBUG(3, ("lp_load: refreshing parameters\n"));
4961
bInGlobalSection = True;
4962
bGlobalOnly = global_only;
4964
init_globals(! initialize_globals);
4967
if (save_defaults) {
4972
if (Globals.param_opt != NULL) {
4973
data = Globals.param_opt;
4975
string_free(&data->key);
4976
string_free(&data->value);
4977
str_list_free(&data->list);
4982
Globals.param_opt = NULL;
4985
/* We get sections first, so have to start 'behind' to make up */
4987
bRetval = pm_process(n2, do_section, do_parameter);
4989
/* finish up the last section */
4990
DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
4992
if (iServiceIndex >= 0)
4993
bRetval = service_ok(iServiceIndex);
4995
lp_add_auto_services(lp_auto_services());
4998
/* When 'restrict anonymous = 2' guest connections to ipc$
5000
lp_add_ipc("IPC$", (lp_restrict_anonymous() < 2));
5001
if ( lp_enable_asu_support() )
5002
lp_add_ipc("ADMIN$", False);
5006
set_default_server_announce_type();
5007
set_allowed_client_auth();
5011
/* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
5012
/* if bWINSsupport is true and we are in the client */
5013
if (in_client && Globals.bWINSsupport) {
5014
lp_do_parameter(GLOBAL_SECTION_SNUM, "wins server", "127.0.0.1");
5022
/***************************************************************************
5023
Reset the max number of services.
5024
***************************************************************************/
5026
void lp_resetnumservices(void)
5031
/***************************************************************************
5032
Return the max number of services.
5033
***************************************************************************/
5035
int lp_numservices(void)
5037
return (iNumServices);
5040
/***************************************************************************
5041
Display the contents of the services array in human-readable form.
5042
***************************************************************************/
5044
void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
5049
defaults_saved = False;
5053
dump_a_service(&sDefault, f);
5055
for (iService = 0; iService < maxtoprint; iService++) {
5057
lp_dump_one(f, show_defaults, iService);
5061
/***************************************************************************
5062
Display the contents of one service in human-readable form.
5063
***************************************************************************/
5065
void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
5068
if (ServicePtrs[snum]->szService[0] == '\0')
5070
dump_a_service(ServicePtrs[snum], f);
5074
/***************************************************************************
5075
Return the number of the service with the given name, or -1 if it doesn't
5076
exist. Note that this is a DIFFERENT ANIMAL from the internal function
5077
getservicebyname()! This works ONLY if all services have been loaded, and
5078
does not copy the found service.
5079
***************************************************************************/
5081
int lp_servicenumber(const char *pszServiceName)
5084
fstring serviceName;
5086
if (!pszServiceName) {
5087
return GLOBAL_SECTION_SNUM;
5090
for (iService = iNumServices - 1; iService >= 0; iService--) {
5091
if (VALID(iService) && ServicePtrs[iService]->szService) {
5093
* The substitution here is used to support %U is
5096
fstrcpy(serviceName, ServicePtrs[iService]->szService);
5097
standard_sub_basic(get_current_username(),
5098
current_user_info.domain,
5099
serviceName,sizeof(serviceName));
5100
if (strequal(serviceName, pszServiceName)) {
5106
if (iService >= 0 && ServicePtrs[iService]->usershare == USERSHARE_VALID) {
5109
if (!usershare_exists(iService, &last_mod)) {
5110
/* Remove the share security tdb entry for it. */
5111
delete_share_security(iService);
5112
/* Remove it from the array. */
5113
free_service_byindex(iService);
5114
/* Doesn't exist anymore. */
5115
return GLOBAL_SECTION_SNUM;
5118
/* Has it been modified ? If so delete and reload. */
5119
if (ServicePtrs[iService]->usershare_last_mod < last_mod) {
5120
/* Remove it from the array. */
5121
free_service_byindex(iService);
5122
/* and now reload it. */
5123
iService = load_usershare_service(pszServiceName);
5128
DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
5129
return GLOBAL_SECTION_SNUM;
5135
BOOL share_defined(const char *service_name)
5137
return (lp_servicenumber(service_name) != -1);
5140
/*******************************************************************
5141
A useful volume label function.
5142
********************************************************************/
5144
char *volume_label(int snum)
5146
char *ret = lp_volume(snum);
5148
return lp_servicename(snum);
5153
/*******************************************************************
5154
Set the server type we will announce as via nmbd.
5155
********************************************************************/
5157
static void set_default_server_announce_type(void)
5159
default_server_announce = 0;
5160
default_server_announce |= SV_TYPE_WORKSTATION;
5161
default_server_announce |= SV_TYPE_SERVER;
5162
default_server_announce |= SV_TYPE_SERVER_UNIX;
5164
/* note that the flag should be set only if we have a
5165
printer service but nmbd doesn't actually load the
5166
services so we can't tell --jerry */
5168
default_server_announce |= SV_TYPE_PRINTQ_SERVER;
5170
switch (lp_announce_as()) {
5171
case ANNOUNCE_AS_NT_SERVER:
5172
default_server_announce |= SV_TYPE_SERVER_NT;
5173
/* fall through... */
5174
case ANNOUNCE_AS_NT_WORKSTATION:
5175
default_server_announce |= SV_TYPE_NT;
5177
case ANNOUNCE_AS_WIN95:
5178
default_server_announce |= SV_TYPE_WIN95_PLUS;
5180
case ANNOUNCE_AS_WFW:
5181
default_server_announce |= SV_TYPE_WFW;
5187
switch (lp_server_role()) {
5188
case ROLE_DOMAIN_MEMBER:
5189
default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
5191
case ROLE_DOMAIN_PDC:
5192
default_server_announce |= SV_TYPE_DOMAIN_CTRL;
5194
case ROLE_DOMAIN_BDC:
5195
default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
5197
case ROLE_STANDALONE:
5201
if (lp_time_server())
5202
default_server_announce |= SV_TYPE_TIME_SOURCE;
5204
if (lp_host_msdfs())
5205
default_server_announce |= SV_TYPE_DFS_SERVER;
5208
/***********************************************************
5209
returns role of Samba server
5210
************************************************************/
5212
int lp_server_role(void)
5217
/***********************************************************
5218
If we are PDC then prefer us as DMB
5219
************************************************************/
5221
BOOL lp_domain_master(void)
5223
if (Globals.bDomainMaster == Auto)
5224
return (lp_server_role() == ROLE_DOMAIN_PDC);
5226
return Globals.bDomainMaster;
5229
/***********************************************************
5230
If we are DMB then prefer us as LMB
5231
************************************************************/
5233
BOOL lp_preferred_master(void)
5235
if (Globals.bPreferredMaster == Auto)
5236
return (lp_local_master() && lp_domain_master());
5238
return Globals.bPreferredMaster;
5241
/*******************************************************************
5243
********************************************************************/
5245
void lp_remove_service(int snum)
5247
ServicePtrs[snum]->valid = False;
5248
invalid_services[num_invalid_services++] = snum;
5251
/*******************************************************************
5253
********************************************************************/
5255
void lp_copy_service(int snum, const char *new_name)
5257
do_section(new_name);
5259
snum = lp_servicenumber(new_name);
5261
lp_do_parameter(snum, "copy", lp_servicename(snum));
5266
/*******************************************************************
5267
Get the default server type we will announce as via nmbd.
5268
********************************************************************/
5270
int lp_default_server_announce(void)
5272
return default_server_announce;
5275
/*******************************************************************
5276
Split the announce version into major and minor numbers.
5277
********************************************************************/
5279
int lp_major_announce_version(void)
5281
static BOOL got_major = False;
5282
static int major_version = DEFAULT_MAJOR_VERSION;
5287
return major_version;
5290
if ((vers = lp_announce_version()) == NULL)
5291
return major_version;
5293
if ((p = strchr_m(vers, '.')) == 0)
5294
return major_version;
5297
major_version = atoi(vers);
5298
return major_version;
5301
int lp_minor_announce_version(void)
5303
static BOOL got_minor = False;
5304
static int minor_version = DEFAULT_MINOR_VERSION;
5309
return minor_version;
5312
if ((vers = lp_announce_version()) == NULL)
5313
return minor_version;
5315
if ((p = strchr_m(vers, '.')) == 0)
5316
return minor_version;
5319
minor_version = atoi(p);
5320
return minor_version;
5323
/***********************************************************
5324
Set the global name resolution order (used in smbclient).
5325
************************************************************/
5327
void lp_set_name_resolve_order(const char *new_order)
5329
string_set(&Globals.szNameResolveOrder, new_order);
5332
const char *lp_printername(int snum)
5334
const char *ret = _lp_printername(snum);
5335
if (ret == NULL || (ret != NULL && *ret == '\0'))
5336
ret = lp_const_servicename(snum);
5342
/***********************************************************
5343
Allow daemons such as winbindd to fix their logfile name.
5344
************************************************************/
5346
void lp_set_logfile(const char *name)
5348
string_set(&Globals.szLogFile, name);
5349
pstrcpy(debugf, name);
5352
/*******************************************************************
5353
Return the max print jobs per queue.
5354
********************************************************************/
5356
int lp_maxprintjobs(int snum)
5358
int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
5359
if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
5360
maxjobs = PRINT_MAX_JOBID - 1;
5365
const char *lp_printcapname(void)
5367
if ((Globals.szPrintcapname != NULL) &&
5368
(Globals.szPrintcapname[0] != '\0'))
5369
return Globals.szPrintcapname;
5371
if (sDefault.iPrinting == PRINT_CUPS) {
5379
if (sDefault.iPrinting == PRINT_BSD)
5380
return "/etc/printcap";
5382
return PRINTCAP_NAME;
5385
/*******************************************************************
5386
Ensure we don't use sendfile if server smb signing is active.
5387
********************************************************************/
5389
static uint32 spoolss_state;
5391
BOOL lp_disable_spoolss( void )
5393
if ( spoolss_state == SVCCTL_STATE_UNKNOWN )
5394
spoolss_state = _lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
5396
return spoolss_state == SVCCTL_STOPPED ? True : False;
5399
void lp_set_spoolss_state( uint32 state )
5401
SMB_ASSERT( (state == SVCCTL_STOPPED) || (state == SVCCTL_RUNNING) );
5403
spoolss_state = state;
5406
uint32 lp_get_spoolss_state( void )
5408
return lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
5411
/*******************************************************************
5412
Ensure we don't use sendfile if server smb signing is active.
5413
********************************************************************/
5415
BOOL lp_use_sendfile(int snum)
5417
/* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
5418
if (Protocol < PROTOCOL_NT1) {
5421
return (_lp_use_sendfile(snum) && (get_remote_arch() != RA_WIN95) && !srv_is_signing_active());
5424
/*******************************************************************
5425
Turn off sendfile if we find the underlying OS doesn't support it.
5426
********************************************************************/
5428
void set_use_sendfile(int snum, BOOL val)
5430
if (LP_SNUM_OK(snum))
5431
ServicePtrs[snum]->bUseSendfile = val;
5433
sDefault.bUseSendfile = val;
5436
/*******************************************************************
5437
Turn off storing DOS attributes if this share doesn't support it.
5438
********************************************************************/
5440
void set_store_dos_attributes(int snum, BOOL val)
5442
if (!LP_SNUM_OK(snum))
5444
ServicePtrs[(snum)]->bStoreDosAttributes = val;
5447
void lp_set_mangling_method(const char *new_method)
5449
string_set(&Globals.szManglingMethod, new_method);
5452
/*******************************************************************
5453
Global state for POSIX pathname processing.
5454
********************************************************************/
5456
static BOOL posix_pathnames;
5458
BOOL lp_posix_pathnames(void)
5460
return posix_pathnames;
5463
/*******************************************************************
5464
Change everything needed to ensure POSIX pathname processing (currently
5466
********************************************************************/
5468
void lp_set_posix_pathnames(void)
5470
posix_pathnames = True;
5473
/*******************************************************************
5474
Global state for POSIX lock processing - CIFS unix extensions.
5475
********************************************************************/
5477
static enum brl_flavour posix_cifsx_locktype; /* By default 0 == WINDOWS_LOCK */
5479
enum brl_flavour lp_posix_cifsu_locktype(void)
5481
return posix_cifsx_locktype;
5484
/*******************************************************************
5485
********************************************************************/
5487
void lp_set_posix_cifsx_locktype(enum brl_flavour val)
5489
posix_cifsx_locktype = val;