call libnet_conf_get_seqnum() just once and fix compiler warnings
[gd/samba/.git] / source / param / loadparm.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Parameter loading functions
4    Copyright (C) Karl Auer 1993-1998
5
6    Largely re-written by Andrew Tridgell, September 1994
7
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
12    Copyright (C) Michael Adam 2008
13    
14    This program is free software; you can redistribute it and/or modify
15    it under the terms of the GNU General Public License as published by
16    the Free Software Foundation; either version 3 of the License, or
17    (at your option) any later version.
18    
19    This program is distributed in the hope that it will be useful,
20    but WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22    GNU General Public License for more details.
23    
24    You should have received a copy of the GNU General Public License
25    along with this program.  If not, see <http://www.gnu.org/licenses/>.
26 */
27
28 /*
29  *  Load parameters.
30  *
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.
34  *
35  * To add a parameter:
36  *
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
42  *  
43  *
44  * Notes:
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
50  *   careful!
51  *
52  */
53
54 #include "includes.h"
55 #include "libnet/libnet.h"
56
57 bool in_client = False;         /* Not in the client by default */
58 bool bLoaded = False;
59
60 extern enum protocol_types Protocol;
61 extern userdom_struct current_user_info;
62
63 #ifndef GLOBAL_NAME
64 #define GLOBAL_NAME "global"
65 #endif
66
67 #ifndef PRINTERS_NAME
68 #define PRINTERS_NAME "printers"
69 #endif
70
71 #ifndef HOMES_NAME
72 #define HOMES_NAME "homes"
73 #endif
74
75 static uint64_t conf_last_seqnum = 0;
76 static struct libnet_conf_ctx *conf_ctx = NULL;
77
78 #define CONFIG_BACKEND_FILE 0
79 #define CONFIG_BACKEND_REGISTRY 1
80
81 static int config_backend = CONFIG_BACKEND_FILE;
82
83 /* some helpful bits */
84 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
85 #define VALID(i) (ServicePtrs != NULL && ServicePtrs[i]->valid)
86
87 #define USERSHARE_VALID 1
88 #define USERSHARE_PENDING_DELETE 2
89
90 extern int extra_time_offset;
91
92 static bool defaults_saved = False;
93
94 typedef struct _param_opt_struct param_opt_struct;
95 struct _param_opt_struct {
96         param_opt_struct *prev, *next;
97         char *key;
98         char *value;
99         char **list;
100 };
101
102 /* 
103  * This structure describes global (ie., server-wide) parameters.
104  */
105 typedef struct {
106         int ConfigBackend;
107         char *smb_ports;
108         char *dos_charset;
109         char *unix_charset;
110         char *display_charset;
111         char *szPrintcapname;
112         char *szAddPortCommand;
113         char *szEnumPortsCommand;
114         char *szAddPrinterCommand;
115         char *szDeletePrinterCommand;
116         char *szOs2DriverMap;
117         char *szLockDir;
118         char *szPidDir;
119         char *szRootdir;
120         char *szDefaultService;
121         char *szGetQuota;
122         char *szSetQuota;
123         char *szMsgCommand;
124         char *szServerString;
125         char *szAutoServices;
126         char *szPasswdProgram;
127         char *szPasswdChat;
128         char *szLogFile;
129         char *szConfigFile;
130         char *szSMBPasswdFile;
131         char *szPrivateDir;
132         char *szPassdbBackend;
133         char **szPreloadModules;
134         char *szPasswordServer;
135         char *szSocketOptions;
136         char *szRealm;
137         char *szAfsUsernameMap;
138         int iAfsTokenLifetime;
139         char *szLogNtTokenCommand;
140         char *szUsernameMap;
141         char *szLogonScript;
142         char *szLogonPath;
143         char *szLogonDrive;
144         char *szLogonHome;
145         char **szWINSservers;
146         char **szInterfaces;
147         char *szRemoteAnnounce;
148         char *szRemoteBrowseSync;
149         char *szSocketAddress;
150         char *szNISHomeMapName;
151         char *szAnnounceVersion;        /* This is initialised in init_globals */
152         char *szWorkgroup;
153         char *szNetbiosName;
154         char **szNetbiosAliases;
155         char *szNetbiosScope;
156         char *szNameResolveOrder;
157         char *szPanicAction;
158         char *szAddUserScript;
159         char *szRenameUserScript;
160         char *szDelUserScript;
161         char *szAddGroupScript;
162         char *szDelGroupScript;
163         char *szAddUserToGroupScript;
164         char *szDelUserFromGroupScript;
165         char *szSetPrimaryGroupScript;
166         char *szAddMachineScript;
167         char *szShutdownScript;
168         char *szAbortShutdownScript;
169         char *szUsernameMapScript;
170         char *szCheckPasswordScript;
171         char *szWINSHook;
172         char *szUtmpDir;
173         char *szWtmpDir;
174         bool bUtmp;
175         char *szIdmapUID;
176         char *szIdmapGID;
177         bool bPassdbExpandExplicit;
178         int AlgorithmicRidBase;
179         char *szTemplateHomedir;
180         char *szTemplateShell;
181         char *szWinbindSeparator;
182         bool bWinbindEnumUsers;
183         bool bWinbindEnumGroups;
184         bool bWinbindUseDefaultDomain;
185         bool bWinbindTrustedDomainsOnly;
186         bool bWinbindNestedGroups;
187         int  winbind_expand_groups;
188         bool bWinbindRefreshTickets;
189         bool bWinbindOfflineLogon;
190         bool bWinbindNormalizeNames;
191         bool bWinbindRpcOnly;
192         char **szIdmapDomains;
193         char **szIdmapBackend; /* deprecated */
194         char *szIdmapAllocBackend;
195         char *szAddShareCommand;
196         char *szChangeShareCommand;
197         char *szDeleteShareCommand;
198         char **szEventLogs;
199         char *szGuestaccount;
200         char *szManglingMethod;
201         char **szServicesList;
202         char *szUsersharePath;
203         char *szUsershareTemplateShare;
204         char **szUsersharePrefixAllowList;
205         char **szUsersharePrefixDenyList;
206         int mangle_prefix;
207         int max_log_size;
208         char *szLogLevel;
209         int max_xmit;
210         int max_mux;
211         int max_open_files;
212         int open_files_db_hash_size;
213         int pwordlevel;
214         int unamelevel;
215         int deadtime;
216         bool getwd_cache;
217         int maxprotocol;
218         int minprotocol;
219         int security;
220         char **AuthMethods;
221         bool paranoid_server_security;
222         int maxdisksize;
223         int lpqcachetime;
224         int iMaxSmbdProcesses;
225         bool bDisableSpoolss;
226         int syslog;
227         int os_level;
228         bool enhanced_browsing;
229         int max_ttl;
230         int max_wins_ttl;
231         int min_wins_ttl;
232         int lm_announce;
233         int lm_interval;
234         int announce_as;        /* This is initialised in init_globals */
235         int machine_password_timeout;
236         int map_to_guest;
237         int oplock_break_wait_time;
238         int winbind_cache_time;
239         int winbind_max_idle_children;
240         char **szWinbindNssInfo;
241         int iLockSpinTime;
242         char *szLdapMachineSuffix;
243         char *szLdapUserSuffix;
244         char *szLdapIdmapSuffix;
245         char *szLdapGroupSuffix;
246         int ldap_ssl;
247         char *szLdapSuffix;
248         char *szLdapAdminDn;
249         int ldap_debug_level;
250         int ldap_debug_threshold;
251         int iAclCompat;
252         char *szCupsServer;
253         char *szIPrintServer;
254         char *ctdbdSocket;
255         char **szClusterAddresses;
256         bool clustering;
257         int ldap_passwd_sync;
258         int ldap_replication_sleep;
259         int ldap_timeout; /* This is initialised in init_globals */
260         int ldap_page_size;
261         bool ldap_delete_dn;
262         bool bMsAddPrinterWizard;
263         bool bDNSproxy;
264         bool bWINSsupport;
265         bool bWINSproxy;
266         bool bLocalMaster;
267         int  iPreferredMaster;
268         int iDomainMaster;
269         bool bDomainLogons;
270         bool bEncryptPasswords;
271         bool bUpdateEncrypt;
272         int  clientSchannel;
273         int  serverSchannel;
274         bool bNullPasswords;
275         bool bObeyPamRestrictions;
276         bool bLoadPrinters;
277         int PrintcapCacheTime;
278         bool bLargeReadwrite;
279         bool bReadRaw;
280         bool bWriteRaw;
281         bool bSyslogOnly;
282         bool bBrowseList;
283         bool bNISHomeMap;
284         bool bTimeServer;
285         bool bBindInterfacesOnly;
286         bool bPamPasswordChange;
287         bool bUnixPasswdSync;
288         bool bPasswdChatDebug;
289         int iPasswdChatTimeout;
290         bool bTimestampLogs;
291         bool bNTSmbSupport;
292         bool bNTPipeSupport;
293         bool bNTStatusSupport;
294         bool bStatCache;
295         int iMaxStatCacheSize;
296         bool bKernelOplocks;
297         bool bAllowTrustedDomains;
298         bool bLanmanAuth;
299         bool bNTLMAuth;
300         bool bUseSpnego;
301         bool bClientLanManAuth;
302         bool bClientNTLMv2Auth;
303         bool bClientPlaintextAuth;
304         bool bClientUseSpnego;
305         bool bDebugPrefixTimestamp;
306         bool bDebugHiresTimestamp;
307         bool bDebugPid;
308         bool bDebugUid;
309         bool bDebugClass;
310         bool bEnableCoreFiles;
311         bool bHostMSDfs;
312         bool bUseMmap;
313         bool bHostnameLookups;
314         bool bUnixExtensions;
315         bool bDisableNetbios;
316         bool bUseKerberosKeytab;
317         bool bDeferSharingViolations;
318         bool bEnablePrivileges;
319         bool bASUSupport;
320         bool bUsershareOwnerOnly;
321         bool bUsershareAllowGuests;
322         bool bRegistryShares;
323         int restrict_anonymous;
324         int name_cache_timeout;
325         int client_signing;
326         int server_signing;
327         int client_ldap_sasl_wrapping;
328         int iUsershareMaxShares;
329         int iIdmapCacheTime;
330         int iIdmapNegativeCacheTime;
331
332         bool bResetOnZeroVC;
333         int iKeepalive;
334         int iminreceivefile;
335         param_opt_struct *param_opt;
336 } global;
337
338 static global Globals;
339
340 /* 
341  * This structure describes a single service. 
342  */
343 typedef struct {
344         bool valid;
345         bool autoloaded;
346         int usershare;
347         time_t usershare_last_mod;
348         char *szService;
349         char *szPath;
350         char *szUsername;
351         char **szInvalidUsers;
352         char **szValidUsers;
353         char **szAdminUsers;
354         char *szCopy;
355         char *szInclude;
356         char *szPreExec;
357         char *szPostExec;
358         char *szRootPreExec;
359         char *szRootPostExec;
360         char *szCupsOptions;
361         char *szPrintcommand;
362         char *szLpqcommand;
363         char *szLprmcommand;
364         char *szLppausecommand;
365         char *szLpresumecommand;
366         char *szQueuepausecommand;
367         char *szQueueresumecommand;
368         char *szPrintername;
369         char *szPrintjobUsername;
370         char *szDontdescend;
371         char **szHostsallow;
372         char **szHostsdeny;
373         char *szMagicScript;
374         char *szMagicOutput;
375         char *szVetoFiles;
376         char *szHideFiles;
377         char *szVetoOplockFiles;
378         char *comment;
379         char *force_user;
380         char *force_group;
381         char **readlist;
382         char **writelist;
383         char **printer_admin;
384         char *volume;
385         char *fstype;
386         char **szVfsObjects;
387         char *szMSDfsProxy;
388         char *szAioWriteBehind;
389         char *szDfree;
390         int iMinPrintSpace;
391         int iMaxPrintJobs;
392         int iMaxReportedPrintJobs;
393         int iWriteCacheSize;
394         int iCreate_mask;
395         int iCreate_force_mode;
396         int iSecurity_mask;
397         int iSecurity_force_mode;
398         int iDir_mask;
399         int iDir_force_mode;
400         int iDir_Security_mask;
401         int iDir_Security_force_mode;
402         int iMaxConnections;
403         int iDefaultCase;
404         int iPrinting;
405         int iOplockContentionLimit;
406         int iCSCPolicy;
407         int iBlock_size;
408         int iDfreeCacheTime;
409         bool bPreexecClose;
410         bool bRootpreexecClose;
411         int  iCaseSensitive;
412         bool bCasePreserve;
413         bool bShortCasePreserve;
414         bool bHideDotFiles;
415         bool bHideSpecialFiles;
416         bool bHideUnReadable;
417         bool bHideUnWriteableFiles;
418         bool bBrowseable;
419         bool bAvailable;
420         bool bRead_only;
421         bool bNo_set_dir;
422         bool bGuest_only;
423         bool bHidden;
424         bool bGuest_ok;
425         bool bPrint_ok;
426         bool bMap_system;
427         bool bMap_hidden;
428         bool bMap_archive;
429         bool bStoreDosAttributes;
430         bool bDmapiSupport;
431         bool bLocking;
432         int iStrictLocking;
433         bool bPosixLocking;
434         bool bShareModes;
435         bool bOpLocks;
436         bool bLevel2OpLocks;
437         bool bOnlyUser;
438         bool bMangledNames;
439         bool bWidelinks;
440         bool bSymlinks;
441         bool bSyncAlways;
442         bool bStrictAllocate;
443         bool bStrictSync;
444         char magic_char;
445         struct bitmap *copymap;
446         bool bDeleteReadonly;
447         bool bFakeOplocks;
448         bool bDeleteVetoFiles;
449         bool bDosFilemode;
450         bool bDosFiletimes;
451         bool bDosFiletimeResolution;
452         bool bFakeDirCreateTimes;
453         bool bBlockingLocks;
454         bool bInheritPerms;
455         bool bInheritACLS;
456         bool bInheritOwner;
457         bool bMSDfsRoot;
458         bool bUseClientDriver;
459         bool bDefaultDevmode;
460         bool bForcePrintername;
461         bool bNTAclSupport;
462         bool bForceUnknownAclUser;
463         bool bUseSendfile;
464         bool bProfileAcls;
465         bool bMap_acl_inherit;
466         bool bAfs_Share;
467         bool bEASupport;
468         bool bAclCheckPermissions;
469         bool bAclMapFullControl;
470         bool bAclGroupControl;
471         bool bChangeNotify;
472         bool bKernelChangeNotify;
473         int iallocation_roundup_size;
474         int iAioReadSize;
475         int iAioWriteSize;
476         int iMap_readonly;
477         int iDirectoryNameCacheSize;
478         int ismb_encrypt;
479         param_opt_struct *param_opt;
480
481         char dummy[3];          /* for alignment */
482 } service;
483
484
485 /* This is a default service used to prime a services structure */
486 static service sDefault = {
487         True,                   /* valid */
488         False,                  /* not autoloaded */
489         0,                      /* not a usershare */
490         (time_t)0,              /* No last mod time */
491         NULL,                   /* szService */
492         NULL,                   /* szPath */
493         NULL,                   /* szUsername */
494         NULL,                   /* szInvalidUsers */
495         NULL,                   /* szValidUsers */
496         NULL,                   /* szAdminUsers */
497         NULL,                   /* szCopy */
498         NULL,                   /* szInclude */
499         NULL,                   /* szPreExec */
500         NULL,                   /* szPostExec */
501         NULL,                   /* szRootPreExec */
502         NULL,                   /* szRootPostExec */
503         NULL,                   /* szCupsOptions */
504         NULL,                   /* szPrintcommand */
505         NULL,                   /* szLpqcommand */
506         NULL,                   /* szLprmcommand */
507         NULL,                   /* szLppausecommand */
508         NULL,                   /* szLpresumecommand */
509         NULL,                   /* szQueuepausecommand */
510         NULL,                   /* szQueueresumecommand */
511         NULL,                   /* szPrintername */
512         NULL,                   /* szPrintjobUsername */
513         NULL,                   /* szDontdescend */
514         NULL,                   /* szHostsallow */
515         NULL,                   /* szHostsdeny */
516         NULL,                   /* szMagicScript */
517         NULL,                   /* szMagicOutput */
518         NULL,                   /* szVetoFiles */
519         NULL,                   /* szHideFiles */
520         NULL,                   /* szVetoOplockFiles */
521         NULL,                   /* comment */
522         NULL,                   /* force user */
523         NULL,                   /* force group */
524         NULL,                   /* readlist */
525         NULL,                   /* writelist */
526         NULL,                   /* printer admin */
527         NULL,                   /* volume */
528         NULL,                   /* fstype */
529         NULL,                   /* vfs objects */
530         NULL,                   /* szMSDfsProxy */
531         NULL,                   /* szAioWriteBehind */
532         NULL,                   /* szDfree */
533         0,                      /* iMinPrintSpace */
534         1000,                   /* iMaxPrintJobs */
535         0,                      /* iMaxReportedPrintJobs */
536         0,                      /* iWriteCacheSize */
537         0744,                   /* iCreate_mask */
538         0000,                   /* iCreate_force_mode */
539         0777,                   /* iSecurity_mask */
540         0,                      /* iSecurity_force_mode */
541         0755,                   /* iDir_mask */
542         0000,                   /* iDir_force_mode */
543         0777,                   /* iDir_Security_mask */
544         0,                      /* iDir_Security_force_mode */
545         0,                      /* iMaxConnections */
546         CASE_LOWER,             /* iDefaultCase */
547         DEFAULT_PRINTING,       /* iPrinting */
548         2,                      /* iOplockContentionLimit */
549         0,                      /* iCSCPolicy */
550         1024,                   /* iBlock_size */
551         0,                      /* iDfreeCacheTime */
552         False,                  /* bPreexecClose */
553         False,                  /* bRootpreexecClose */
554         Auto,                   /* case sensitive */
555         True,                   /* case preserve */
556         True,                   /* short case preserve */
557         True,                   /* bHideDotFiles */
558         False,                  /* bHideSpecialFiles */
559         False,                  /* bHideUnReadable */
560         False,                  /* bHideUnWriteableFiles */
561         True,                   /* bBrowseable */
562         True,                   /* bAvailable */
563         True,                   /* bRead_only */
564         True,                   /* bNo_set_dir */
565         False,                  /* bGuest_only */
566         False,                  /* bHidden */
567         False,                  /* bGuest_ok */
568         False,                  /* bPrint_ok */
569         False,                  /* bMap_system */
570         False,                  /* bMap_hidden */
571         True,                   /* bMap_archive */
572         False,                  /* bStoreDosAttributes */
573         False,                  /* bDmapiSupport */
574         True,                   /* bLocking */
575         Auto,                   /* iStrictLocking */
576         True,                   /* bPosixLocking */
577         True,                   /* bShareModes */
578         True,                   /* bOpLocks */
579         True,                   /* bLevel2OpLocks */
580         False,                  /* bOnlyUser */
581         True,                   /* bMangledNames */
582         True,                   /* bWidelinks */
583         True,                   /* bSymlinks */
584         False,                  /* bSyncAlways */
585         False,                  /* bStrictAllocate */
586         False,                  /* bStrictSync */
587         '~',                    /* magic char */
588         NULL,                   /* copymap */
589         False,                  /* bDeleteReadonly */
590         False,                  /* bFakeOplocks */
591         False,                  /* bDeleteVetoFiles */
592         False,                  /* bDosFilemode */
593         True,                   /* bDosFiletimes */
594         False,                  /* bDosFiletimeResolution */
595         False,                  /* bFakeDirCreateTimes */
596         True,                   /* bBlockingLocks */
597         False,                  /* bInheritPerms */
598         False,                  /* bInheritACLS */
599         False,                  /* bInheritOwner */
600         False,                  /* bMSDfsRoot */
601         False,                  /* bUseClientDriver */
602         True,                   /* bDefaultDevmode */
603         False,                  /* bForcePrintername */
604         True,                   /* bNTAclSupport */
605         False,                  /* bForceUnknownAclUser */
606         False,                  /* bUseSendfile */
607         False,                  /* bProfileAcls */
608         False,                  /* bMap_acl_inherit */
609         False,                  /* bAfs_Share */
610         False,                  /* bEASupport */
611         True,                   /* bAclCheckPermissions */
612         True,                   /* bAclMapFullControl */
613         False,                  /* bAclGroupControl */
614         True,                   /* bChangeNotify */
615         True,                   /* bKernelChangeNotify */
616         SMB_ROUNDUP_ALLOCATION_SIZE,            /* iallocation_roundup_size */
617         0,                      /* iAioReadSize */
618         0,                      /* iAioWriteSize */
619         MAP_READONLY_YES,       /* iMap_readonly */
620 #ifdef BROKEN_DIRECTORY_HANDLING
621         0,                      /* iDirectoryNameCacheSize */
622 #else
623         100,                    /* iDirectoryNameCacheSize */
624 #endif
625         Auto,                   /* ismb_encrypt */
626         NULL,                   /* Parametric options */
627
628         ""                      /* dummy */
629 };
630
631 /* local variables */
632 static service **ServicePtrs = NULL;
633 static int iNumServices = 0;
634 static int iServiceIndex = 0;
635 static struct db_context *ServiceHash;
636 static int *invalid_services = NULL;
637 static int num_invalid_services = 0;
638 static bool bInGlobalSection = True;
639 static bool bGlobalOnly = False;
640 static int server_role;
641 static int default_server_announce;
642
643 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
644
645 /* prototypes for the special type handlers */
646 static bool handle_include( int snum, const char *pszParmValue, char **ptr);
647 static bool handle_copy( int snum, const char *pszParmValue, char **ptr);
648 static bool handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
649 static bool handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
650 static bool handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
651 static bool handle_debug_list( int snum, const char *pszParmValue, char **ptr );
652 static bool handle_workgroup( int snum, const char *pszParmValue, char **ptr );
653 static bool handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
654 static bool handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
655 static bool handle_charset( int snum, const char *pszParmValue, char **ptr );
656 static bool handle_printing( int snum, const char *pszParmValue, char **ptr);
657 static bool handle_ldap_debug_level( int snum, const char *pszParmValue, char **ptr);
658
659 static void set_server_role(void);
660 static void set_default_server_announce_type(void);
661 static void set_allowed_client_auth(void);
662
663 static const struct enum_list enum_protocol[] = {
664         {PROTOCOL_NT1, "NT1"},
665         {PROTOCOL_LANMAN2, "LANMAN2"},
666         {PROTOCOL_LANMAN1, "LANMAN1"},
667         {PROTOCOL_CORE, "CORE"},
668         {PROTOCOL_COREPLUS, "COREPLUS"},
669         {PROTOCOL_COREPLUS, "CORE+"},
670         {-1, NULL}
671 };
672
673 static const struct enum_list enum_security[] = {
674         {SEC_SHARE, "SHARE"},
675         {SEC_USER, "USER"},
676         {SEC_SERVER, "SERVER"},
677         {SEC_DOMAIN, "DOMAIN"},
678 #ifdef HAVE_ADS
679         {SEC_ADS, "ADS"},
680 #endif
681         {-1, NULL}
682 };
683
684 static const struct enum_list enum_printing[] = {
685         {PRINT_SYSV, "sysv"},
686         {PRINT_AIX, "aix"},
687         {PRINT_HPUX, "hpux"},
688         {PRINT_BSD, "bsd"},
689         {PRINT_QNX, "qnx"},
690         {PRINT_PLP, "plp"},
691         {PRINT_LPRNG, "lprng"},
692         {PRINT_CUPS, "cups"},
693         {PRINT_IPRINT, "iprint"},
694         {PRINT_LPRNT, "nt"},
695         {PRINT_LPROS2, "os2"},
696 #ifdef DEVELOPER
697         {PRINT_TEST, "test"},
698         {PRINT_VLP, "vlp"},
699 #endif /* DEVELOPER */
700         {-1, NULL}
701 };
702
703 static const struct enum_list enum_ldap_sasl_wrapping[] = {
704         {0, "plain"},
705         {ADS_AUTH_SASL_SIGN, "sign"},
706         {ADS_AUTH_SASL_SEAL, "seal"},
707         {-1, NULL}
708 };
709
710 static const struct enum_list enum_ldap_ssl[] = {
711         {LDAP_SSL_OFF, "no"},
712         {LDAP_SSL_OFF, "No"},
713         {LDAP_SSL_OFF, "off"},
714         {LDAP_SSL_OFF, "Off"},
715         {LDAP_SSL_START_TLS, "start tls"},
716         {LDAP_SSL_START_TLS, "Start_tls"},
717         {-1, NULL}
718 };
719
720 static const struct enum_list enum_ldap_passwd_sync[] = {
721         {LDAP_PASSWD_SYNC_OFF, "no"},
722         {LDAP_PASSWD_SYNC_OFF, "No"},
723         {LDAP_PASSWD_SYNC_OFF, "off"},
724         {LDAP_PASSWD_SYNC_OFF, "Off"},
725         {LDAP_PASSWD_SYNC_ON, "Yes"},
726         {LDAP_PASSWD_SYNC_ON, "yes"},
727         {LDAP_PASSWD_SYNC_ON, "on"},
728         {LDAP_PASSWD_SYNC_ON, "On"},
729         {LDAP_PASSWD_SYNC_ONLY, "Only"},
730         {LDAP_PASSWD_SYNC_ONLY, "only"},
731         {-1, NULL}
732 };
733
734 /* Types of machine we can announce as. */
735 #define ANNOUNCE_AS_NT_SERVER 1
736 #define ANNOUNCE_AS_WIN95 2
737 #define ANNOUNCE_AS_WFW 3
738 #define ANNOUNCE_AS_NT_WORKSTATION 4
739
740 static const struct enum_list enum_announce_as[] = {
741         {ANNOUNCE_AS_NT_SERVER, "NT"},
742         {ANNOUNCE_AS_NT_SERVER, "NT Server"},
743         {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
744         {ANNOUNCE_AS_WIN95, "win95"},
745         {ANNOUNCE_AS_WFW, "WfW"},
746         {-1, NULL}
747 };
748
749 static const struct enum_list enum_map_readonly[] = {
750         {MAP_READONLY_NO, "no"},
751         {MAP_READONLY_NO, "false"},
752         {MAP_READONLY_NO, "0"},
753         {MAP_READONLY_YES, "yes"},
754         {MAP_READONLY_YES, "true"},
755         {MAP_READONLY_YES, "1"},
756         {MAP_READONLY_PERMISSIONS, "permissions"},
757         {MAP_READONLY_PERMISSIONS, "perms"},
758         {-1, NULL}
759 };
760
761 static const struct enum_list enum_case[] = {
762         {CASE_LOWER, "lower"},
763         {CASE_UPPER, "upper"},
764         {-1, NULL}
765 };
766
767 static const struct enum_list enum_bool_auto[] = {
768         {False, "No"},
769         {False, "False"},
770         {False, "0"},
771         {True, "Yes"},
772         {True, "True"},
773         {True, "1"},
774         {Auto, "Auto"},
775         {-1, NULL}
776 };
777
778 /* Client-side offline caching policy types */
779 #define CSC_POLICY_MANUAL 0
780 #define CSC_POLICY_DOCUMENTS 1
781 #define CSC_POLICY_PROGRAMS 2
782 #define CSC_POLICY_DISABLE 3
783
784 static const struct enum_list enum_csc_policy[] = {
785         {CSC_POLICY_MANUAL, "manual"},
786         {CSC_POLICY_DOCUMENTS, "documents"},
787         {CSC_POLICY_PROGRAMS, "programs"},
788         {CSC_POLICY_DISABLE, "disable"},
789         {-1, NULL}
790 };
791
792 /* SMB signing types. */
793 static const struct enum_list enum_smb_signing_vals[] = {
794         {False, "No"},
795         {False, "False"},
796         {False, "0"},
797         {False, "Off"},
798         {False, "disabled"},
799         {True, "Yes"},
800         {True, "True"},
801         {True, "1"},
802         {True, "On"},
803         {True, "enabled"},
804         {Auto, "auto"},
805         {Required, "required"},
806         {Required, "mandatory"},
807         {Required, "force"},
808         {Required, "forced"},
809         {Required, "enforced"},
810         {-1, NULL}
811 };
812
813 /* ACL compatibility options. */
814 static const struct enum_list enum_acl_compat_vals[] = {
815     { ACL_COMPAT_AUTO, "auto" },
816     { ACL_COMPAT_WINNT, "winnt" },
817     { ACL_COMPAT_WIN2K, "win2k" },
818     { -1, NULL}
819 };
820
821 /* 
822    Do you want session setups at user level security with a invalid
823    password to be rejected or allowed in as guest? WinNT rejects them
824    but it can be a pain as it means "net view" needs to use a password
825
826    You have 3 choices in the setting of map_to_guest:
827
828    "Never" means session setups with an invalid password
829    are rejected. This is the default.
830
831    "Bad User" means session setups with an invalid password
832    are rejected, unless the username does not exist, in which case it
833    is treated as a guest login
834
835    "Bad Password" means session setups with an invalid password
836    are treated as a guest login
837
838    Note that map_to_guest only has an effect in user or server
839    level security.
840 */
841
842 static const struct enum_list enum_map_to_guest[] = {
843         {NEVER_MAP_TO_GUEST, "Never"},
844         {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
845         {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
846         {MAP_TO_GUEST_ON_BAD_UID, "Bad Uid"},
847         {-1, NULL}
848 };
849
850 /* Config backend options */
851
852 static const struct enum_list enum_config_backend[] = {
853         {CONFIG_BACKEND_FILE, "file"},
854         {CONFIG_BACKEND_REGISTRY, "registry"},
855         {-1, NULL}
856 };
857
858 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
859  *
860  * The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
861  * screen in SWAT. This is used to exclude parameters as well as to squash all
862  * parameters that have been duplicated by pseudonyms.
863  *
864  * NOTE: To display a parameter in BASIC view set FLAG_BASIC
865  *       Any parameter that does NOT have FLAG_ADVANCED will not disply at all
866  *       Set FLAG_SHARE and FLAG_PRINT to specifically display parameters in
867  *        respective views.
868  *
869  * NOTE2: Handling of duplicated (synonym) paramters:
870  *      Only the first occurance of a parameter should be enabled by FLAG_BASIC
871  *      and/or FLAG_ADVANCED. All duplicates following the first mention should be
872  *      set to FLAG_HIDE. ie: Make you must place the parameter that has the preferred
873  *      name first, and all synonyms must follow it with the FLAG_HIDE attribute.
874  */
875
876 static struct parm_struct parm_table[] = {
877         {N_("Base Options"), P_SEP, P_SEPARATOR}, 
878
879         {"dos charset", P_STRING, P_GLOBAL, &Globals.dos_charset, handle_charset, NULL, FLAG_ADVANCED}, 
880         {"unix charset", P_STRING, P_GLOBAL, &Globals.unix_charset, handle_charset, NULL, FLAG_ADVANCED}, 
881         {"display charset", P_STRING, P_GLOBAL, &Globals.display_charset, handle_charset, NULL, FLAG_ADVANCED}, 
882         {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
883         {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
884         {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_HIDE}, 
885         {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkgroup, handle_workgroup, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
886 #ifdef WITH_ADS
887         {"realm", P_USTRING, P_GLOBAL, &Globals.szRealm, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
888 #endif
889         {"netbios name", P_USTRING, P_GLOBAL, &Globals.szNetbiosName, handle_netbios_name, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
890         {"netbios aliases", P_LIST, P_GLOBAL, &Globals.szNetbiosAliases, handle_netbios_aliases,  NULL, FLAG_ADVANCED}, 
891         {"netbios scope", P_USTRING, P_GLOBAL, &Globals.szNetbiosScope, handle_netbios_scope,  NULL, FLAG_ADVANCED}, 
892         {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED }, 
893         {"interfaces", P_LIST, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
894         {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
895
896         {"config backend", P_ENUM, P_GLOBAL, &Globals.ConfigBackend, NULL, enum_config_backend, FLAG_ADVANCED},
897
898         {N_("Security Options"), P_SEP, P_SEPARATOR}, 
899
900         {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
901         {"auth methods", P_LIST, P_GLOBAL, &Globals.AuthMethods, NULL, NULL, FLAG_ADVANCED}, 
902         {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
903         {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_ADVANCED}, 
904         {"client schannel", P_ENUM, P_GLOBAL, &Globals.clientSchannel, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
905         {"server schannel", P_ENUM, P_GLOBAL, &Globals.serverSchannel, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
906         {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, FLAG_ADVANCED}, 
907         {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, FLAG_ADVANCED}, 
908         {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED}, 
909         {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED}, 
910         {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
911         {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED}, 
912         {"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED}, 
913         {"passdb backend", P_STRING, P_GLOBAL, &Globals.szPassdbBackend, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
914         {"algorithmic rid base", P_INTEGER, P_GLOBAL, &Globals.AlgorithmicRidBase, NULL, NULL, FLAG_ADVANCED}, 
915         {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_ADVANCED}, 
916         {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE}, 
917         {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE}, 
918         {"guest account", P_STRING, P_GLOBAL, &Globals.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
919         {"enable privileges", P_BOOL, P_GLOBAL, &Globals.bEnablePrivileges, NULL, NULL, FLAG_ADVANCED}, 
920
921         {"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, FLAG_ADVANCED}, 
922         {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, FLAG_ADVANCED}, 
923         {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED}, 
924         {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, FLAG_ADVANCED}, 
925         {"passwd chat timeout", P_INTEGER, P_GLOBAL, &Globals.iPasswdChatTimeout, NULL, NULL, FLAG_ADVANCED}, 
926         {"check password script", P_STRING, P_GLOBAL, &Globals.szCheckPasswordScript, NULL, NULL, FLAG_ADVANCED}, 
927         {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, FLAG_ADVANCED}, 
928         {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED}, 
929         {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, FLAG_ADVANCED}, 
930         {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, FLAG_ADVANCED}, 
931         {"restrict anonymous", P_INTEGER, P_GLOBAL, &Globals.restrict_anonymous, NULL, NULL, FLAG_ADVANCED}, 
932         {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, FLAG_ADVANCED}, 
933         {"ntlm auth", P_BOOL, P_GLOBAL, &Globals.bNTLMAuth, NULL, NULL, FLAG_ADVANCED}, 
934         {"client NTLMv2 auth", P_BOOL, P_GLOBAL, &Globals.bClientNTLMv2Auth, NULL, NULL, FLAG_ADVANCED}, 
935         {"client lanman auth", P_BOOL, P_GLOBAL, &Globals.bClientLanManAuth, NULL, NULL, FLAG_ADVANCED}, 
936         {"client plaintext auth", P_BOOL, P_GLOBAL, &Globals.bClientPlaintextAuth, NULL, NULL, FLAG_ADVANCED}, 
937
938         {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
939         {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE}, 
940         {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE}, 
941
942         {"invalid users", P_LIST, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
943         {"valid users", P_LIST, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
944         {"admin users", P_LIST, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
945         {"read list", P_LIST, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
946         {"write list", P_LIST, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
947         {"printer admin", P_LIST, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_PRINT | FLAG_DEPRECATED }, 
948         {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
949         {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
950         {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_ADVANCED}, 
951
952         {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE}, 
953         {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE}, 
954         {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE}, 
955         {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE}, 
956
957         {"acl check permissions", P_BOOL, P_LOCAL, &sDefault.bAclCheckPermissions, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
958         {"acl group control", P_BOOL, P_LOCAL, &sDefault.bAclGroupControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE | FLAG_DEPRECATED },
959         {"acl map full control", P_BOOL, P_LOCAL, &sDefault.bAclMapFullControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
960         {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
961         {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_HIDE}, 
962         {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
963         {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
964         {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
965         {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
966         {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
967         {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
968         {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
969         {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
970         {"force unknown acl user", P_BOOL, P_LOCAL, &sDefault.bForceUnknownAclUser, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
971         {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
972         {"inherit acls", P_BOOL, P_LOCAL, &sDefault.bInheritACLS, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
973         {"inherit owner", P_BOOL, P_LOCAL, &sDefault.bInheritOwner, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
974         {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
975         {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_HIDE}, 
976         {"hidden", P_BOOL, P_LOCAL, &sDefault.bHidden, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
977
978         {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
979         {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_HIDE}, 
980
981         {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED}, 
982         {"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
983         {"allow hosts", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_HIDE}, 
984         {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
985         {"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_HIDE}, 
986         {"preload modules", P_LIST, P_GLOBAL, &Globals.szPreloadModules, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
987         {"use kerberos keytab", P_BOOL, P_GLOBAL, &Globals.bUseKerberosKeytab, NULL, NULL, FLAG_ADVANCED}, 
988
989         {N_("Logging Options"), P_SEP, P_SEPARATOR}, 
990
991         {"log level", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_ADVANCED}, 
992         {"debuglevel", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_HIDE}, 
993         {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, FLAG_ADVANCED}, 
994         {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, FLAG_ADVANCED}, 
995         {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, FLAG_ADVANCED}, 
996
997         {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, FLAG_ADVANCED}, 
998         {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_ADVANCED}, 
999         {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_ADVANCED}, 
1000         {"debug prefix timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugPrefixTimestamp, NULL, NULL, FLAG_ADVANCED}, 
1001         {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, FLAG_ADVANCED}, 
1002         {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, FLAG_ADVANCED}, 
1003         {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, FLAG_ADVANCED}, 
1004         {"debug class", P_BOOL, P_GLOBAL, &Globals.bDebugClass, NULL, NULL, FLAG_ADVANCED},
1005         {"enable core files", P_BOOL, P_GLOBAL, &Globals.bEnableCoreFiles, NULL, NULL, FLAG_ADVANCED},
1006
1007         {N_("Protocol Options"), P_SEP, P_SEPARATOR}, 
1008
1009         {"allocation roundup size", P_INTEGER, P_LOCAL, &sDefault.iallocation_roundup_size, NULL, NULL, FLAG_ADVANCED}, 
1010         {"aio read size", P_INTEGER, P_LOCAL, &sDefault.iAioReadSize, NULL, NULL, FLAG_ADVANCED}, 
1011         {"aio write size", P_INTEGER, P_LOCAL, &sDefault.iAioWriteSize, NULL, NULL, FLAG_ADVANCED}, 
1012         {"aio write behind", P_STRING, P_LOCAL, &sDefault.szAioWriteBehind, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
1013         {"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED}, 
1014         {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_ADVANCED}, 
1015         {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
1016         {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
1017         {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
1018         {"min receivefile size", P_INTEGER, P_GLOBAL, &Globals.iminreceivefile, NULL, NULL, FLAG_ADVANCED}, 
1019         {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, FLAG_ADVANCED}, 
1020         {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, FLAG_ADVANCED}, 
1021         {"disable netbios", P_BOOL, P_GLOBAL, &Globals.bDisableNetbios, NULL, NULL, FLAG_ADVANCED}, 
1022         {"reset on zero vc", P_BOOL, P_GLOBAL, &Globals.bResetOnZeroVC, NULL, NULL, FLAG_ADVANCED}, 
1023
1024         {"acl compatibility", P_ENUM, P_GLOBAL, &Globals.iAclCompat, NULL,  enum_acl_compat_vals, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1025         {"defer sharing violations", P_BOOL, P_GLOBAL, &Globals.bDeferSharingViolations, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
1026         {"ea support", P_BOOL, P_LOCAL, &sDefault.bEASupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1027         {"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1028         {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, FLAG_ADVANCED}, 
1029         {"nt status support", P_BOOL, P_GLOBAL, &Globals.bNTStatusSupport, NULL, NULL, FLAG_ADVANCED}, 
1030         {"profile acls", P_BOOL, P_LOCAL, &sDefault.bProfileAcls, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
1031
1032         {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, FLAG_ADVANCED}, 
1033         {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as,  FLAG_ADVANCED}, 
1034         {"map acl inherit", P_BOOL, P_LOCAL, &sDefault.bMap_acl_inherit, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1035         {"afs share", P_BOOL, P_LOCAL, &sDefault.bAfs_Share, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1036         {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, FLAG_ADVANCED}, 
1037         {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, FLAG_ADVANCED}, 
1038
1039         {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
1040         {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, FLAG_ADVANCED}, 
1041         {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, FLAG_ADVANCED}, 
1042         {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, FLAG_ADVANCED}, 
1043         {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, FLAG_ADVANCED}, 
1044         {"unix extensions", P_BOOL, P_GLOBAL, &Globals.bUnixExtensions, NULL, NULL, FLAG_ADVANCED}, 
1045         {"use spnego", P_BOOL, P_GLOBAL, &Globals.bUseSpnego, NULL, NULL, FLAG_ADVANCED}, 
1046         {"client signing", P_ENUM, P_GLOBAL, &Globals.client_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED}, 
1047         {"server signing", P_ENUM, P_GLOBAL, &Globals.server_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED}, 
1048         {"smb encrypt", P_ENUM, P_LOCAL, &sDefault.ismb_encrypt, NULL, enum_smb_signing_vals, FLAG_ADVANCED},
1049         {"client use spnego", P_BOOL, P_GLOBAL, &Globals.bClientUseSpnego, NULL, NULL, FLAG_ADVANCED}, 
1050         {"client ldap sasl wrapping", P_ENUM, P_GLOBAL, &Globals.client_ldap_sasl_wrapping, NULL, enum_ldap_sasl_wrapping, FLAG_ADVANCED},
1051         {"enable asu support", P_BOOL, P_GLOBAL, &Globals.bASUSupport, NULL, NULL, FLAG_ADVANCED}, 
1052         {"svcctl list", P_LIST, P_GLOBAL, &Globals.szServicesList, NULL, NULL, FLAG_ADVANCED},
1053
1054         {N_("Tuning Options"), P_SEP, P_SEPARATOR}, 
1055
1056         {"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1057         {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, FLAG_ADVANCED}, 
1058         {"getwd cache", P_BOOL, P_GLOBAL, &Globals.getwd_cache, NULL, NULL, FLAG_ADVANCED},
1059         {"keepalive", P_INTEGER, P_GLOBAL, &Globals.iKeepalive, NULL, NULL, FLAG_ADVANCED},
1060         {"change notify", P_BOOL, P_LOCAL, &sDefault.bChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
1061         {"directory name cache size", P_INTEGER, P_LOCAL, &sDefault.iDirectoryNameCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
1062         {"kernel change notify", P_BOOL, P_LOCAL, &sDefault.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
1063
1064         {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_ADVANCED}, 
1065         {"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, FLAG_ADVANCED}, 
1066         {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1067         {"paranoid server security", P_BOOL, P_GLOBAL, &Globals.paranoid_server_security, NULL, NULL, FLAG_ADVANCED}, 
1068         {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, FLAG_ADVANCED}, 
1069         {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, FLAG_ADVANCED}, 
1070         {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1071
1072         {"socket options", P_STRING, P_GLOBAL, &Globals.szSocketOptions, NULL, NULL, FLAG_ADVANCED},
1073         {"strict allocate", P_BOOL, P_LOCAL, &sDefault.bStrictAllocate, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1074         {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1075         {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1076         {"use mmap", P_BOOL, P_GLOBAL, &Globals.bUseMmap, NULL, NULL, FLAG_ADVANCED}, 
1077         {"use sendfile", P_BOOL, P_LOCAL, &sDefault.bUseSendfile, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1078         {"hostname lookups", P_BOOL, P_GLOBAL, &Globals.bHostnameLookups, NULL, NULL, FLAG_ADVANCED}, 
1079         {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED}, 
1080
1081         {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED}, 
1082         {"ctdbd socket", P_STRING, P_GLOBAL, &Globals.ctdbdSocket, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1083         {"cluster addresses", P_LIST, P_GLOBAL, &Globals.szClusterAddresses, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1084         {"clustering", P_BOOL, P_GLOBAL, &Globals.clustering, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1085
1086         {N_("Printing Options"), P_SEP, P_SEPARATOR}, 
1087
1088         {"max reported print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxReportedPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1089         {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1090         {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1091         {"printcap cache time", P_INTEGER, P_GLOBAL, &Globals.PrintcapCacheTime, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1092         {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1093         {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE}, 
1094         {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1095         {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE}, 
1096         {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, handle_printing, enum_printing, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1097         {"cups options", P_STRING, P_LOCAL, &sDefault.szCupsOptions, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1098         {"cups server", P_STRING, P_GLOBAL, &Globals.szCupsServer, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1099         {"iprint server", P_STRING, P_GLOBAL, &Globals.szIPrintServer, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1100         {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1101         {"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1102         {"enable spoolss", P_BOOLREV, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_HIDE}, 
1103         {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1104         {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1105         {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1106         {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1107         {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1108         {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1109
1110         {"addport command", P_STRING, P_GLOBAL, &Globals.szAddPortCommand, NULL, NULL, FLAG_ADVANCED}, 
1111         {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, FLAG_ADVANCED}, 
1112         {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, FLAG_ADVANCED}, 
1113         {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, FLAG_ADVANCED}, 
1114         {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, FLAG_ADVANCED}, 
1115         {"os2 driver map", P_STRING, P_GLOBAL, &Globals.szOs2DriverMap, NULL, NULL, FLAG_ADVANCED}, 
1116
1117         {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1118         {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_HIDE}, 
1119         {"use client driver", P_BOOL, P_LOCAL, &sDefault.bUseClientDriver, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1120         {"default devmode", P_BOOL, P_LOCAL, &sDefault.bDefaultDevmode, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1121         {"force printername", P_BOOL, P_LOCAL, &sDefault.bForcePrintername, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1122         {"printjob username", P_STRING, P_LOCAL, &sDefault.szPrintjobUsername, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT},
1123
1124         {N_("Filename Handling"), P_SEP, P_SEPARATOR}, 
1125         {"mangling method", P_STRING, P_GLOBAL, &Globals.szManglingMethod, NULL, NULL, FLAG_ADVANCED}, 
1126         {"mangle prefix", P_INTEGER, P_GLOBAL, &Globals.mangle_prefix, NULL, NULL, FLAG_ADVANCED}, 
1127
1128         {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_ADVANCED | FLAG_SHARE}, 
1129         {"case sensitive", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1130         {"casesignames", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_HIDE}, 
1131         {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1132         {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1133         {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1134         {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1135         {"hide special files", P_BOOL, P_LOCAL, &sDefault.bHideSpecialFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1136         {"hide unreadable", P_BOOL, P_LOCAL, &sDefault.bHideUnReadable, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1137         {"hide unwriteable files", P_BOOL, P_LOCAL, &sDefault.bHideUnWriteableFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1138         {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1139         {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
1140         {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
1141         {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
1142         {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1143         {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1144         {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1145         {"map readonly", P_ENUM, P_LOCAL, &sDefault.iMap_readonly, NULL, enum_map_readonly, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1146         {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1147         {"max stat cache size", P_INTEGER, P_GLOBAL, &Globals.iMaxStatCacheSize, NULL, NULL, FLAG_ADVANCED}, 
1148         {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, FLAG_ADVANCED}, 
1149         {"store dos attributes", P_BOOL, P_LOCAL, &sDefault.bStoreDosAttributes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1150         {"dmapi support", P_BOOL, P_LOCAL, &sDefault.bDmapiSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1151
1152
1153         {N_("Domain Options"), P_SEP, P_SEPARATOR}, 
1154
1155         {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
1156
1157         {N_("Logon Options"), P_SEP, P_SEPARATOR}, 
1158
1159         {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, FLAG_ADVANCED}, 
1160         {"rename user script", P_STRING, P_GLOBAL, &Globals.szRenameUserScript, NULL, NULL, FLAG_ADVANCED},
1161         {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, FLAG_ADVANCED}, 
1162         {"add group script", P_STRING, P_GLOBAL, &Globals.szAddGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1163         {"delete group script", P_STRING, P_GLOBAL, &Globals.szDelGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1164         {"add user to group script", P_STRING, P_GLOBAL, &Globals.szAddUserToGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1165         {"delete user from group script", P_STRING, P_GLOBAL, &Globals.szDelUserFromGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1166         {"set primary group script", P_STRING, P_GLOBAL, &Globals.szSetPrimaryGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1167         {"add machine script", P_STRING, P_GLOBAL, &Globals.szAddMachineScript, NULL, NULL, FLAG_ADVANCED}, 
1168         {"shutdown script", P_STRING, P_GLOBAL, &Globals.szShutdownScript, NULL, NULL, FLAG_ADVANCED}, 
1169         {"abort shutdown script", P_STRING, P_GLOBAL, &Globals.szAbortShutdownScript, NULL, NULL, FLAG_ADVANCED}, 
1170         {"username map script", P_STRING, P_GLOBAL, &Globals.szUsernameMapScript, NULL, NULL, FLAG_ADVANCED}, 
1171
1172         {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_ADVANCED}, 
1173         {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_ADVANCED}, 
1174         {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, FLAG_ADVANCED}, 
1175         {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_ADVANCED}, 
1176         {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, FLAG_ADVANCED}, 
1177
1178         {N_("Browse Options"), P_SEP, P_SEPARATOR}, 
1179
1180         {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
1181         {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, FLAG_ADVANCED}, 
1182         {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, FLAG_ADVANCED}, 
1183         {"preferred master", P_ENUM, P_GLOBAL, &Globals.iPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
1184         {"prefered master", P_ENUM, P_GLOBAL, &Globals.iPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE}, 
1185         {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
1186         {"domain master", P_ENUM, P_GLOBAL, &Globals.iDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
1187         {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, FLAG_ADVANCED}, 
1188         {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1189         {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE}, 
1190         {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL, FLAG_ADVANCED}, 
1191
1192         {N_("WINS Options"), P_SEP, P_SEPARATOR}, 
1193
1194         {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, FLAG_ADVANCED}, 
1195         {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, FLAG_ADVANCED}, 
1196
1197         {"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
1198         {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
1199         {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED}, 
1200
1201         {N_("Locking Options"), P_SEP, P_SEPARATOR}, 
1202
1203         {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1204         {"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1205         {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1206         {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1207         {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1208         {"lock spin time", P_INTEGER, P_GLOBAL, &Globals.iLockSpinTime, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1209
1210         {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1211         {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1212         {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1213         {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1214         {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1215         {"strict locking", P_ENUM, P_LOCAL, &sDefault.iStrictLocking, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1216         {"share modes", P_BOOL, P_LOCAL,  &sDefault.bShareModes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1217
1218         {N_("Ldap Options"), P_SEP, P_SEPARATOR}, 
1219
1220         {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, FLAG_ADVANCED}, 
1221         {"ldap delete dn", P_BOOL, P_GLOBAL, &Globals.ldap_delete_dn, NULL, NULL, FLAG_ADVANCED}, 
1222         {"ldap group suffix", P_STRING, P_GLOBAL, &Globals.szLdapGroupSuffix, NULL, NULL, FLAG_ADVANCED}, 
1223         {"ldap idmap suffix", P_STRING, P_GLOBAL, &Globals.szLdapIdmapSuffix, NULL, NULL, FLAG_ADVANCED}, 
1224         {"ldap machine suffix", P_STRING, P_GLOBAL, &Globals.szLdapMachineSuffix, NULL, NULL, FLAG_ADVANCED}, 
1225         {"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED}, 
1226         {"ldap password sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_HIDE}, 
1227         {"ldap replication sleep", P_INTEGER, P_GLOBAL, &Globals.ldap_replication_sleep, NULL, NULL, FLAG_ADVANCED},
1228         {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, FLAG_ADVANCED}, 
1229         {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED}, 
1230         {"ldap timeout", P_INTEGER, P_GLOBAL, &Globals.ldap_timeout, NULL, NULL, FLAG_ADVANCED},
1231         {"ldap page size", P_INTEGER, P_GLOBAL, &Globals.ldap_page_size, NULL, NULL, FLAG_ADVANCED},
1232         {"ldap user suffix", P_STRING, P_GLOBAL, &Globals.szLdapUserSuffix, NULL, NULL, FLAG_ADVANCED}, 
1233
1234         {"ldap debug level", P_INTEGER, P_GLOBAL, &Globals.ldap_debug_level, handle_ldap_debug_level, NULL, FLAG_ADVANCED},
1235         {"ldap debug threshold", P_INTEGER, P_GLOBAL, &Globals.ldap_debug_threshold, NULL, NULL, FLAG_ADVANCED},
1236
1237
1238         {N_("EventLog Options"), P_SEP, P_SEPARATOR}, 
1239         {"eventlog list",  P_LIST, P_GLOBAL, &Globals.szEventLogs, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
1240
1241         {N_("Miscellaneous Options"), P_SEP, P_SEPARATOR}, 
1242         {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED}, 
1243         {"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, FLAG_ADVANCED}, 
1244         {"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, FLAG_ADVANCED}, 
1245
1246         {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE}, 
1247         {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED}, 
1248         {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED}, 
1249         {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_ADVANCED}, 
1250         {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_HIDE}, 
1251         {"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, FLAG_ADVANCED}, 
1252 #ifdef WITH_UTMP
1253         {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, FLAG_ADVANCED}, 
1254         {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, FLAG_ADVANCED}, 
1255         {"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, FLAG_ADVANCED}, 
1256 #endif
1257
1258         {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED}, 
1259         {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED}, 
1260         {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, FLAG_ADVANCED}, 
1261         {"dfree cache time", P_INTEGER, P_LOCAL, &sDefault.iDfreeCacheTime, NULL, NULL, FLAG_ADVANCED}, 
1262         {"dfree command", P_STRING, P_LOCAL, &sDefault.szDfree, NULL, NULL, FLAG_ADVANCED}, 
1263         {"get quota command", P_STRING, P_GLOBAL, &Globals.szGetQuota, NULL, NULL, FLAG_ADVANCED}, 
1264         {"set quota command", P_STRING, P_GLOBAL, &Globals.szSetQuota, NULL, NULL, FLAG_ADVANCED}, 
1265         {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, FLAG_ADVANCED}, 
1266         {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, FLAG_ADVANCED}, 
1267         {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, FLAG_ADVANCED}, 
1268         {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, FLAG_ADVANCED}, 
1269         {"afs username map", P_STRING, P_GLOBAL, &Globals.szAfsUsernameMap, NULL, NULL, FLAG_ADVANCED}, 
1270         {"afs token lifetime", P_INTEGER, P_GLOBAL, &Globals.iAfsTokenLifetime, NULL, NULL, FLAG_ADVANCED},
1271         {"log nt token command", P_STRING, P_GLOBAL, &Globals.szLogNtTokenCommand, NULL, NULL, FLAG_ADVANCED},
1272         {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, FLAG_ADVANCED}, 
1273         {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, FLAG_ADVANCED}, 
1274         {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE}, 
1275
1276         {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE}, 
1277         {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE}, 
1278         {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1279         {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_ADVANCED}, 
1280
1281         {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1282         {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1283         {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1284         {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1285         {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1286         {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1287         {"registry shares", P_BOOL, P_GLOBAL, &Globals.bRegistryShares, NULL, NULL, FLAG_ADVANCED},
1288         {"usershare allow guests", P_BOOL, P_GLOBAL, &Globals.bUsershareAllowGuests, NULL, NULL, FLAG_ADVANCED},
1289         {"usershare max shares", P_INTEGER, P_GLOBAL, &Globals.iUsershareMaxShares, NULL, NULL, FLAG_ADVANCED},
1290         {"usershare owner only", P_BOOL, P_GLOBAL, &Globals.bUsershareOwnerOnly, NULL, NULL, FLAG_ADVANCED}, 
1291         {"usershare path", P_STRING, P_GLOBAL, &Globals.szUsersharePath, NULL, NULL, FLAG_ADVANCED},
1292         {"usershare prefix allow list", P_LIST, P_GLOBAL, &Globals.szUsersharePrefixAllowList, NULL, NULL, FLAG_ADVANCED}, 
1293         {"usershare prefix deny list", P_LIST, P_GLOBAL, &Globals.szUsersharePrefixDenyList, NULL, NULL, FLAG_ADVANCED}, 
1294         {"usershare template share", P_STRING, P_GLOBAL, &Globals.szUsershareTemplateShare, NULL, NULL, FLAG_ADVANCED},
1295         {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE }, 
1296         {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1297         {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1298         {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1299         {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1300         {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1301         {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1302         {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1303         {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1304         {"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1305         {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1306         {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1307
1308         {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1309         {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, FLAG_ADVANCED}, 
1310
1311         {N_("VFS module options"), P_SEP, P_SEPARATOR}, 
1312
1313         {"vfs objects", P_LIST, P_LOCAL, &sDefault.szVfsObjects, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1314         {"vfs object", P_LIST, P_LOCAL, &sDefault.szVfsObjects, NULL, NULL, FLAG_HIDE}, 
1315
1316
1317         {N_("MSDFS options"), P_SEP, P_SEPARATOR},
1318
1319         {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1320         {"msdfs proxy", P_STRING, P_LOCAL, &sDefault.szMSDfsProxy, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1321         {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED}, 
1322
1323         {N_("Winbind options"), P_SEP, P_SEPARATOR}, 
1324
1325         {"passdb expand explicit", P_BOOL, P_GLOBAL, &Globals.bPassdbExpandExplicit, NULL, NULL, FLAG_ADVANCED},
1326         {"idmap domains", P_LIST, P_GLOBAL, &Globals.szIdmapDomains, NULL, NULL, FLAG_ADVANCED}, 
1327         {"idmap backend", P_LIST, P_GLOBAL, &Globals.szIdmapBackend, NULL, NULL, FLAG_ADVANCED }, 
1328         {"idmap alloc backend", P_STRING, P_GLOBAL, &Globals.szIdmapAllocBackend, NULL, NULL, FLAG_ADVANCED}, 
1329         {"idmap cache time", P_INTEGER, P_GLOBAL, &Globals.iIdmapCacheTime, NULL, NULL, FLAG_ADVANCED}, 
1330         {"idmap negative cache time", P_INTEGER, P_GLOBAL, &Globals.iIdmapNegativeCacheTime, NULL, NULL, FLAG_ADVANCED}, 
1331         {"idmap uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_ADVANCED }, 
1332         {"winbind uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_HIDE }, 
1333         {"idmap gid", P_STRING, P_GLOBAL, &Globals.szIdmapGID, handle_idmap_gid, NULL, FLAG_ADVANCED }, 
1334         {"winbind gid", P_STRING, P_GLOBAL, &Globals.szIdmapGID, handle_idmap_gid, NULL, FLAG_HIDE }, 
1335         {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, FLAG_ADVANCED}, 
1336         {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, FLAG_ADVANCED}, 
1337         {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED}, 
1338         {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, FLAG_ADVANCED}, 
1339         {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, FLAG_ADVANCED}, 
1340         {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED}, 
1341         {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED}, 
1342         {"winbind trusted domains only", P_BOOL, P_GLOBAL, &Globals.bWinbindTrustedDomainsOnly, NULL, NULL, FLAG_ADVANCED}, 
1343         {"winbind nested groups", P_BOOL, P_GLOBAL, &Globals.bWinbindNestedGroups, NULL, NULL, FLAG_ADVANCED}, 
1344         {"winbind expand groups", P_INTEGER, P_GLOBAL, &Globals.winbind_expand_groups, NULL, NULL, FLAG_ADVANCED}, 
1345         {"winbind nss info", P_LIST, P_GLOBAL, &Globals.szWinbindNssInfo, NULL, NULL, FLAG_ADVANCED}, 
1346         {"winbind refresh tickets", P_BOOL, P_GLOBAL, &Globals.bWinbindRefreshTickets, NULL, NULL, FLAG_ADVANCED}, 
1347         {"winbind offline logon", P_BOOL, P_GLOBAL, &Globals.bWinbindOfflineLogon, NULL, NULL, FLAG_ADVANCED},
1348         {"winbind normalize names", P_BOOL, P_GLOBAL, &Globals.bWinbindNormalizeNames, NULL, NULL, FLAG_ADVANCED},
1349         {"winbind rpc only", P_BOOL, P_GLOBAL, &Globals.bWinbindRpcOnly, NULL, NULL, FLAG_ADVANCED},
1350
1351         {NULL,  P_BOOL,  P_NONE,  NULL,  NULL,  NULL,  0}
1352 };
1353
1354 /***************************************************************************
1355  Initialise the sDefault parameter structure for the printer values.
1356 ***************************************************************************/
1357
1358 static void init_printer_values(service *pService)
1359 {
1360         /* choose defaults depending on the type of printing */
1361         switch (pService->iPrinting) {
1362                 case PRINT_BSD:
1363                 case PRINT_AIX:
1364                 case PRINT_LPRNT:
1365                 case PRINT_LPROS2:
1366                         string_set(&pService->szLpqcommand, "lpq -P'%p'");
1367                         string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1368                         string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
1369                         break;
1370
1371                 case PRINT_LPRNG:
1372                 case PRINT_PLP:
1373                         string_set(&pService->szLpqcommand, "lpq -P'%p'");
1374                         string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1375                         string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
1376                         string_set(&pService->szQueuepausecommand, "lpc stop '%p'");
1377                         string_set(&pService->szQueueresumecommand, "lpc start '%p'");
1378                         string_set(&pService->szLppausecommand, "lpc hold '%p' %j");
1379                         string_set(&pService->szLpresumecommand, "lpc release '%p' %j");
1380                         break;
1381
1382                 case PRINT_CUPS:
1383                 case PRINT_IPRINT:
1384 #ifdef HAVE_CUPS
1385                         /* set the lpq command to contain the destination printer
1386                            name only.  This is used by cups_queue_get() */
1387                         string_set(&pService->szLpqcommand, "%p");
1388                         string_set(&pService->szLprmcommand, "");
1389                         string_set(&pService->szPrintcommand, "");
1390                         string_set(&pService->szLppausecommand, "");
1391                         string_set(&pService->szLpresumecommand, "");
1392                         string_set(&pService->szQueuepausecommand, "");
1393                         string_set(&pService->szQueueresumecommand, "");
1394 #else
1395                         string_set(&pService->szLpqcommand, "lpq -P'%p'");
1396                         string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1397                         string_set(&pService->szPrintcommand, "lpr -P'%p' %s; rm %s");
1398                         string_set(&pService->szLppausecommand, "lp -i '%p-%j' -H hold");
1399                         string_set(&pService->szLpresumecommand, "lp -i '%p-%j' -H resume");
1400                         string_set(&pService->szQueuepausecommand, "disable '%p'");
1401                         string_set(&pService->szQueueresumecommand, "enable '%p'");
1402 #endif /* HAVE_CUPS */
1403                         break;
1404
1405                 case PRINT_SYSV:
1406                 case PRINT_HPUX:
1407                         string_set(&pService->szLpqcommand, "lpstat -o%p");
1408                         string_set(&pService->szLprmcommand, "cancel %p-%j");
1409                         string_set(&pService->szPrintcommand, "lp -c -d%p %s; rm %s");
1410                         string_set(&pService->szQueuepausecommand, "disable %p");
1411                         string_set(&pService->szQueueresumecommand, "enable %p");
1412 #ifndef HPUX
1413                         string_set(&pService->szLppausecommand, "lp -i %p-%j -H hold");
1414                         string_set(&pService->szLpresumecommand, "lp -i %p-%j -H resume");
1415 #endif /* HPUX */
1416                         break;
1417
1418                 case PRINT_QNX:
1419                         string_set(&pService->szLpqcommand, "lpq -P%p");
1420                         string_set(&pService->szLprmcommand, "lprm -P%p %j");
1421                         string_set(&pService->szPrintcommand, "lp -r -P%p %s");
1422                         break;
1423
1424 #ifdef DEVELOPER
1425         case PRINT_TEST:
1426         case PRINT_VLP:
1427                 string_set(&pService->szPrintcommand, "vlp print %p %s");
1428                 string_set(&pService->szLpqcommand, "vlp lpq %p");
1429                 string_set(&pService->szLprmcommand, "vlp lprm %p %j");
1430                 string_set(&pService->szLppausecommand, "vlp lppause %p %j");
1431                 string_set(&pService->szLpresumecommand, "vlp lpresum %p %j");
1432                 string_set(&pService->szQueuepausecommand, "vlp queuepause %p");
1433                 string_set(&pService->szQueueresumecommand, "vlp queueresume %p");
1434                 break;
1435 #endif /* DEVELOPER */
1436
1437         }
1438 }
1439
1440 /***************************************************************************
1441  Initialise the global parameter structure.
1442 ***************************************************************************/
1443
1444 static void init_globals(bool first_time_only)
1445 {
1446         static bool done_init = False;
1447         char *s = NULL;
1448
1449         /* If requested to initialize only once and we've already done it... */
1450         if (first_time_only && done_init) {
1451                 /* ... then we have nothing more to do */
1452                 return;
1453         }
1454
1455         if (!done_init) {
1456                 int i;
1457
1458                 /* The logfile can be set before this is invoked. Free it if so. */
1459                 if (Globals.szLogFile != NULL) {
1460                         string_free(&Globals.szLogFile);
1461                         Globals.szLogFile = NULL;
1462                 }
1463
1464                 memset((void *)&Globals, '\0', sizeof(Globals));
1465
1466                 for (i = 0; parm_table[i].label; i++)
1467                         if ((parm_table[i].type == P_STRING ||
1468                              parm_table[i].type == P_USTRING) &&
1469                             parm_table[i].ptr)
1470                                 string_set((char **)parm_table[i].ptr, "");
1471
1472                 string_set(&sDefault.fstype, FSTYPE_STRING);
1473                 string_set(&sDefault.szPrintjobUsername, "%U");
1474
1475                 init_printer_values(&sDefault);
1476
1477                 done_init = True;
1478         }
1479
1480
1481         DEBUG(3, ("Initialising global parameters\n"));
1482
1483         string_set(&Globals.szSMBPasswdFile, get_dyn_SMB_PASSWD_FILE());
1484         string_set(&Globals.szPrivateDir, get_dyn_PRIVATE_DIR());
1485
1486         /* use the new 'hash2' method by default, with a prefix of 1 */
1487         string_set(&Globals.szManglingMethod, "hash2");
1488         Globals.mangle_prefix = 1;
1489
1490         string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
1491
1492         /* using UTF8 by default allows us to support all chars */
1493         string_set(&Globals.unix_charset, DEFAULT_UNIX_CHARSET);
1494
1495 #if defined(HAVE_NL_LANGINFO) && defined(CODESET)
1496         /* If the system supports nl_langinfo(), try to grab the value
1497            from the user's locale */
1498         string_set(&Globals.display_charset, "LOCALE");
1499 #else
1500         string_set(&Globals.display_charset, DEFAULT_DISPLAY_CHARSET);
1501 #endif
1502
1503         /* Use codepage 850 as a default for the dos character set */
1504         string_set(&Globals.dos_charset, DEFAULT_DOS_CHARSET);
1505
1506         /*
1507          * Allow the default PASSWD_CHAT to be overridden in local.h.
1508          */
1509         string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1510
1511         set_global_myname(myhostname());
1512         string_set(&Globals.szNetbiosName,global_myname());
1513
1514         set_global_myworkgroup(WORKGROUP);
1515         string_set(&Globals.szWorkgroup, lp_workgroup());
1516
1517         string_set(&Globals.szPasswdProgram, "");
1518         string_set(&Globals.szPidDir, get_dyn_PIDDIR());
1519         string_set(&Globals.szLockDir, get_dyn_LOCKDIR());
1520         string_set(&Globals.szSocketAddress, "0.0.0.0");
1521
1522         if (asprintf(&s, "Samba %s", SAMBA_VERSION_STRING) < 0) {
1523                 smb_panic("init_globals: ENOMEM");
1524         }
1525         string_set(&Globals.szServerString, s);
1526         SAFE_FREE(s);
1527         if (asprintf(&s, "%d.%d", DEFAULT_MAJOR_VERSION,
1528                         DEFAULT_MINOR_VERSION) < 0) {
1529                 smb_panic("init_globals: ENOMEM");
1530         }
1531         string_set(&Globals.szAnnounceVersion, s);
1532         SAFE_FREE(s);
1533 #ifdef DEVELOPER
1534         string_set(&Globals.szPanicAction, "/bin/sleep 999999999");
1535 #endif
1536
1537         string_set(&Globals.szSocketOptions, DEFAULT_SOCKET_OPTIONS);
1538
1539         string_set(&Globals.szLogonDrive, "");
1540         /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1541         string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1542         string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1543
1544         string_set(&Globals.szNameResolveOrder, "lmhosts wins host bcast");
1545         string_set(&Globals.szPasswordServer, "*");
1546
1547         Globals.AlgorithmicRidBase = BASE_RID;
1548
1549         Globals.bLoadPrinters = True;
1550         Globals.PrintcapCacheTime = 750;        /* 12.5 minutes */
1551
1552         Globals.ConfigBackend = config_backend;
1553
1554         /* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
1555         /* Discovered by 2 days of pain by Don McCall @ HP :-). */
1556         Globals.max_xmit = 0x4104;
1557         Globals.max_mux = 50;   /* This is *needed* for profile support. */
1558         Globals.lpqcachetime = 30;      /* changed to handle large print servers better -- jerry */
1559         Globals.bDisableSpoolss = False;
1560         Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1561         Globals.pwordlevel = 0;
1562         Globals.unamelevel = 0;
1563         Globals.deadtime = 0;
1564         Globals.getwd_cache = true;
1565         Globals.bLargeReadwrite = True;
1566         Globals.max_log_size = 5000;
1567         Globals.max_open_files = MAX_OPEN_FILES;
1568         Globals.open_files_db_hash_size = SMB_OPEN_DATABASE_TDB_HASH_SIZE;
1569         Globals.maxprotocol = PROTOCOL_NT1;
1570         Globals.minprotocol = PROTOCOL_CORE;
1571         Globals.security = SEC_USER;
1572         Globals.paranoid_server_security = True;
1573         Globals.bEncryptPasswords = True;
1574         Globals.bUpdateEncrypt = False;
1575         Globals.clientSchannel = Auto;
1576         Globals.serverSchannel = Auto;
1577         Globals.bReadRaw = True;
1578         Globals.bWriteRaw = True;
1579         Globals.bNullPasswords = False;
1580         Globals.bObeyPamRestrictions = False;
1581         Globals.syslog = 1;
1582         Globals.bSyslogOnly = False;
1583         Globals.bTimestampLogs = True;
1584         string_set(&Globals.szLogLevel, "0");
1585         Globals.bDebugPrefixTimestamp = False;
1586         Globals.bDebugHiresTimestamp = False;
1587         Globals.bDebugPid = False;
1588         Globals.bDebugUid = False;
1589         Globals.bDebugClass = False;
1590         Globals.bEnableCoreFiles = True;
1591         Globals.max_ttl = 60 * 60 * 24 * 3;     /* 3 days default. */
1592         Globals.max_wins_ttl = 60 * 60 * 24 * 6;        /* 6 days default. */
1593         Globals.min_wins_ttl = 60 * 60 * 6;     /* 6 hours default. */
1594         Globals.machine_password_timeout = 60 * 60 * 24 * 7;    /* 7 days default. */
1595         Globals.lm_announce = 2;        /* = Auto: send only if LM clients found */
1596         Globals.lm_interval = 60;
1597         Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1598 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1599         Globals.bNISHomeMap = False;
1600 #ifdef WITH_NISPLUS_HOME
1601         string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1602 #else
1603         string_set(&Globals.szNISHomeMapName, "auto.home");
1604 #endif
1605 #endif
1606         Globals.bTimeServer = False;
1607         Globals.bBindInterfacesOnly = False;
1608         Globals.bUnixPasswdSync = False;
1609         Globals.bPamPasswordChange = False;
1610         Globals.bPasswdChatDebug = False;
1611         Globals.iPasswdChatTimeout = 2; /* 2 second default. */
1612         Globals.bNTPipeSupport = True;  /* Do NT pipes by default. */
1613         Globals.bNTStatusSupport = True; /* Use NT status by default. */
1614         Globals.bStatCache = True;      /* use stat cache by default */
1615         Globals.iMaxStatCacheSize = 256; /* 256k by default */
1616         Globals.restrict_anonymous = 0;
1617         Globals.bClientLanManAuth = False;      /* Do NOT use the LanMan hash if it is available */
1618         Globals.bClientPlaintextAuth = False;   /* Do NOT use a plaintext password even if is requested by the server */
1619         Globals.bLanmanAuth = False;    /* Do NOT use the LanMan hash, even if it is supplied */
1620         Globals.bNTLMAuth = True;       /* Do use NTLMv1 if it is supplied by the client (otherwise NTLMv2) */
1621         Globals.bClientNTLMv2Auth = False; /* Client should not use NTLMv2, as we can't tell that the server supports it. */
1622         /* Note, that we will use NTLM2 session security (which is different), if it is available */
1623
1624         Globals.map_to_guest = 0;       /* By Default, "Never" */
1625         Globals.oplock_break_wait_time = 0;     /* By Default, 0 msecs. */
1626         Globals.enhanced_browsing = true;
1627         Globals.iLockSpinTime = WINDOWS_MINIMUM_LOCK_TIMEOUT_MS; /* msec. */
1628 #ifdef MMAP_BLACKLIST
1629         Globals.bUseMmap = False;
1630 #else
1631         Globals.bUseMmap = True;
1632 #endif
1633         Globals.bUnixExtensions = True;
1634         Globals.bResetOnZeroVC = False;
1635
1636         /* hostname lookups can be very expensive and are broken on
1637            a large number of sites (tridge) */
1638         Globals.bHostnameLookups = False;
1639
1640         string_set(&Globals.szPassdbBackend, "smbpasswd");
1641         string_set(&Globals.szLdapSuffix, "");
1642         string_set(&Globals.szLdapMachineSuffix, "");
1643         string_set(&Globals.szLdapUserSuffix, "");
1644         string_set(&Globals.szLdapGroupSuffix, "");
1645         string_set(&Globals.szLdapIdmapSuffix, "");
1646
1647         string_set(&Globals.szLdapAdminDn, "");
1648         Globals.ldap_ssl = LDAP_SSL_ON;
1649         Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
1650         Globals.ldap_delete_dn = False;
1651         Globals.ldap_replication_sleep = 1000; /* wait 1 sec for replication */
1652         Globals.ldap_timeout = LDAP_CONNECT_DEFAULT_TIMEOUT;
1653         Globals.ldap_page_size = LDAP_PAGE_SIZE;
1654
1655         Globals.ldap_debug_level = 0;
1656         Globals.ldap_debug_threshold = 10;
1657
1658         /* This is what we tell the afs client. in reality we set the token 
1659          * to never expire, though, when this runs out the afs client will 
1660          * forget the token. Set to 0 to get NEVERDATE.*/
1661         Globals.iAfsTokenLifetime = 604800;
1662
1663 /* these parameters are set to defaults that are more appropriate
1664    for the increasing samba install base:
1665
1666    as a member of the workgroup, that will possibly become a
1667    _local_ master browser (lm = True).  this is opposed to a forced
1668    local master browser startup (pm = True).
1669
1670    doesn't provide WINS server service by default (wsupp = False),
1671    and doesn't provide domain master browser services by default, either.
1672
1673 */
1674
1675         Globals.bMsAddPrinterWizard = True;
1676         Globals.os_level = 20;
1677         Globals.bLocalMaster = True;
1678         Globals.iDomainMaster = Auto;   /* depending on bDomainLogons */
1679         Globals.bDomainLogons = False;
1680         Globals.bBrowseList = True;
1681         Globals.bWINSsupport = False;
1682         Globals.bWINSproxy = False;
1683
1684         Globals.bDNSproxy = True;
1685
1686         /* this just means to use them if they exist */
1687         Globals.bKernelOplocks = True;
1688
1689         Globals.bAllowTrustedDomains = True;
1690
1691         string_set(&Globals.szTemplateShell, "/bin/false");
1692         string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1693         string_set(&Globals.szWinbindSeparator, "\\");
1694
1695         string_set(&Globals.szCupsServer, "");
1696         string_set(&Globals.szIPrintServer, "");
1697
1698         string_set(&Globals.ctdbdSocket, "");
1699         Globals.szClusterAddresses = NULL;
1700         Globals.clustering = False;
1701
1702         Globals.winbind_cache_time = 300;       /* 5 minutes */
1703         Globals.bWinbindEnumUsers = False;
1704         Globals.bWinbindEnumGroups = False;
1705         Globals.bWinbindUseDefaultDomain = False;
1706         Globals.bWinbindTrustedDomainsOnly = False;
1707         Globals.bWinbindNestedGroups = True;
1708         Globals.winbind_expand_groups = 1;
1709         Globals.szWinbindNssInfo = str_list_make(NULL, "template", NULL);
1710         Globals.bWinbindRefreshTickets = False;
1711         Globals.bWinbindOfflineLogon = False;
1712
1713         Globals.iIdmapCacheTime = 900; /* 15 minutes by default */
1714         Globals.iIdmapNegativeCacheTime = 120; /* 2 minutes by default */
1715
1716         Globals.bPassdbExpandExplicit = False;
1717
1718         Globals.name_cache_timeout = 660; /* In seconds */
1719
1720         Globals.bUseSpnego = True;
1721         Globals.bClientUseSpnego = True;
1722
1723         Globals.client_signing = Auto;
1724         Globals.server_signing = False;
1725
1726         Globals.bDeferSharingViolations = True;
1727         string_set(&Globals.smb_ports, SMB_PORTS);
1728
1729         Globals.bEnablePrivileges = True;
1730         Globals.bHostMSDfs        = True;
1731         Globals.bASUSupport       = False;
1732
1733         /* User defined shares. */
1734         if (asprintf(&s, "%s/usershares", get_dyn_STATEDIR()) < 0) {
1735                 smb_panic("init_globals: ENOMEM");
1736         }
1737         string_set(&Globals.szUsersharePath, s);
1738         SAFE_FREE(s);
1739         string_set(&Globals.szUsershareTemplateShare, "");
1740         Globals.iUsershareMaxShares = 0;
1741         /* By default disallow sharing of directories not owned by the sharer. */
1742         Globals.bUsershareOwnerOnly = True;
1743         /* By default disallow guest access to usershares. */
1744         Globals.bUsershareAllowGuests = False;
1745
1746         Globals.iKeepalive = DEFAULT_KEEPALIVE;
1747
1748         /* By default no shares out of the registry */
1749         Globals.bRegistryShares = False;
1750
1751         Globals.iminreceivefile = 0;
1752 }
1753
1754 /*******************************************************************
1755  Convenience routine to grab string parameters into temporary memory
1756  and run standard_sub_basic on them. The buffers can be written to by
1757  callers without affecting the source string.
1758 ********************************************************************/
1759
1760 static char *lp_string(const char *s)
1761 {
1762         char *ret;
1763         TALLOC_CTX *ctx = talloc_tos();
1764
1765         /* The follow debug is useful for tracking down memory problems
1766            especially if you have an inner loop that is calling a lp_*()
1767            function that returns a string.  Perhaps this debug should be
1768            present all the time? */
1769
1770 #if 0
1771         DEBUG(10, ("lp_string(%s)\n", s));
1772 #endif
1773
1774         ret = talloc_sub_basic(ctx,
1775                         get_current_username(),
1776                         current_user_info.domain,
1777                         s);
1778         if (trim_char(ret, '\"', '\"')) {
1779                 if (strchr(ret,'\"') != NULL) {
1780                         TALLOC_FREE(ret);
1781                         ret = talloc_sub_basic(ctx,
1782                                         get_current_username(),
1783                                         current_user_info.domain,
1784                                         s);
1785                 }
1786         }
1787         return ret;
1788 }
1789
1790 /*
1791    In this section all the functions that are used to access the 
1792    parameters from the rest of the program are defined 
1793 */
1794
1795 #define FN_GLOBAL_STRING(fn_name,ptr) \
1796  char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1797 #define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
1798  const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
1799 #define FN_GLOBAL_LIST(fn_name,ptr) \
1800  const char **fn_name(void) {return(*(const char ***)(ptr));}
1801 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1802  bool fn_name(void) {return(*(bool *)(ptr));}
1803 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1804  char fn_name(void) {return(*(char *)(ptr));}
1805 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1806  int fn_name(void) {return(*(int *)(ptr));}
1807
1808 #define FN_LOCAL_STRING(fn_name,val) \
1809  char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1810 #define FN_LOCAL_CONST_STRING(fn_name,val) \
1811  const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1812 #define FN_LOCAL_LIST(fn_name,val) \
1813  const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1814 #define FN_LOCAL_BOOL(fn_name,val) \
1815  bool fn_name(int i) {return(bool)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1816 #define FN_LOCAL_INTEGER(fn_name,val) \
1817  int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1818
1819 #define FN_LOCAL_PARM_BOOL(fn_name,val) \
1820  bool fn_name(const struct share_params *p) {return(bool)(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
1821 #define FN_LOCAL_PARM_INTEGER(fn_name,val) \
1822  int fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
1823 #define FN_LOCAL_PARM_STRING(fn_name,val) \
1824  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));}
1825 #define FN_LOCAL_CHAR(fn_name,val) \
1826  char fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
1827
1828 FN_GLOBAL_STRING(lp_smb_ports, &Globals.smb_ports)
1829 FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
1830 FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
1831 FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
1832 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1833 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1834 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1835 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
1836 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1837 FN_GLOBAL_INTEGER(lp_printcap_cache_time, &Globals.PrintcapCacheTime)
1838 FN_GLOBAL_STRING(lp_addport_cmd, &Globals.szAddPortCommand)
1839 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1840 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1841 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1842 FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
1843 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1844 FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
1845 FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
1846 FN_GLOBAL_INTEGER(lp_mangle_prefix, &Globals.mangle_prefix)
1847 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1848 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1849 FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
1850 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1851 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1852 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1853 FN_GLOBAL_STRING(lp_get_quota_command, &Globals.szGetQuota)
1854 FN_GLOBAL_STRING(lp_set_quota_command, &Globals.szSetQuota)
1855 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1856 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1857 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1858 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1859 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1860 FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
1861 FN_GLOBAL_CONST_STRING(lp_afs_username_map, &Globals.szAfsUsernameMap)
1862 FN_GLOBAL_INTEGER(lp_afs_token_lifetime, &Globals.iAfsTokenLifetime)
1863 FN_GLOBAL_STRING(lp_log_nt_token_command, &Globals.szLogNtTokenCommand)
1864 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1865 FN_GLOBAL_CONST_STRING(lp_logon_script, &Globals.szLogonScript)
1866 FN_GLOBAL_CONST_STRING(lp_logon_path, &Globals.szLogonPath)
1867 FN_GLOBAL_CONST_STRING(lp_logon_drive, &Globals.szLogonDrive)
1868 FN_GLOBAL_CONST_STRING(lp_logon_home, &Globals.szLogonHome)
1869 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1870 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1871 FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
1872 FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
1873 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1874 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1875 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1876 FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
1877 /* FN_GLOBAL_STRING(lp_passdb_backend, &Globals.szPassdbBackend)
1878  * lp_passdb_backend() should be replace by the this macro again after
1879  * some releases.
1880  * */
1881 const char *lp_passdb_backend(void)
1882 {
1883         char *delim, *quote;
1884
1885         delim = strchr( Globals.szPassdbBackend, ' ');
1886         /* no space at all */
1887         if (delim == NULL) {
1888                 goto out;
1889         }
1890
1891         quote = strchr(Globals.szPassdbBackend, '"');
1892         /* no quote char or non in the first part */
1893         if (quote == NULL || quote > delim) {
1894                 *delim = '\0';
1895                 goto warn;
1896         }
1897
1898         quote = strchr(quote+1, '"');
1899         if (quote == NULL) {
1900                 DEBUG(0, ("WARNING: Your 'passdb backend' configuration is invalid due to a missing second \" char.\n"));
1901                 goto out;
1902         } else if (*(quote+1) == '\0') {
1903                 /* space, fitting quote char, and one backend only */
1904                 goto out;
1905         } else {
1906                 /* terminate string after the fitting quote char */
1907                 *(quote+1) = '\0';
1908         }
1909
1910 warn:
1911         DEBUG(0, ("WARNING: Your 'passdb backend' configuration includes multiple backends.  This\n"
1912                 "is deprecated since Samba 3.0.23.  Please check WHATSNEW.txt or the section 'Passdb\n"
1913                 "Changes' from the ChangeNotes as part of the Samba HOWTO collection.  Only the first\n"
1914                 "backend (%s) is used.  The rest is ignored.\n", Globals.szPassdbBackend));
1915
1916 out:
1917         return Globals.szPassdbBackend;
1918 }
1919 FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules)
1920 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1921 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1922 FN_GLOBAL_STRING(lp_renameuser_script, &Globals.szRenameUserScript)
1923 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1924
1925 FN_GLOBAL_CONST_STRING(lp_guestaccount, &Globals.szGuestaccount)
1926 FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
1927 FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
1928 FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
1929 FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserFromGroupScript)
1930 FN_GLOBAL_STRING(lp_setprimarygroup_script, &Globals.szSetPrimaryGroupScript)
1931
1932 FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
1933
1934 FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript)
1935 FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript)
1936 FN_GLOBAL_STRING(lp_username_map_script, &Globals.szUsernameMapScript)
1937
1938 FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript)
1939
1940 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1941 FN_GLOBAL_CONST_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1942 FN_GLOBAL_CONST_STRING(lp_template_shell, &Globals.szTemplateShell)
1943 FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1944 FN_GLOBAL_INTEGER(lp_acl_compatibility, &Globals.iAclCompat)
1945 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1946 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1947 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
1948 FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only, &Globals.bWinbindTrustedDomainsOnly)
1949 FN_GLOBAL_BOOL(lp_winbind_nested_groups, &Globals.bWinbindNestedGroups)
1950 FN_GLOBAL_INTEGER(lp_winbind_expand_groups, &Globals.winbind_expand_groups)
1951 FN_GLOBAL_BOOL(lp_winbind_refresh_tickets, &Globals.bWinbindRefreshTickets)
1952 FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon)
1953 FN_GLOBAL_BOOL(lp_winbind_normalize_names, &Globals.bWinbindNormalizeNames)
1954 FN_GLOBAL_BOOL(lp_winbind_rpc_only, &Globals.bWinbindRpcOnly)
1955
1956 FN_GLOBAL_LIST(lp_idmap_domains, &Globals.szIdmapDomains)
1957 FN_GLOBAL_LIST(lp_idmap_backend, &Globals.szIdmapBackend) /* deprecated */
1958 FN_GLOBAL_STRING(lp_idmap_alloc_backend, &Globals.szIdmapAllocBackend)
1959 FN_GLOBAL_INTEGER(lp_idmap_cache_time, &Globals.iIdmapCacheTime)
1960 FN_GLOBAL_INTEGER(lp_idmap_negative_cache_time, &Globals.iIdmapNegativeCacheTime)
1961 FN_GLOBAL_INTEGER(lp_keepalive, &Globals.iKeepalive)
1962 FN_GLOBAL_BOOL(lp_passdb_expand_explicit, &Globals.bPassdbExpandExplicit)
1963
1964 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1965 FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
1966 FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
1967 FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
1968 FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
1969 FN_GLOBAL_INTEGER(lp_ldap_replication_sleep, &Globals.ldap_replication_sleep)
1970 FN_GLOBAL_INTEGER(lp_ldap_timeout, &Globals.ldap_timeout)
1971 FN_GLOBAL_INTEGER(lp_ldap_page_size, &Globals.ldap_page_size)
1972 FN_GLOBAL_INTEGER(lp_ldap_debug_level, &Globals.ldap_debug_level)
1973 FN_GLOBAL_INTEGER(lp_ldap_debug_threshold, &Globals.ldap_debug_threshold)
1974 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
1975 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
1976 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
1977 FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
1978 FN_GLOBAL_LIST(lp_usershare_prefix_allow_list, &Globals.szUsersharePrefixAllowList)
1979 FN_GLOBAL_LIST(lp_usershare_prefix_deny_list, &Globals.szUsersharePrefixDenyList)
1980
1981 FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
1982
1983 FN_GLOBAL_BOOL(lp_registry_shares, &Globals.bRegistryShares)
1984 FN_GLOBAL_BOOL(lp_usershare_allow_guests, &Globals.bUsershareAllowGuests)
1985 FN_GLOBAL_BOOL(lp_usershare_owner_only, &Globals.bUsershareOwnerOnly)
1986 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
1987 FN_GLOBAL_BOOL(lp_reset_on_zero_vc, &Globals.bResetOnZeroVC)
1988 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1989 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1990 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1991 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1992 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1993 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1994 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1995 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1996 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1997 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1998 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1999 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
2000 FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
2001 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
2002 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
2003 FN_GLOBAL_INTEGER(lp_client_schannel, &Globals.clientSchannel)
2004 FN_GLOBAL_INTEGER(lp_server_schannel, &Globals.serverSchannel)
2005 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
2006 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
2007 FN_GLOBAL_BOOL(lp_debug_prefix_timestamp, &Globals.bDebugPrefixTimestamp)
2008 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
2009 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
2010 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
2011 FN_GLOBAL_BOOL(lp_debug_class, &Globals.bDebugClass)
2012 FN_GLOBAL_BOOL(lp_enable_core_files, &Globals.bEnableCoreFiles)
2013 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
2014 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
2015 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
2016 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
2017 FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
2018 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
2019 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
2020 FN_GLOBAL_INTEGER(lp_passwd_chat_timeout, &Globals.iPasswdChatTimeout)
2021 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
2022 FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
2023 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
2024 FN_GLOBAL_INTEGER(lp_max_stat_cache_size, &Globals.iMaxStatCacheSize)
2025 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
2026 FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
2027 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
2028 FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
2029 FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
2030 FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
2031 FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
2032 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
2033 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
2034 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
2035 FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
2036 FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
2037 FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
2038 FN_GLOBAL_BOOL(lp_client_use_spnego, &Globals.bClientUseSpnego)
2039 FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
2040 FN_LOCAL_PARM_BOOL(lp_change_notify, bChangeNotify)
2041 FN_LOCAL_PARM_BOOL(lp_kernel_change_notify, bKernelChangeNotify)
2042 FN_GLOBAL_BOOL(lp_use_kerberos_keytab, &Globals.bUseKerberosKeytab)
2043 FN_GLOBAL_BOOL(lp_defer_sharing_violations, &Globals.bDeferSharingViolations)
2044 FN_GLOBAL_BOOL(lp_enable_privileges, &Globals.bEnablePrivileges)
2045 FN_GLOBAL_BOOL(lp_enable_asu_support, &Globals.bASUSupport)
2046 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
2047 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
2048 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
2049 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
2050 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
2051 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
2052 FN_GLOBAL_INTEGER(lp_open_files_db_hash_size, &Globals.open_files_db_hash_size)
2053 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
2054 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
2055 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
2056 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
2057 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
2058 FN_GLOBAL_BOOL(lp_getwd_cache, &Globals.getwd_cache)
2059 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
2060 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
2061 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
2062 FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
2063 FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
2064 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
2065 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
2066 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
2067 FN_GLOBAL_BOOL(_lp_disable_spoolss, &Globals.bDisableSpoolss)
2068 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
2069 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
2070 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
2071 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
2072 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
2073 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
2074 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
2075 FN_GLOBAL_INTEGER(lp_lock_spin_time, &Globals.iLockSpinTime)
2076 FN_GLOBAL_INTEGER(lp_usershare_max_shares, &Globals.iUsershareMaxShares)
2077 FN_GLOBAL_CONST_STRING(lp_socket_options, &Globals.szSocketOptions)
2078 FN_GLOBAL_INTEGER(lp_config_backend, &Globals.ConfigBackend);
2079
2080 FN_LOCAL_STRING(lp_preexec, szPreExec)
2081 FN_LOCAL_STRING(lp_postexec, szPostExec)
2082 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
2083 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
2084 FN_LOCAL_STRING(lp_servicename, szService)
2085 FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
2086 FN_LOCAL_STRING(lp_pathname, szPath)
2087 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
2088 FN_LOCAL_STRING(lp_username, szUsername)
2089 FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
2090 FN_LOCAL_LIST(lp_valid_users, szValidUsers)
2091 FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
2092 FN_GLOBAL_LIST(lp_svcctl_list, &Globals.szServicesList)
2093 FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
2094 FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
2095 FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer)
2096 FN_GLOBAL_CONST_STRING(lp_ctdbd_socket, &Globals.ctdbdSocket)
2097 FN_GLOBAL_LIST(lp_cluster_addresses, &Globals.szClusterAddresses)
2098 FN_GLOBAL_BOOL(lp_clustering, &Globals.clustering);
2099 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
2100 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
2101 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
2102 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
2103 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
2104 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
2105 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
2106 static FN_LOCAL_STRING(_lp_printername, szPrintername)
2107 FN_LOCAL_CONST_STRING(lp_printjob_username, szPrintjobUsername)
2108 FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
2109 FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
2110 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
2111 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
2112 FN_LOCAL_STRING(lp_comment, comment)
2113 FN_LOCAL_STRING(lp_force_user, force_user)
2114 FN_LOCAL_STRING(lp_force_group, force_group)
2115 FN_LOCAL_LIST(lp_readlist, readlist)
2116 FN_LOCAL_LIST(lp_writelist, writelist)
2117 FN_LOCAL_LIST(lp_printer_admin, printer_admin)
2118 FN_LOCAL_STRING(lp_fstype, fstype)
2119 FN_LOCAL_LIST(lp_vfs_objects, szVfsObjects)
2120 FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
2121 static FN_LOCAL_STRING(lp_volume, volume)
2122 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
2123 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
2124 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
2125 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
2126 FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
2127 FN_LOCAL_STRING(lp_dfree_command, szDfree)
2128 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
2129 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
2130 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
2131 FN_LOCAL_INTEGER(lp_casesensitive, iCaseSensitive)
2132 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
2133 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
2134 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
2135 FN_LOCAL_BOOL(lp_hide_special_files, bHideSpecialFiles)
2136 FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
2137 FN_LOCAL_BOOL(lp_hideunwriteable_files, bHideUnWriteableFiles)
2138 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
2139 FN_LOCAL_BOOL(lp_readonly, bRead_only)
2140 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
2141 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
2142 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
2143 FN_LOCAL_BOOL(lp_hidden, bHidden)
2144 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
2145 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
2146 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
2147 FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
2148 FN_LOCAL_BOOL(lp_dmapi_support, bDmapiSupport)
2149 FN_LOCAL_PARM_BOOL(lp_locking, bLocking)
2150 FN_LOCAL_PARM_INTEGER(lp_strict_locking, iStrictLocking)
2151 FN_LOCAL_PARM_BOOL(lp_posix_locking, bPosixLocking)
2152 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
2153 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
2154 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
2155 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
2156 FN_LOCAL_PARM_BOOL(lp_manglednames, bMangledNames)
2157 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
2158 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
2159 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
2160 FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
2161 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
2162 FN_LOCAL_BOOL(lp_map_system, bMap_system)
2163 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
2164 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
2165 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
2166 FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
2167 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
2168 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
2169 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
2170 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
2171 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
2172 FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
2173 FN_LOCAL_BOOL(lp_inherit_owner, bInheritOwner)
2174 FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
2175 FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
2176 FN_LOCAL_BOOL(lp_force_printername, bForcePrintername)
2177 FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
2178 FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
2179 FN_LOCAL_BOOL(lp_ea_support, bEASupport)
2180 FN_LOCAL_BOOL(_lp_use_sendfile, bUseSendfile)
2181 FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
2182 FN_LOCAL_BOOL(lp_map_acl_inherit, bMap_acl_inherit)
2183 FN_LOCAL_BOOL(lp_afs_share, bAfs_Share)
2184 FN_LOCAL_BOOL(lp_acl_check_permissions, bAclCheckPermissions)
2185 FN_LOCAL_BOOL(lp_acl_group_control, bAclGroupControl)
2186 FN_LOCAL_BOOL(lp_acl_map_full_control, bAclMapFullControl)
2187 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
2188 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
2189 FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
2190 FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
2191 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
2192 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
2193 FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
2194 FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
2195 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
2196 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
2197 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
2198 FN_LOCAL_INTEGER(lp_printing, iPrinting)
2199 FN_LOCAL_INTEGER(lp_max_reported_jobs, iMaxReportedPrintJobs)
2200 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
2201 FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
2202 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
2203 FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
2204 FN_LOCAL_INTEGER(lp_dfree_cache_time, iDfreeCacheTime)
2205 FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size)
2206 FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
2207 FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
2208 FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
2209 FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize)
2210 FN_LOCAL_INTEGER(lp_smb_encrypt, ismb_encrypt)
2211 FN_LOCAL_CHAR(lp_magicchar, magic_char)
2212 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
2213 FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)
2214 FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
2215 FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
2216 FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
2217 FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
2218 FN_GLOBAL_INTEGER(lp_client_ldap_sasl_wrapping, &Globals.client_ldap_sasl_wrapping)
2219
2220 /* local prototypes */
2221
2222 static int map_parameter(const char *pszParmName);
2223 static int map_parameter_canonical(const char *pszParmName, bool *inverse);
2224 static bool set_boolean(bool *pb, const char *pszParmValue);
2225 static const char *get_boolean(bool bool_value);
2226 static int getservicebyname(const char *pszServiceName,
2227                             service * pserviceDest);
2228 static void copy_service(service * pserviceDest,
2229                          service * pserviceSource,
2230                          struct bitmap *pcopymapDest);
2231 static bool do_parameter(const char *pszParmName, const char *pszParmValue);
2232 static bool do_section(const char *pszSectionName);
2233 static void init_copymap(service * pservice);
2234 static bool hash_a_service(const char *name, int number);
2235 static void free_service_byindex(int iService);
2236 static char * canonicalize_servicename(const char *name);
2237 static void show_parameter(int parmIndex);
2238 static bool is_synonym_of(int parm1, int parm2, bool *inverse);
2239
2240 /* This is a helper function for parametrical options support. */
2241 /* It returns a pointer to parametrical option value if it exists or NULL otherwise */
2242 /* Actual parametrical functions are quite simple */
2243 static param_opt_struct *get_parametrics(int snum, const char *type, const char *option)
2244 {
2245         bool global_section = False;
2246         char* param_key;
2247         param_opt_struct *data;
2248         
2249         if (snum >= iNumServices) return NULL;
2250         
2251         if (snum < 0) { 
2252                 data = Globals.param_opt;
2253                 global_section = True;
2254         } else {
2255                 data = ServicePtrs[snum]->param_opt;
2256         }
2257     
2258         if (asprintf(&param_key, "%s:%s", type, option) == -1) {
2259                 DEBUG(0,("asprintf failed!\n"));
2260                 return NULL;
2261         }
2262
2263         while (data) {
2264                 if (strcmp(data->key, param_key) == 0) {
2265                         string_free(&param_key);
2266                         return data;
2267                 }
2268                 data = data->next;
2269         }
2270
2271         if (!global_section) {
2272                 /* Try to fetch the same option but from globals */
2273                 /* but only if we are not already working with Globals */
2274                 data = Globals.param_opt;
2275                 while (data) {
2276                         if (strcmp(data->key, param_key) == 0) {
2277                                 string_free(&param_key);
2278                                 return data;
2279                         }
2280                         data = data->next;
2281                 }
2282         }
2283
2284         string_free(&param_key);
2285         
2286         return NULL;
2287 }
2288
2289
2290 #define MISSING_PARAMETER(name) \
2291     DEBUG(0, ("%s(): value is NULL or empty!\n", #name))
2292
2293 /*******************************************************************
2294 convenience routine to return int parameters.
2295 ********************************************************************/
2296 static int lp_int(const char *s)
2297 {
2298
2299         if (!s || !*s) {
2300                 MISSING_PARAMETER(lp_int);
2301                 return (-1);
2302         }
2303
2304         return (int)strtol(s, NULL, 0);
2305 }
2306
2307 /*******************************************************************
2308 convenience routine to return unsigned long parameters.
2309 ********************************************************************/
2310 static unsigned long lp_ulong(const char *s)
2311 {
2312
2313         if (!s || !*s) {
2314                 MISSING_PARAMETER(lp_ulong);
2315                 return (0);
2316         }
2317
2318         return strtoul(s, NULL, 0);
2319 }
2320
2321 /*******************************************************************
2322 convenience routine to return boolean parameters.
2323 ********************************************************************/
2324 static bool lp_bool(const char *s)
2325 {
2326         bool ret = False;
2327
2328         if (!s || !*s) {
2329                 MISSING_PARAMETER(lp_bool);
2330                 return False;
2331         }
2332         
2333         if (!set_boolean(&ret,s)) {
2334                 DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
2335                 return False;
2336         }
2337
2338         return ret;
2339 }
2340
2341 /*******************************************************************
2342 convenience routine to return enum parameters.
2343 ********************************************************************/
2344 static int lp_enum(const char *s,const struct enum_list *_enum)
2345 {
2346         int i;
2347
2348         if (!s || !*s || !_enum) {
2349                 MISSING_PARAMETER(lp_enum);
2350                 return (-1);
2351         }
2352         
2353         for (i=0; _enum[i].name; i++) {
2354                 if (strequal(_enum[i].name,s))
2355                         return _enum[i].value;
2356         }
2357
2358         DEBUG(0,("lp_enum(%s,enum): value is not in enum_list!\n",s));
2359         return (-1);
2360 }
2361
2362 #undef MISSING_PARAMETER
2363
2364 /* DO NOT USE lp_parm_string ANYMORE!!!!
2365  * use lp_parm_const_string or lp_parm_talloc_string
2366  *
2367  * lp_parm_string is only used to let old modules find this symbol
2368  */
2369 #undef lp_parm_string
2370  char *lp_parm_string(const char *servicename, const char *type, const char *option);
2371  char *lp_parm_string(const char *servicename, const char *type, const char *option)
2372 {
2373         return lp_parm_talloc_string(lp_servicenumber(servicename), type, option, NULL);
2374 }
2375
2376 /* Return parametric option from a given service. Type is a part of option before ':' */
2377 /* Parametric option has following syntax: 'Type: option = value' */
2378 /* the returned value is talloced on the talloc_tos() */
2379 char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def)
2380 {
2381         param_opt_struct *data = get_parametrics(snum, type, option);
2382         
2383         if (data == NULL||data->value==NULL) {
2384                 if (def) {
2385                         return lp_string(def);
2386                 } else {
2387                         return NULL;
2388                 }
2389         }
2390
2391         return lp_string(data->value);
2392 }
2393
2394 /* Return parametric option from a given service. Type is a part of option before ':' */
2395 /* Parametric option has following syntax: 'Type: option = value' */
2396 const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def)
2397 {
2398         param_opt_struct *data = get_parametrics(snum, type, option);
2399         
2400         if (data == NULL||data->value==NULL)
2401                 return def;
2402                 
2403         return data->value;
2404 }
2405
2406 /* Return parametric option from a given service. Type is a part of option before ':' */
2407 /* Parametric option has following syntax: 'Type: option = value' */
2408
2409 const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def)
2410 {
2411         param_opt_struct *data = get_parametrics(snum, type, option);
2412
2413         if (data == NULL||data->value==NULL)
2414                 return (const char **)def;
2415                 
2416         if (data->list==NULL) {
2417                 data->list = str_list_make(NULL, data->value, NULL);
2418         }
2419
2420         return (const char **)data->list;
2421 }
2422
2423 /* Return parametric option from a given service. Type is a part of option before ':' */
2424 /* Parametric option has following syntax: 'Type: option = value' */
2425
2426 int lp_parm_int(int snum, const char *type, const char *option, int def)
2427 {
2428         param_opt_struct *data = get_parametrics(snum, type, option);
2429         
2430         if (data && data->value && *data->value)
2431                 return lp_int(data->value);
2432
2433         return def;
2434 }
2435
2436 /* Return parametric option from a given service. Type is a part of option before ':' */
2437 /* Parametric option has following syntax: 'Type: option = value' */
2438
2439 unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsigned long def)
2440 {
2441         param_opt_struct *data = get_parametrics(snum, type, option);
2442         
2443         if (data && data->value && *data->value)
2444                 return lp_ulong(data->value);
2445
2446         return def;
2447 }
2448
2449 /* Return parametric option from a given service. Type is a part of option before ':' */
2450 /* Parametric option has following syntax: 'Type: option = value' */
2451
2452 bool lp_parm_bool(int snum, const char *type, const char *option, bool def)
2453 {
2454         param_opt_struct *data = get_parametrics(snum, type, option);
2455         
2456         if (data && data->value && *data->value)
2457                 return lp_bool(data->value);
2458
2459         return def;
2460 }
2461
2462 /* Return parametric option from a given service. Type is a part of option before ':' */
2463 /* Parametric option has following syntax: 'Type: option = value' */
2464
2465 int lp_parm_enum(int snum, const char *type, const char *option,
2466                  const struct enum_list *_enum, int def)
2467 {
2468         param_opt_struct *data = get_parametrics(snum, type, option);
2469         
2470         if (data && data->value && *data->value && _enum)
2471                 return lp_enum(data->value, _enum);
2472
2473         return def;
2474 }
2475
2476
2477 /***************************************************************************
2478  Initialise a service to the defaults.
2479 ***************************************************************************/
2480
2481 static void init_service(service * pservice)
2482 {
2483         memset((char *)pservice, '\0', sizeof(service));
2484         copy_service(pservice, &sDefault, NULL);
2485 }
2486
2487 /***************************************************************************
2488  Free the dynamically allocated parts of a service struct.
2489 ***************************************************************************/
2490
2491 static void free_service(service *pservice)
2492 {
2493         int i;
2494         param_opt_struct *data, *pdata;
2495         if (!pservice)
2496                 return;
2497
2498         if (pservice->szService)
2499                 DEBUG(5, ("free_service: Freeing service %s\n",
2500                        pservice->szService));
2501
2502         string_free(&pservice->szService);
2503         bitmap_free(pservice->copymap);
2504
2505         for (i = 0; parm_table[i].label; i++) {
2506                 if ((parm_table[i].type == P_STRING ||
2507                      parm_table[i].type == P_USTRING) &&
2508                     parm_table[i].p_class == P_LOCAL)
2509                         string_free((char **)
2510                                     (((char *)pservice) +
2511                                      PTR_DIFF(parm_table[i].ptr, &sDefault)));
2512                 else if (parm_table[i].type == P_LIST &&
2513                          parm_table[i].p_class == P_LOCAL)
2514                              TALLOC_FREE(*((char ***)
2515                                            (((char *)pservice) +
2516                                             PTR_DIFF(parm_table[i].ptr,
2517                                                      &sDefault))));
2518         }
2519
2520         data = pservice->param_opt;
2521         if (data)
2522                 DEBUG(5,("Freeing parametrics:\n"));
2523         while (data) {
2524                 DEBUG(5,("[%s = %s]\n", data->key, data->value));
2525                 string_free(&data->key);
2526                 string_free(&data->value);
2527                 TALLOC_FREE(data->list);
2528                 pdata = data->next;
2529                 SAFE_FREE(data);
2530                 data = pdata;
2531         }
2532
2533         ZERO_STRUCTP(pservice);
2534 }
2535
2536
2537 /***************************************************************************
2538  remove a service indexed in the ServicePtrs array from the ServiceHash
2539  and free the dynamically allocated parts
2540 ***************************************************************************/
2541
2542 static void free_service_byindex(int idx)
2543 {
2544         if ( !LP_SNUM_OK(idx) ) 
2545                 return;
2546
2547         ServicePtrs[idx]->valid = False;
2548         invalid_services[num_invalid_services++] = idx;
2549
2550         /* we have to cleanup the hash record */
2551
2552         if (ServicePtrs[idx]->szService) {
2553                 char *canon_name = canonicalize_servicename(
2554                         ServicePtrs[idx]->szService );
2555                 
2556                 dbwrap_delete_bystring(ServiceHash, canon_name );
2557                 TALLOC_FREE(canon_name);
2558         }
2559
2560         free_service(ServicePtrs[idx]);
2561 }
2562
2563 /***************************************************************************
2564  Add a new service to the services array initialising it with the given 
2565  service. 
2566 ***************************************************************************/
2567
2568 static int add_a_service(const service *pservice, const char *name)
2569 {
2570         int i;
2571         service tservice;
2572         int num_to_alloc = iNumServices + 1;
2573         param_opt_struct *data, *pdata;
2574
2575         tservice = *pservice;
2576
2577         /* it might already exist */
2578         if (name) {
2579                 i = getservicebyname(name, NULL);
2580                 if (i >= 0) {
2581                         /* Clean all parametric options for service */
2582                         /* They will be added during parsing again */
2583                         data = ServicePtrs[i]->param_opt;
2584                         while (data) {
2585                                 string_free(&data->key);
2586                                 string_free(&data->value);
2587                                 TALLOC_FREE(data->list);
2588                                 pdata = data->next;
2589                                 SAFE_FREE(data);
2590                                 data = pdata;
2591                         }
2592                         ServicePtrs[i]->param_opt = NULL;
2593                         return (i);
2594                 }
2595         }
2596
2597         /* find an invalid one */
2598         i = iNumServices;
2599         if (num_invalid_services > 0) {
2600                 i = invalid_services[--num_invalid_services];
2601         }
2602
2603         /* if not, then create one */
2604         if (i == iNumServices) {
2605                 service **tsp;
2606                 int *tinvalid;
2607                 
2608                 tsp = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(ServicePtrs, service *, num_to_alloc);
2609                 if (tsp == NULL) {
2610                         DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
2611                         return (-1);
2612                 }
2613                 ServicePtrs = tsp;
2614                 ServicePtrs[iNumServices] = SMB_MALLOC_P(service);
2615                 if (!ServicePtrs[iNumServices]) {
2616                         DEBUG(0,("add_a_service: out of memory!\n"));
2617                         return (-1);
2618                 }
2619                 iNumServices++;
2620
2621                 /* enlarge invalid_services here for now... */
2622                 tinvalid = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(invalid_services, int,
2623                                              num_to_alloc);
2624                 if (tinvalid == NULL) {
2625                         DEBUG(0,("add_a_service: failed to enlarge "
2626                                  "invalid_services!\n"));
2627                         return (-1);
2628                 }
2629                 invalid_services = tinvalid;
2630         } else {
2631                 free_service_byindex(i);
2632         }
2633
2634         ServicePtrs[i]->valid = True;
2635
2636         init_service(ServicePtrs[i]);
2637         copy_service(ServicePtrs[i], &tservice, NULL);
2638         if (name)
2639                 string_set(&ServicePtrs[i]->szService, name);
2640                 
2641         DEBUG(8,("add_a_service: Creating snum = %d for %s\n", 
2642                 i, ServicePtrs[i]->szService));
2643
2644         if (!hash_a_service(ServicePtrs[i]->szService, i)) {
2645                 return (-1);
2646         }
2647                 
2648         return (i);
2649 }
2650
2651 /***************************************************************************
2652   Convert a string to uppercase and remove whitespaces.
2653 ***************************************************************************/
2654
2655 static char *canonicalize_servicename(const char *src)
2656 {
2657         char *result;
2658
2659         if ( !src ) {
2660                 DEBUG(0,("canonicalize_servicename: NULL source name!\n"));
2661                 return NULL;
2662         }
2663
2664         result = talloc_strdup(talloc_tos(), src);
2665         SMB_ASSERT(result != NULL);
2666
2667         strlower_m(result);
2668         return result;
2669 }
2670
2671 /***************************************************************************
2672   Add a name/index pair for the services array to the hash table.
2673 ***************************************************************************/
2674
2675 static bool hash_a_service(const char *name, int idx)
2676 {
2677         char *canon_name;
2678
2679         if ( !ServiceHash ) {
2680                 DEBUG(10,("hash_a_service: creating servicehash\n"));
2681                 ServiceHash = db_open_rbt(NULL);
2682                 if ( !ServiceHash ) {
2683                         DEBUG(0,("hash_a_service: open tdb servicehash failed!\n"));
2684                         return False;
2685                 }
2686         }
2687
2688         DEBUG(10,("hash_a_service: hashing index %d for service name %s\n",
2689                 idx, name));
2690
2691         canon_name = canonicalize_servicename( name );
2692
2693         dbwrap_store_bystring(ServiceHash, canon_name,
2694                               make_tdb_data((uint8 *)&idx, sizeof(idx)),
2695                               TDB_REPLACE);
2696
2697         TALLOC_FREE(canon_name);
2698
2699         return True;
2700 }
2701
2702 /***************************************************************************
2703  Add a new home service, with the specified home directory, defaults coming
2704  from service ifrom.
2705 ***************************************************************************/
2706
2707 bool lp_add_home(const char *pszHomename, int iDefaultService,
2708                  const char *user, const char *pszHomedir)
2709 {
2710         int i;
2711
2712         i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
2713
2714         if (i < 0)
2715                 return (False);
2716
2717         if (!(*(ServicePtrs[iDefaultService]->szPath))
2718             || strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(GLOBAL_SECTION_SNUM))) {
2719                 string_set(&ServicePtrs[i]->szPath, pszHomedir);
2720         }
2721
2722         if (!(*(ServicePtrs[i]->comment))) {
2723                 char *comment = NULL;
2724                 if (asprintf(&comment, "Home directory of %s", user) < 0) {
2725                         return false;
2726                 }
2727                 string_set(&ServicePtrs[i]->comment, comment);
2728                 SAFE_FREE(comment);
2729         }
2730
2731         /* set the browseable flag from the global default */
2732
2733         ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2734
2735         ServicePtrs[i]->autoloaded = True;
2736
2737         DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename, 
2738                user, ServicePtrs[i]->szPath ));
2739
2740         return (True);
2741 }
2742
2743 /***************************************************************************
2744  Add a new service, based on an old one.
2745 ***************************************************************************/
2746
2747 int lp_add_service(const char *pszService, int iDefaultService)
2748 {
2749         if (iDefaultService < 0) {
2750                 return add_a_service(&sDefault, pszService);
2751         }
2752
2753         return (add_a_service(ServicePtrs[iDefaultService], pszService));
2754 }
2755
2756 /***************************************************************************
2757  Add the IPC service.
2758 ***************************************************************************/
2759
2760 static bool lp_add_ipc(const char *ipc_name, bool guest_ok)
2761 {
2762         char *comment = NULL;
2763         int i = add_a_service(&sDefault, ipc_name);
2764
2765         if (i < 0)
2766                 return (False);
2767
2768         if (asprintf(&comment, "IPC Service (%s)",
2769                                 Globals.szServerString) < 0) {
2770                 return (False);
2771         }
2772
2773         string_set(&ServicePtrs[i]->szPath, tmpdir());
2774         string_set(&ServicePtrs[i]->szUsername, "");
2775         string_set(&ServicePtrs[i]->comment, comment);
2776         string_set(&ServicePtrs[i]->fstype, "IPC");
2777         ServicePtrs[i]->iMaxConnections = 0;
2778         ServicePtrs[i]->bAvailable = True;
2779         ServicePtrs[i]->bRead_only = True;
2780         ServicePtrs[i]->bGuest_only = False;
2781         ServicePtrs[i]->bHidden = True;
2782         ServicePtrs[i]->bGuest_ok = guest_ok;
2783         ServicePtrs[i]->bPrint_ok = False;
2784         ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2785
2786         DEBUG(3, ("adding IPC service\n"));
2787
2788         SAFE_FREE(comment);
2789         return (True);
2790 }
2791
2792 /***************************************************************************
2793  Add a new printer service, with defaults coming from service iFrom.
2794 ***************************************************************************/
2795
2796 bool lp_add_printer(const char *pszPrintername, int iDefaultService)
2797 {
2798         const char *comment = "From Printcap";
2799         int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
2800
2801         if (i < 0)
2802                 return (False);
2803
2804         /* note that we do NOT default the availability flag to True - */
2805         /* we take it from the default service passed. This allows all */
2806         /* dynamic printers to be disabled by disabling the [printers] */
2807         /* entry (if/when the 'available' keyword is implemented!).    */
2808
2809         /* the printer name is set to the service name. */
2810         string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
2811         string_set(&ServicePtrs[i]->comment, comment);
2812
2813         /* set the browseable flag from the gloabl default */
2814         ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2815
2816         /* Printers cannot be read_only. */
2817         ServicePtrs[i]->bRead_only = False;
2818         /* No share modes on printer services. */
2819         ServicePtrs[i]->bShareModes = False;
2820         /* No oplocks on printer services. */
2821         ServicePtrs[i]->bOpLocks = False;
2822         /* Printer services must be printable. */
2823         ServicePtrs[i]->bPrint_ok = True;
2824         
2825         DEBUG(3, ("adding printer service %s\n", pszPrintername));
2826
2827         return (True);
2828 }
2829
2830
2831 /***************************************************************************
2832  Check whether the given parameter name is valid.
2833  Parametric options (names containing a colon) are considered valid.
2834 ***************************************************************************/
2835
2836 bool lp_parameter_is_valid(const char *pszParmName)
2837 {
2838         return ((map_parameter(pszParmName) != -1) ||
2839                 (strchr(pszParmName, ':') != NULL));
2840 }
2841
2842 /***************************************************************************
2843  Check whether the given name is the name of a global parameter.
2844  Returns True for strings belonging to parameters of class
2845  P_GLOBAL, False for all other strings, also for parametric options
2846  and strings not belonging to any option.
2847 ***************************************************************************/
2848
2849 bool lp_parameter_is_global(const char *pszParmName)
2850 {
2851         int num = map_parameter(pszParmName);
2852
2853         if (num >= 0) {
2854                 return (parm_table[num].p_class == P_GLOBAL);
2855         }
2856
2857         return False;
2858 }
2859
2860 /**************************************************************************
2861  Check whether the given name is the canonical name of a parameter.
2862  Returns False if it is not a valid parameter Name.
2863  For parametric options, True is returned.
2864 **************************************************************************/
2865
2866 bool lp_parameter_is_canonical(const char *parm_name)
2867 {
2868         if (!lp_parameter_is_valid(parm_name)) {
2869                 return False;
2870         }
2871
2872         return (map_parameter(parm_name) ==
2873                 map_parameter_canonical(parm_name, NULL));
2874 }
2875
2876 /**************************************************************************
2877  Determine the canonical name for a parameter.
2878  Indicate when it is an inverse (boolean) synonym instead of a
2879  "usual" synonym.
2880 **************************************************************************/
2881
2882 bool lp_canonicalize_parameter(const char *parm_name, const char **canon_parm,
2883                                bool *inverse)
2884 {
2885         int num;
2886
2887         if (!lp_parameter_is_valid(parm_name)) {
2888                 *canon_parm = NULL;
2889                 return False;
2890         }
2891
2892         num = map_parameter_canonical(parm_name, inverse);
2893         if (num < 0) {
2894                 /* parametric option */
2895                 *canon_parm = parm_name;
2896         } else {
2897                 *canon_parm = parm_table[num].label;
2898         }
2899
2900         return True;
2901
2902 }
2903
2904 /**************************************************************************
2905  Determine the canonical name for a parameter.
2906  Turn the value given into the inverse boolean expression when
2907  the synonym is an invers boolean synonym.
2908
2909  Return True if parm_name is a valid parameter name and
2910  in case it is an invers boolean synonym, if the val string could
2911  successfully be converted to the reverse bool.
2912  Return false in all other cases.
2913 **************************************************************************/
2914
2915 bool lp_canonicalize_parameter_with_value(const char *parm_name,
2916                                           const char *val,
2917                                           const char **canon_parm,
2918                                           const char **canon_val)
2919 {
2920         int num;
2921         bool inverse;
2922
2923         if (!lp_parameter_is_valid(parm_name)) {
2924                 *canon_parm = NULL;
2925                 *canon_val = NULL;
2926                 return False;
2927         }
2928
2929         num = map_parameter_canonical(parm_name, &inverse);
2930         if (num < 0) {
2931                 /* parametric option */
2932                 *canon_parm = parm_name;
2933                 *canon_val = val;
2934         } else {
2935                 *canon_parm = parm_table[num].label;
2936                 if (inverse) {
2937                         if (!lp_invert_boolean(val, canon_val)) {
2938                                 *canon_val = NULL;
2939                                 return False;
2940                         }
2941                 } else {
2942                         *canon_val = val;
2943                 }
2944         }
2945
2946         return True;
2947 }
2948
2949 /***************************************************************************
2950  Map a parameter's string representation to something we can use. 
2951  Returns False if the parameter string is not recognised, else TRUE.
2952 ***************************************************************************/
2953
2954 static int map_parameter(const char *pszParmName)
2955 {
2956         int iIndex;
2957
2958         if (*pszParmName == '-')
2959                 return (-1);
2960
2961         for (iIndex = 0; parm_table[iIndex].label; iIndex++)
2962                 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
2963                         return (iIndex);
2964
2965         /* Warn only if it isn't parametric option */
2966         if (strchr(pszParmName, ':') == NULL)
2967                 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
2968         /* We do return 'fail' for parametric options as well because they are
2969            stored in different storage
2970          */
2971         return (-1);
2972 }
2973
2974 /***************************************************************************
2975  Map a parameter's string representation to the index of the canonical
2976  form of the parameter (it might be a synonym).
2977  Returns -1 if the parameter string is not recognised.
2978 ***************************************************************************/
2979
2980 static int map_parameter_canonical(const char *pszParmName, bool *inverse)
2981 {
2982         int parm_num, canon_num;
2983         bool loc_inverse = False;
2984
2985         parm_num = map_parameter(pszParmName);
2986         if ((parm_num < 0) || !(parm_table[parm_num].flags & FLAG_HIDE)) {
2987                 /* invalid, parametric or no canidate for synonyms ... */
2988                 goto done;
2989         }
2990
2991         for (canon_num = 0; parm_table[canon_num].label; canon_num++) {
2992                 if (is_synonym_of(parm_num, canon_num, &loc_inverse)) {
2993                         parm_num = canon_num;
2994                         goto done;
2995                 }
2996         }
2997
2998 done:
2999         if (inverse != NULL) {
3000                 *inverse = loc_inverse;
3001         }
3002         return parm_num;
3003 }
3004
3005 /***************************************************************************
3006  return true if parameter number parm1 is a synonym of parameter
3007  number parm2 (parm2 being the principal name).
3008  set inverse to True if parm1 is P_BOOLREV and parm2 is P_BOOL,
3009  False otherwise.
3010 ***************************************************************************/
3011
3012 static bool is_synonym_of(int parm1, int parm2, bool *inverse)
3013 {
3014         if ((parm_table[parm1].ptr == parm_table[parm2].ptr) &&
3015             (parm_table[parm1].flags & FLAG_HIDE) &&
3016             !(parm_table[parm2].flags & FLAG_HIDE))
3017         {
3018                 if (inverse != NULL) {
3019                         if ((parm_table[parm1].type == P_BOOLREV) &&
3020                             (parm_table[parm2].type == P_BOOL))
3021                         {
3022                                 *inverse = True;
3023                         } else {
3024                                 *inverse = False;
3025                         }
3026                 }
3027                 return True;
3028         }
3029         return False;
3030 }
3031
3032 /***************************************************************************
3033  Show one parameter's name, type, [values,] and flags.
3034  (helper functions for show_parameter_list)
3035 ***************************************************************************/
3036
3037 static void show_parameter(int parmIndex)
3038 {
3039         int enumIndex, flagIndex;
3040         int parmIndex2;
3041         bool hadFlag;
3042         bool hadSyn;
3043         bool inverse;
3044         const char *type[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
3045                 "P_OCTAL", "P_LIST", "P_STRING", "P_USTRING",
3046                 "P_ENUM", "P_SEP"};
3047         unsigned flags[] = { FLAG_BASIC, FLAG_SHARE, FLAG_PRINT, FLAG_GLOBAL,
3048                 FLAG_WIZARD, FLAG_ADVANCED, FLAG_DEVELOPER, FLAG_DEPRECATED,
3049                 FLAG_HIDE, FLAG_DOS_STRING};
3050         const char *flag_names[] = { "FLAG_BASIC", "FLAG_SHARE", "FLAG_PRINT",
3051                 "FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
3052                 "FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL};
3053
3054         printf("%s=%s", parm_table[parmIndex].label,
3055                type[parm_table[parmIndex].type]);
3056         if (parm_table[parmIndex].type == P_ENUM) {
3057                 printf(",");
3058                 for (enumIndex=0;
3059                      parm_table[parmIndex].enum_list[enumIndex].name;
3060                      enumIndex++)
3061                 {
3062                         printf("%s%s",
3063                                enumIndex ? "|" : "",
3064                                parm_table[parmIndex].enum_list[enumIndex].name);
3065                 }
3066         }
3067         printf(",");
3068         hadFlag = False;
3069         for (flagIndex=0; flag_names[flagIndex]; flagIndex++) {
3070                 if (parm_table[parmIndex].flags & flags[flagIndex]) {
3071                         printf("%s%s",
3072                                 hadFlag ? "|" : "",
3073                                 flag_names[flagIndex]);
3074                         hadFlag = True;
3075                 }
3076         }
3077
3078         /* output synonyms */
3079         hadSyn = False;
3080         for (parmIndex2=0; parm_table[parmIndex2].label; parmIndex2++) {
3081                 if (is_synonym_of(parmIndex, parmIndex2, &inverse)) {
3082                         printf(" (%ssynonym of %s)", inverse ? "inverse " : "",
3083                                parm_table[parmIndex2].label);
3084                 } else if (is_synonym_of(parmIndex2, parmIndex, &inverse)) {
3085                         if (!hadSyn) {
3086                                 printf(" (synonyms: ");
3087                                 hadSyn = True;
3088                         } else {
3089                                 printf(", ");
3090                         }
3091                         printf("%s%s", parm_table[parmIndex2].label,
3092                                inverse ? "[i]" : "");
3093                 }
3094         }
3095         if (hadSyn) {
3096                 printf(")");
3097         }
3098
3099         printf("\n");
3100 }
3101
3102 /***************************************************************************
3103  Show all parameter's name, type, [values,] and flags.
3104 ***************************************************************************/
3105
3106 void show_parameter_list(void)
3107 {
3108         int classIndex, parmIndex;
3109         const char *section_names[] = { "local", "global", NULL};
3110
3111         for (classIndex=0; section_names[classIndex]; classIndex++) {
3112                 printf("[%s]\n", section_names[classIndex]);
3113                 for (parmIndex = 0; parm_table[parmIndex].label; parmIndex++) {
3114                         if (parm_table[parmIndex].p_class == classIndex) {
3115                                 show_parameter(parmIndex);
3116                         }
3117                 }
3118         }
3119 }
3120
3121 /***************************************************************************
3122  Set a boolean variable from the text value stored in the passed string.
3123  Returns True in success, False if the passed string does not correctly 
3124  represent a boolean.
3125 ***************************************************************************/
3126
3127 static bool set_boolean(bool *pb, const char *pszParmValue)
3128 {
3129         bool bRetval;
3130         bool value;
3131
3132         bRetval = True;
3133         value = False;
3134         if (strwicmp(pszParmValue, "yes") == 0 ||
3135             strwicmp(pszParmValue, "true") == 0 ||
3136             strwicmp(pszParmValue, "1") == 0)
3137                 value = True;
3138         else if (strwicmp(pszParmValue, "no") == 0 ||
3139                     strwicmp(pszParmValue, "False") == 0 ||
3140                     strwicmp(pszParmValue, "0") == 0)
3141                 value = False;
3142         else {
3143                 DEBUG(2,
3144                       ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
3145                        pszParmValue));
3146                 bRetval = False;
3147         }
3148
3149         if ((pb != NULL) && (bRetval != False)) {
3150                 *pb = value;
3151         }
3152
3153         return (bRetval);
3154 }
3155
3156
3157 /***************************************************************************
3158  Check if a given string correctly represents a boolean value.
3159 ***************************************************************************/
3160
3161 bool lp_string_is_valid_boolean(const char *parm_value)
3162 {
3163         return set_boolean(NULL, parm_value);
3164 }
3165
3166 /***************************************************************************
3167  Get the standard string representation of a boolean value ("yes" or "no")
3168 ***************************************************************************/
3169
3170 static const char *get_boolean(bool bool_value)
3171 {
3172         static const char *yes_str = "yes";
3173         static const char *no_str = "no";
3174
3175         return (bool_value ? yes_str : no_str);
3176 }
3177
3178 /***************************************************************************
3179  Provide the string of the negated boolean value associated to the boolean
3180  given as a string. Returns False if the passed string does not correctly
3181  represent a boolean.
3182 ***************************************************************************/
3183
3184 bool lp_invert_boolean(const char *str, const char **inverse_str)
3185 {
3186         bool val;
3187
3188         if (!set_boolean(&val, str)) {
3189                 return False;
3190         }
3191
3192         *inverse_str = get_boolean(!val);
3193         return True;
3194 }
3195
3196 /***************************************************************************
3197  Provide the canonical string representation of a boolean value given
3198  as a string. Return True on success, False if the string given does
3199  not correctly represent a boolean.
3200 ***************************************************************************/
3201
3202 bool lp_canonicalize_boolean(const char *str, const char**canon_str)
3203 {
3204         bool val;
3205
3206         if (!set_boolean(&val, str)) {
3207                 return False;
3208         }
3209
3210         *canon_str = get_boolean(val);
3211         return True;
3212 }
3213
3214 /***************************************************************************
3215 Find a service by name. Otherwise works like get_service.
3216 ***************************************************************************/
3217
3218 static int getservicebyname(const char *pszServiceName, service * pserviceDest)
3219 {
3220         int iService = -1;
3221         char *canon_name;
3222         TDB_DATA data;
3223
3224         if (ServiceHash == NULL) {
3225                 return -1;
3226         }
3227
3228         canon_name = canonicalize_servicename(pszServiceName);
3229
3230         data = dbwrap_fetch_bystring(ServiceHash, canon_name, canon_name);
3231
3232         if ((data.dptr != NULL) && (data.dsize == sizeof(iService))) {
3233                 iService = *(int *)data.dptr;
3234         }
3235
3236         TALLOC_FREE(canon_name);
3237
3238         if ((iService != -1) && (LP_SNUM_OK(iService))
3239             && (pserviceDest != NULL)) {
3240                 copy_service(pserviceDest, ServicePtrs[iService], NULL);
3241         }
3242
3243         return (iService);