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