WHATSNEW: Update changes since 3.2.0rc1.
[Samba.git] / source / param / loadparm.c
blobc6a748933f6b5d6559a410ed61e563a433f411e5
1 /*
2 Unix SMB/CIFS implementation.
3 Parameter loading functions
4 Copyright (C) Karl Auer 1993-1998
6 Largely re-written by Andrew Tridgell, September 1994
8 Copyright (C) Simo Sorce 2001
9 Copyright (C) Alexander Bokovoy 2002
10 Copyright (C) Stefan (metze) Metzmacher 2002
11 Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
12 Copyright (C) Michael Adam 2008
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 3 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program. If not, see <http://www.gnu.org/licenses/>.
29 * Load parameters.
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.
35 * To add a parameter:
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
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!
54 #include "includes.h"
56 bool bLoaded = False;
58 extern enum protocol_types Protocol;
59 extern userdom_struct current_user_info;
61 #ifndef GLOBAL_NAME
62 #define GLOBAL_NAME "global"
63 #endif
65 #ifndef PRINTERS_NAME
66 #define PRINTERS_NAME "printers"
67 #endif
69 #ifndef HOMES_NAME
70 #define HOMES_NAME "homes"
71 #endif
73 /* the special value for the include parameter
74 * to be interpreted not as a file name but to
75 * trigger loading of the global smb.conf options
76 * from registry. */
77 #ifndef INCLUDE_REGISTRY_NAME
78 #define INCLUDE_REGISTRY_NAME "registry"
79 #endif
81 static bool in_client = False; /* Not in the client by default */
82 static struct smbconf_csn conf_last_csn;
83 static struct smbconf_ctx *conf_ctx = NULL;
85 #define CONFIG_BACKEND_FILE 0
86 #define CONFIG_BACKEND_REGISTRY 1
88 static int config_backend = CONFIG_BACKEND_FILE;
90 /* some helpful bits */
91 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
92 #define VALID(i) (ServicePtrs != NULL && ServicePtrs[i]->valid)
94 #define USERSHARE_VALID 1
95 #define USERSHARE_PENDING_DELETE 2
97 extern int extra_time_offset;
99 static bool defaults_saved = False;
101 typedef struct _param_opt_struct param_opt_struct;
102 struct _param_opt_struct {
103 param_opt_struct *prev, *next;
104 char *key;
105 char *value;
106 char **list;
110 * This structure describes global (ie., server-wide) parameters.
112 struct global {
113 int ConfigBackend;
114 char *smb_ports;
115 char *dos_charset;
116 char *unix_charset;
117 char *display_charset;
118 char *szPrintcapname;
119 char *szAddPortCommand;
120 char *szEnumPortsCommand;
121 char *szAddPrinterCommand;
122 char *szDeletePrinterCommand;
123 char *szOs2DriverMap;
124 char *szLockDir;
125 char *szPidDir;
126 char *szRootdir;
127 char *szDefaultService;
128 char *szGetQuota;
129 char *szSetQuota;
130 char *szMsgCommand;
131 char *szServerString;
132 char *szAutoServices;
133 char *szPasswdProgram;
134 char *szPasswdChat;
135 char *szLogFile;
136 char *szConfigFile;
137 char *szSMBPasswdFile;
138 char *szPrivateDir;
139 char *szPassdbBackend;
140 char **szPreloadModules;
141 char *szPasswordServer;
142 char *szSocketOptions;
143 char *szRealm;
144 char *szAfsUsernameMap;
145 int iAfsTokenLifetime;
146 char *szLogNtTokenCommand;
147 char *szUsernameMap;
148 char *szLogonScript;
149 char *szLogonPath;
150 char *szLogonDrive;
151 char *szLogonHome;
152 char **szWINSservers;
153 char **szInterfaces;
154 char *szRemoteAnnounce;
155 char *szRemoteBrowseSync;
156 char *szSocketAddress;
157 char *szNISHomeMapName;
158 char *szAnnounceVersion; /* This is initialised in init_globals */
159 char *szWorkgroup;
160 char *szNetbiosName;
161 char **szNetbiosAliases;
162 char *szNetbiosScope;
163 char *szNameResolveOrder;
164 char *szPanicAction;
165 char *szAddUserScript;
166 char *szRenameUserScript;
167 char *szDelUserScript;
168 char *szAddGroupScript;
169 char *szDelGroupScript;
170 char *szAddUserToGroupScript;
171 char *szDelUserFromGroupScript;
172 char *szSetPrimaryGroupScript;
173 char *szAddMachineScript;
174 char *szShutdownScript;
175 char *szAbortShutdownScript;
176 char *szUsernameMapScript;
177 char *szCheckPasswordScript;
178 char *szWINSHook;
179 char *szUtmpDir;
180 char *szWtmpDir;
181 bool bUtmp;
182 char *szIdmapUID;
183 char *szIdmapGID;
184 bool bPassdbExpandExplicit;
185 int AlgorithmicRidBase;
186 char *szTemplateHomedir;
187 char *szTemplateShell;
188 char *szWinbindSeparator;
189 bool bWinbindEnumUsers;
190 bool bWinbindEnumGroups;
191 bool bWinbindUseDefaultDomain;
192 bool bWinbindTrustedDomainsOnly;
193 bool bWinbindNestedGroups;
194 int winbind_expand_groups;
195 bool bWinbindRefreshTickets;
196 bool bWinbindOfflineLogon;
197 bool bWinbindNormalizeNames;
198 bool bWinbindRpcOnly;
199 char **szIdmapDomains;
200 char **szIdmapBackend; /* deprecated */
201 char *szIdmapAllocBackend;
202 char *szAddShareCommand;
203 char *szChangeShareCommand;
204 char *szDeleteShareCommand;
205 char **szEventLogs;
206 char *szGuestaccount;
207 char *szManglingMethod;
208 char **szServicesList;
209 char *szUsersharePath;
210 char *szUsershareTemplateShare;
211 char **szUsersharePrefixAllowList;
212 char **szUsersharePrefixDenyList;
213 int mangle_prefix;
214 int max_log_size;
215 char *szLogLevel;
216 int max_xmit;
217 int max_mux;
218 int max_open_files;
219 int open_files_db_hash_size;
220 int pwordlevel;
221 int unamelevel;
222 int deadtime;
223 bool getwd_cache;
224 int maxprotocol;
225 int minprotocol;
226 int security;
227 char **AuthMethods;
228 bool paranoid_server_security;
229 int maxdisksize;
230 int lpqcachetime;
231 int iMaxSmbdProcesses;
232 bool bDisableSpoolss;
233 int syslog;
234 int os_level;
235 bool enhanced_browsing;
236 int max_ttl;
237 int max_wins_ttl;
238 int min_wins_ttl;
239 int lm_announce;
240 int lm_interval;
241 int announce_as; /* This is initialised in init_globals */
242 int machine_password_timeout;
243 int map_to_guest;
244 int oplock_break_wait_time;
245 int winbind_cache_time;
246 int winbind_max_idle_children;
247 char **szWinbindNssInfo;
248 int iLockSpinTime;
249 char *szLdapMachineSuffix;
250 char *szLdapUserSuffix;
251 char *szLdapIdmapSuffix;
252 char *szLdapGroupSuffix;
253 int ldap_ssl;
254 char *szLdapSuffix;
255 char *szLdapAdminDn;
256 int ldap_debug_level;
257 int ldap_debug_threshold;
258 int iAclCompat;
259 char *szCupsServer;
260 char *szIPrintServer;
261 char *ctdbdSocket;
262 char **szClusterAddresses;
263 bool clustering;
264 int ldap_passwd_sync;
265 int ldap_replication_sleep;
266 int ldap_timeout; /* This is initialised in init_globals */
267 int ldap_connection_timeout;
268 int ldap_page_size;
269 bool ldap_delete_dn;
270 bool bMsAddPrinterWizard;
271 bool bDNSproxy;
272 bool bWINSsupport;
273 bool bWINSproxy;
274 bool bLocalMaster;
275 int iPreferredMaster;
276 int iDomainMaster;
277 bool bDomainLogons;
278 bool bEncryptPasswords;
279 bool bUpdateEncrypt;
280 int clientSchannel;
281 int serverSchannel;
282 bool bNullPasswords;
283 bool bObeyPamRestrictions;
284 bool bLoadPrinters;
285 int PrintcapCacheTime;
286 bool bLargeReadwrite;
287 bool bReadRaw;
288 bool bWriteRaw;
289 bool bSyslogOnly;
290 bool bBrowseList;
291 bool bNISHomeMap;
292 bool bTimeServer;
293 bool bBindInterfacesOnly;
294 bool bPamPasswordChange;
295 bool bUnixPasswdSync;
296 bool bPasswdChatDebug;
297 int iPasswdChatTimeout;
298 bool bTimestampLogs;
299 bool bNTSmbSupport;
300 bool bNTPipeSupport;
301 bool bNTStatusSupport;
302 bool bStatCache;
303 int iMaxStatCacheSize;
304 bool bKernelOplocks;
305 bool bAllowTrustedDomains;
306 bool bLanmanAuth;
307 bool bNTLMAuth;
308 bool bUseSpnego;
309 bool bClientLanManAuth;
310 bool bClientNTLMv2Auth;
311 bool bClientPlaintextAuth;
312 bool bClientUseSpnego;
313 bool bDebugPrefixTimestamp;
314 bool bDebugHiresTimestamp;
315 bool bDebugPid;
316 bool bDebugUid;
317 bool bDebugClass;
318 bool bEnableCoreFiles;
319 bool bHostMSDfs;
320 bool bUseMmap;
321 bool bHostnameLookups;
322 bool bUnixExtensions;
323 bool bDisableNetbios;
324 bool bUseKerberosKeytab;
325 bool bDeferSharingViolations;
326 bool bEnablePrivileges;
327 bool bASUSupport;
328 bool bUsershareOwnerOnly;
329 bool bUsershareAllowGuests;
330 bool bRegistryShares;
331 int restrict_anonymous;
332 int name_cache_timeout;
333 int client_signing;
334 int server_signing;
335 int client_ldap_sasl_wrapping;
336 int iUsershareMaxShares;
337 int iIdmapCacheTime;
338 int iIdmapNegativeCacheTime;
339 bool bResetOnZeroVC;
340 int iKeepalive;
341 int iminreceivefile;
342 param_opt_struct *param_opt;
345 static struct global Globals;
348 * This structure describes a single service.
350 struct service {
351 bool valid;
352 bool autoloaded;
353 int usershare;
354 time_t usershare_last_mod;
355 char *szService;
356 char *szPath;
357 char *szUsername;
358 char **szInvalidUsers;
359 char **szValidUsers;
360 char **szAdminUsers;
361 char *szCopy;
362 char *szInclude;
363 char *szPreExec;
364 char *szPostExec;
365 char *szRootPreExec;
366 char *szRootPostExec;
367 char *szCupsOptions;
368 char *szPrintcommand;
369 char *szLpqcommand;
370 char *szLprmcommand;
371 char *szLppausecommand;
372 char *szLpresumecommand;
373 char *szQueuepausecommand;
374 char *szQueueresumecommand;
375 char *szPrintername;
376 char *szPrintjobUsername;
377 char *szDontdescend;
378 char **szHostsallow;
379 char **szHostsdeny;
380 char *szMagicScript;
381 char *szMagicOutput;
382 char *szVetoFiles;
383 char *szHideFiles;
384 char *szVetoOplockFiles;
385 char *comment;
386 char *force_user;
387 char *force_group;
388 char **readlist;
389 char **writelist;
390 char **printer_admin;
391 char *volume;
392 char *fstype;
393 char **szVfsObjects;
394 char *szMSDfsProxy;
395 char *szAioWriteBehind;
396 char *szDfree;
397 int iMinPrintSpace;
398 int iMaxPrintJobs;
399 int iMaxReportedPrintJobs;
400 int iWriteCacheSize;
401 int iCreate_mask;
402 int iCreate_force_mode;
403 int iSecurity_mask;
404 int iSecurity_force_mode;
405 int iDir_mask;
406 int iDir_force_mode;
407 int iDir_Security_mask;
408 int iDir_Security_force_mode;
409 int iMaxConnections;
410 int iDefaultCase;
411 int iPrinting;
412 int iOplockContentionLimit;
413 int iCSCPolicy;
414 int iBlock_size;
415 int iDfreeCacheTime;
416 bool bPreexecClose;
417 bool bRootpreexecClose;
418 int iCaseSensitive;
419 bool bCasePreserve;
420 bool bShortCasePreserve;
421 bool bHideDotFiles;
422 bool bHideSpecialFiles;
423 bool bHideUnReadable;
424 bool bHideUnWriteableFiles;
425 bool bBrowseable;
426 bool bAvailable;
427 bool bRead_only;
428 bool bNo_set_dir;
429 bool bGuest_only;
430 bool bAdministrative_share;
431 bool bGuest_ok;
432 bool bPrint_ok;
433 bool bMap_system;
434 bool bMap_hidden;
435 bool bMap_archive;
436 bool bStoreDosAttributes;
437 bool bDmapiSupport;
438 bool bLocking;
439 int iStrictLocking;
440 bool bPosixLocking;
441 bool bShareModes;
442 bool bOpLocks;
443 bool bLevel2OpLocks;
444 bool bOnlyUser;
445 bool bMangledNames;
446 bool bWidelinks;
447 bool bSymlinks;
448 bool bSyncAlways;
449 bool bStrictAllocate;
450 bool bStrictSync;
451 char magic_char;
452 struct bitmap *copymap;
453 bool bDeleteReadonly;
454 bool bFakeOplocks;
455 bool bDeleteVetoFiles;
456 bool bDosFilemode;
457 bool bDosFiletimes;
458 bool bDosFiletimeResolution;
459 bool bFakeDirCreateTimes;
460 bool bBlockingLocks;
461 bool bInheritPerms;
462 bool bInheritACLS;
463 bool bInheritOwner;
464 bool bMSDfsRoot;
465 bool bUseClientDriver;
466 bool bDefaultDevmode;
467 bool bForcePrintername;
468 bool bNTAclSupport;
469 bool bForceUnknownAclUser;
470 bool bUseSendfile;
471 bool bProfileAcls;
472 bool bMap_acl_inherit;
473 bool bAfs_Share;
474 bool bEASupport;
475 bool bAclCheckPermissions;
476 bool bAclMapFullControl;
477 bool bAclGroupControl;
478 bool bChangeNotify;
479 bool bKernelChangeNotify;
480 int iallocation_roundup_size;
481 int iAioReadSize;
482 int iAioWriteSize;
483 int iMap_readonly;
484 int iDirectoryNameCacheSize;
485 int ismb_encrypt;
486 param_opt_struct *param_opt;
488 char dummy[3]; /* for alignment */
492 /* This is a default service used to prime a services structure */
493 static struct service sDefault = {
494 True, /* valid */
495 False, /* not autoloaded */
496 0, /* not a usershare */
497 (time_t)0, /* No last mod time */
498 NULL, /* szService */
499 NULL, /* szPath */
500 NULL, /* szUsername */
501 NULL, /* szInvalidUsers */
502 NULL, /* szValidUsers */
503 NULL, /* szAdminUsers */
504 NULL, /* szCopy */
505 NULL, /* szInclude */
506 NULL, /* szPreExec */
507 NULL, /* szPostExec */
508 NULL, /* szRootPreExec */
509 NULL, /* szRootPostExec */
510 NULL, /* szCupsOptions */
511 NULL, /* szPrintcommand */
512 NULL, /* szLpqcommand */
513 NULL, /* szLprmcommand */
514 NULL, /* szLppausecommand */
515 NULL, /* szLpresumecommand */
516 NULL, /* szQueuepausecommand */
517 NULL, /* szQueueresumecommand */
518 NULL, /* szPrintername */
519 NULL, /* szPrintjobUsername */
520 NULL, /* szDontdescend */
521 NULL, /* szHostsallow */
522 NULL, /* szHostsdeny */
523 NULL, /* szMagicScript */
524 NULL, /* szMagicOutput */
525 NULL, /* szVetoFiles */
526 NULL, /* szHideFiles */
527 NULL, /* szVetoOplockFiles */
528 NULL, /* comment */
529 NULL, /* force user */
530 NULL, /* force group */
531 NULL, /* readlist */
532 NULL, /* writelist */
533 NULL, /* printer admin */
534 NULL, /* volume */
535 NULL, /* fstype */
536 NULL, /* vfs objects */
537 NULL, /* szMSDfsProxy */
538 NULL, /* szAioWriteBehind */
539 NULL, /* szDfree */
540 0, /* iMinPrintSpace */
541 1000, /* iMaxPrintJobs */
542 0, /* iMaxReportedPrintJobs */
543 0, /* iWriteCacheSize */
544 0744, /* iCreate_mask */
545 0000, /* iCreate_force_mode */
546 0777, /* iSecurity_mask */
547 0, /* iSecurity_force_mode */
548 0755, /* iDir_mask */
549 0000, /* iDir_force_mode */
550 0777, /* iDir_Security_mask */
551 0, /* iDir_Security_force_mode */
552 0, /* iMaxConnections */
553 CASE_LOWER, /* iDefaultCase */
554 DEFAULT_PRINTING, /* iPrinting */
555 2, /* iOplockContentionLimit */
556 0, /* iCSCPolicy */
557 1024, /* iBlock_size */
558 0, /* iDfreeCacheTime */
559 False, /* bPreexecClose */
560 False, /* bRootpreexecClose */
561 Auto, /* case sensitive */
562 True, /* case preserve */
563 True, /* short case preserve */
564 True, /* bHideDotFiles */
565 False, /* bHideSpecialFiles */
566 False, /* bHideUnReadable */
567 False, /* bHideUnWriteableFiles */
568 True, /* bBrowseable */
569 True, /* bAvailable */
570 True, /* bRead_only */
571 True, /* bNo_set_dir */
572 False, /* bGuest_only */
573 False, /* bAdministrative_share */
574 False, /* bGuest_ok */
575 False, /* bPrint_ok */
576 False, /* bMap_system */
577 False, /* bMap_hidden */
578 True, /* bMap_archive */
579 False, /* bStoreDosAttributes */
580 False, /* bDmapiSupport */
581 True, /* bLocking */
582 Auto, /* iStrictLocking */
583 True, /* bPosixLocking */
584 True, /* bShareModes */
585 True, /* bOpLocks */
586 True, /* bLevel2OpLocks */
587 False, /* bOnlyUser */
588 True, /* bMangledNames */
589 True, /* bWidelinks */
590 True, /* bSymlinks */
591 False, /* bSyncAlways */
592 False, /* bStrictAllocate */
593 False, /* bStrictSync */
594 '~', /* magic char */
595 NULL, /* copymap */
596 False, /* bDeleteReadonly */
597 False, /* bFakeOplocks */
598 False, /* bDeleteVetoFiles */
599 False, /* bDosFilemode */
600 True, /* bDosFiletimes */
601 False, /* bDosFiletimeResolution */
602 False, /* bFakeDirCreateTimes */
603 True, /* bBlockingLocks */
604 False, /* bInheritPerms */
605 False, /* bInheritACLS */
606 False, /* bInheritOwner */
607 False, /* bMSDfsRoot */
608 False, /* bUseClientDriver */
609 True, /* bDefaultDevmode */
610 False, /* bForcePrintername */
611 True, /* bNTAclSupport */
612 False, /* bForceUnknownAclUser */
613 False, /* bUseSendfile */
614 False, /* bProfileAcls */
615 False, /* bMap_acl_inherit */
616 False, /* bAfs_Share */
617 False, /* bEASupport */
618 True, /* bAclCheckPermissions */
619 True, /* bAclMapFullControl */
620 False, /* bAclGroupControl */
621 True, /* bChangeNotify */
622 True, /* bKernelChangeNotify */
623 SMB_ROUNDUP_ALLOCATION_SIZE, /* iallocation_roundup_size */
624 0, /* iAioReadSize */
625 0, /* iAioWriteSize */
626 MAP_READONLY_YES, /* iMap_readonly */
627 #ifdef BROKEN_DIRECTORY_HANDLING
628 0, /* iDirectoryNameCacheSize */
629 #else
630 100, /* iDirectoryNameCacheSize */
631 #endif
632 Auto, /* ismb_encrypt */
633 NULL, /* Parametric options */
635 "" /* dummy */
638 /* local variables */
639 static struct service **ServicePtrs = NULL;
640 static int iNumServices = 0;
641 static int iServiceIndex = 0;
642 static struct db_context *ServiceHash;
643 static int *invalid_services = NULL;
644 static int num_invalid_services = 0;
645 static bool bInGlobalSection = True;
646 static bool bGlobalOnly = False;
647 static int server_role;
648 static int default_server_announce;
650 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
652 /* prototypes for the special type handlers */
653 static bool handle_include( int snum, const char *pszParmValue, char **ptr);
654 static bool handle_copy( int snum, const char *pszParmValue, char **ptr);
655 static bool handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
656 static bool handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
657 static bool handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
658 static bool handle_debug_list( int snum, const char *pszParmValue, char **ptr );
659 static bool handle_workgroup( int snum, const char *pszParmValue, char **ptr );
660 static bool handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
661 static bool handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
662 static bool handle_charset( int snum, const char *pszParmValue, char **ptr );
663 static bool handle_printing( int snum, const char *pszParmValue, char **ptr);
664 static bool handle_ldap_debug_level( int snum, const char *pszParmValue, char **ptr);
666 static void set_server_role(void);
667 static void set_default_server_announce_type(void);
668 static void set_allowed_client_auth(void);
670 static const struct enum_list enum_protocol[] = {
671 {PROTOCOL_NT1, "NT1"},
672 {PROTOCOL_LANMAN2, "LANMAN2"},
673 {PROTOCOL_LANMAN1, "LANMAN1"},
674 {PROTOCOL_CORE, "CORE"},
675 {PROTOCOL_COREPLUS, "COREPLUS"},
676 {PROTOCOL_COREPLUS, "CORE+"},
677 {-1, NULL}
680 static const struct enum_list enum_security[] = {
681 {SEC_SHARE, "SHARE"},
682 {SEC_USER, "USER"},
683 {SEC_SERVER, "SERVER"},
684 {SEC_DOMAIN, "DOMAIN"},
685 #ifdef HAVE_ADS
686 {SEC_ADS, "ADS"},
687 #endif
688 {-1, NULL}
691 static const struct enum_list enum_printing[] = {
692 {PRINT_SYSV, "sysv"},
693 {PRINT_AIX, "aix"},
694 {PRINT_HPUX, "hpux"},
695 {PRINT_BSD, "bsd"},
696 {PRINT_QNX, "qnx"},
697 {PRINT_PLP, "plp"},
698 {PRINT_LPRNG, "lprng"},
699 {PRINT_CUPS, "cups"},
700 {PRINT_IPRINT, "iprint"},
701 {PRINT_LPRNT, "nt"},
702 {PRINT_LPROS2, "os2"},
703 #ifdef DEVELOPER
704 {PRINT_TEST, "test"},
705 {PRINT_VLP, "vlp"},
706 #endif /* DEVELOPER */
707 {-1, NULL}
710 static const struct enum_list enum_ldap_sasl_wrapping[] = {
711 {0, "plain"},
712 {ADS_AUTH_SASL_SIGN, "sign"},
713 {ADS_AUTH_SASL_SEAL, "seal"},
714 {-1, NULL}
717 static const struct enum_list enum_ldap_ssl[] = {
718 {LDAP_SSL_OFF, "no"},
719 {LDAP_SSL_OFF, "No"},
720 {LDAP_SSL_OFF, "off"},
721 {LDAP_SSL_OFF, "Off"},
722 {LDAP_SSL_START_TLS, "start tls"},
723 {LDAP_SSL_START_TLS, "Start_tls"},
724 {-1, NULL}
727 static const struct enum_list enum_ldap_passwd_sync[] = {
728 {LDAP_PASSWD_SYNC_OFF, "no"},
729 {LDAP_PASSWD_SYNC_OFF, "No"},
730 {LDAP_PASSWD_SYNC_OFF, "off"},
731 {LDAP_PASSWD_SYNC_OFF, "Off"},
732 {LDAP_PASSWD_SYNC_ON, "Yes"},
733 {LDAP_PASSWD_SYNC_ON, "yes"},
734 {LDAP_PASSWD_SYNC_ON, "on"},
735 {LDAP_PASSWD_SYNC_ON, "On"},
736 {LDAP_PASSWD_SYNC_ONLY, "Only"},
737 {LDAP_PASSWD_SYNC_ONLY, "only"},
738 {-1, NULL}
741 /* Types of machine we can announce as. */
742 #define ANNOUNCE_AS_NT_SERVER 1
743 #define ANNOUNCE_AS_WIN95 2
744 #define ANNOUNCE_AS_WFW 3
745 #define ANNOUNCE_AS_NT_WORKSTATION 4
747 static const struct enum_list enum_announce_as[] = {
748 {ANNOUNCE_AS_NT_SERVER, "NT"},
749 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
750 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
751 {ANNOUNCE_AS_WIN95, "win95"},
752 {ANNOUNCE_AS_WFW, "WfW"},
753 {-1, NULL}
756 static const struct enum_list enum_map_readonly[] = {
757 {MAP_READONLY_NO, "no"},
758 {MAP_READONLY_NO, "false"},
759 {MAP_READONLY_NO, "0"},
760 {MAP_READONLY_YES, "yes"},
761 {MAP_READONLY_YES, "true"},
762 {MAP_READONLY_YES, "1"},
763 {MAP_READONLY_PERMISSIONS, "permissions"},
764 {MAP_READONLY_PERMISSIONS, "perms"},
765 {-1, NULL}
768 static const struct enum_list enum_case[] = {
769 {CASE_LOWER, "lower"},
770 {CASE_UPPER, "upper"},
771 {-1, NULL}
774 static const struct enum_list enum_bool_auto[] = {
775 {False, "No"},
776 {False, "False"},
777 {False, "0"},
778 {True, "Yes"},
779 {True, "True"},
780 {True, "1"},
781 {Auto, "Auto"},
782 {-1, NULL}
785 /* Client-side offline caching policy types */
786 #define CSC_POLICY_MANUAL 0
787 #define CSC_POLICY_DOCUMENTS 1
788 #define CSC_POLICY_PROGRAMS 2
789 #define CSC_POLICY_DISABLE 3
791 static const struct enum_list enum_csc_policy[] = {
792 {CSC_POLICY_MANUAL, "manual"},
793 {CSC_POLICY_DOCUMENTS, "documents"},
794 {CSC_POLICY_PROGRAMS, "programs"},
795 {CSC_POLICY_DISABLE, "disable"},
796 {-1, NULL}
799 /* SMB signing types. */
800 static const struct enum_list enum_smb_signing_vals[] = {
801 {False, "No"},
802 {False, "False"},
803 {False, "0"},
804 {False, "Off"},
805 {False, "disabled"},
806 {True, "Yes"},
807 {True, "True"},
808 {True, "1"},
809 {True, "On"},
810 {True, "enabled"},
811 {Auto, "auto"},
812 {Required, "required"},
813 {Required, "mandatory"},
814 {Required, "force"},
815 {Required, "forced"},
816 {Required, "enforced"},
817 {-1, NULL}
820 /* ACL compatibility options. */
821 static const struct enum_list enum_acl_compat_vals[] = {
822 { ACL_COMPAT_AUTO, "auto" },
823 { ACL_COMPAT_WINNT, "winnt" },
824 { ACL_COMPAT_WIN2K, "win2k" },
825 { -1, NULL}
829 Do you want session setups at user level security with a invalid
830 password to be rejected or allowed in as guest? WinNT rejects them
831 but it can be a pain as it means "net view" needs to use a password
833 You have 3 choices in the setting of map_to_guest:
835 "Never" means session setups with an invalid password
836 are rejected. This is the default.
838 "Bad User" means session setups with an invalid password
839 are rejected, unless the username does not exist, in which case it
840 is treated as a guest login
842 "Bad Password" means session setups with an invalid password
843 are treated as a guest login
845 Note that map_to_guest only has an effect in user or server
846 level security.
849 static const struct enum_list enum_map_to_guest[] = {
850 {NEVER_MAP_TO_GUEST, "Never"},
851 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
852 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
853 {MAP_TO_GUEST_ON_BAD_UID, "Bad Uid"},
854 {-1, NULL}
857 /* Config backend options */
859 static const struct enum_list enum_config_backend[] = {
860 {CONFIG_BACKEND_FILE, "file"},
861 {CONFIG_BACKEND_REGISTRY, "registry"},
862 {-1, NULL}
865 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
867 * The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
868 * screen in SWAT. This is used to exclude parameters as well as to squash all
869 * parameters that have been duplicated by pseudonyms.
871 * NOTE: To display a parameter in BASIC view set FLAG_BASIC
872 * Any parameter that does NOT have FLAG_ADVANCED will not disply at all
873 * Set FLAG_SHARE and FLAG_PRINT to specifically display parameters in
874 * respective views.
876 * NOTE2: Handling of duplicated (synonym) paramters:
877 * Only the first occurance of a parameter should be enabled by FLAG_BASIC
878 * and/or FLAG_ADVANCED. All duplicates following the first mention should be
879 * set to FLAG_HIDE. ie: Make you must place the parameter that has the preferred
880 * name first, and all synonyms must follow it with the FLAG_HIDE attribute.
883 static struct parm_struct parm_table[] = {
884 {N_("Base Options"), P_SEP, P_SEPARATOR},
887 .label = "dos charset",
888 .type = P_STRING,
889 .p_class = P_GLOBAL,
890 .ptr = &Globals.dos_charset,
891 .special = handle_charset,
892 .enum_list = NULL,
893 .flags = FLAG_ADVANCED
896 .label = "unix charset",
897 .type = P_STRING,
898 .p_class = P_GLOBAL,
899 .ptr = &Globals.unix_charset,
900 .special = handle_charset,
901 .enum_list = NULL,
902 .flags = FLAG_ADVANCED
905 .label = "display charset",
906 .type = P_STRING,
907 .p_class = P_GLOBAL,
908 .ptr = &Globals.display_charset,
909 .special = handle_charset,
910 .enum_list = NULL,
911 .flags = FLAG_ADVANCED
914 .label = "comment",
915 .type = P_STRING,
916 .p_class = P_LOCAL,
917 .ptr = &sDefault.comment,
918 .special = NULL,
919 .enum_list = NULL,
920 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT
923 .label = "path",
924 .type = P_STRING,
925 .p_class = P_LOCAL,
926 .ptr = &sDefault.szPath,
927 .special = NULL,
928 .enum_list = NULL,
929 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
932 .label = "directory",
933 .type = P_STRING,
934 .p_class = P_LOCAL,
935 .ptr = &sDefault.szPath,
936 .special = NULL,
937 .enum_list = NULL,
938 .flags = FLAG_HIDE,
941 .label = "workgroup",
942 .type = P_USTRING,
943 .p_class = P_GLOBAL,
944 .ptr = &Globals.szWorkgroup,
945 .special = handle_workgroup,
946 .enum_list = NULL,
947 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
949 #ifdef WITH_ADS
951 .label = "realm",
952 .type = P_USTRING,
953 .p_class = P_GLOBAL,
954 .ptr = &Globals.szRealm,
955 .special = NULL,
956 .enum_list = NULL,
957 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
959 #endif
961 .label = "netbios name",
962 .type = P_USTRING,
963 .p_class = P_GLOBAL,
964 .ptr = &Globals.szNetbiosName,
965 .special = handle_netbios_name,
966 .enum_list = NULL,
967 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
970 .label = "netbios aliases",
971 .type = P_LIST,
972 .p_class = P_GLOBAL,
973 .ptr = &Globals.szNetbiosAliases,
974 .special = handle_netbios_aliases,
975 .enum_list = NULL,
976 .flags = FLAG_ADVANCED,
979 .label = "netbios scope",
980 .type = P_USTRING,
981 .p_class = P_GLOBAL,
982 .ptr = &Globals.szNetbiosScope,
983 .special = handle_netbios_scope,
984 .enum_list = NULL,
985 .flags = FLAG_ADVANCED,
988 .label = "server string",
989 .type = P_STRING,
990 .p_class = P_GLOBAL,
991 .ptr = &Globals.szServerString,
992 .special = NULL,
993 .enum_list = NULL,
994 .flags = FLAG_BASIC | FLAG_ADVANCED,
997 .label = "interfaces",
998 .type = P_LIST,
999 .p_class = P_GLOBAL,
1000 .ptr = &Globals.szInterfaces,
1001 .special = NULL,
1002 .enum_list = NULL,
1003 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
1006 .label = "bind interfaces only",
1007 .type = P_BOOL,
1008 .p_class = P_GLOBAL,
1009 .ptr = &Globals.bBindInterfacesOnly,
1010 .special = NULL,
1011 .enum_list = NULL,
1012 .flags = FLAG_ADVANCED | FLAG_WIZARD,
1015 .label = "config backend",
1016 .type = P_ENUM,
1017 .p_class = P_GLOBAL,
1018 .ptr = &Globals.ConfigBackend,
1019 .special = NULL,
1020 .enum_list = enum_config_backend,
1021 .flags = FLAG_ADVANCED,
1024 {N_("Security Options"), P_SEP, P_SEPARATOR},
1027 .label = "security",
1028 .type = P_ENUM,
1029 .p_class = P_GLOBAL,
1030 .ptr = &Globals.security,
1031 .special = NULL,
1032 .enum_list = enum_security,
1033 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
1036 .label = "auth methods",
1037 .type = P_LIST,
1038 .p_class = P_GLOBAL,
1039 .ptr = &Globals.AuthMethods,
1040 .special = NULL,
1041 .enum_list = NULL,
1042 .flags = FLAG_ADVANCED,
1045 .label = "encrypt passwords",
1046 .type = P_BOOL,
1047 .p_class = P_GLOBAL,
1048 .ptr = &Globals.bEncryptPasswords,
1049 .special = NULL,
1050 .enum_list = NULL,
1051 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
1054 .label = "update encrypted",
1055 .type = P_BOOL,
1056 .p_class = P_GLOBAL,
1057 .ptr = &Globals.bUpdateEncrypt,
1058 .special = NULL,
1059 .enum_list = NULL,
1060 .flags = FLAG_ADVANCED,
1063 .label = "client schannel",
1064 .type = P_ENUM,
1065 .p_class = P_GLOBAL,
1066 .ptr = &Globals.clientSchannel,
1067 .special = NULL,
1068 .enum_list = enum_bool_auto,
1069 .flags = FLAG_BASIC | FLAG_ADVANCED,
1072 .label = "server schannel",
1073 .type = P_ENUM,
1074 .p_class = P_GLOBAL,
1075 .ptr = &Globals.serverSchannel,
1076 .special = NULL,
1077 .enum_list = enum_bool_auto,
1078 .flags = FLAG_BASIC | FLAG_ADVANCED,
1081 .label = "allow trusted domains",
1082 .type = P_BOOL,
1083 .p_class = P_GLOBAL,
1084 .ptr = &Globals.bAllowTrustedDomains,
1085 .special = NULL,
1086 .enum_list = NULL,
1087 .flags = FLAG_ADVANCED,
1090 .label = "map to guest",
1091 .type = P_ENUM,
1092 .p_class = P_GLOBAL,
1093 .ptr = &Globals.map_to_guest,
1094 .special = NULL,
1095 .enum_list = enum_map_to_guest,
1096 .flags = FLAG_ADVANCED,
1099 .label = "null passwords",
1100 .type = P_BOOL,
1101 .p_class = P_GLOBAL,
1102 .ptr = &Globals.bNullPasswords,
1103 .special = NULL,
1104 .enum_list = NULL,
1105 .flags = FLAG_ADVANCED,
1108 .label = "obey pam restrictions",
1109 .type = P_BOOL,
1110 .p_class = P_GLOBAL,
1111 .ptr = &Globals.bObeyPamRestrictions,
1112 .special = NULL,
1113 .enum_list = NULL,
1114 .flags = FLAG_ADVANCED,
1117 .label = "password server",
1118 .type = P_STRING,
1119 .p_class = P_GLOBAL,
1120 .ptr = &Globals.szPasswordServer,
1121 .special = NULL,
1122 .enum_list = NULL,
1123 .flags = FLAG_ADVANCED | FLAG_WIZARD,
1126 .label = "smb passwd file",
1127 .type = P_STRING,
1128 .p_class = P_GLOBAL,
1129 .ptr = &Globals.szSMBPasswdFile,
1130 .special = NULL,
1131 .enum_list = NULL,
1132 .flags = FLAG_ADVANCED,
1135 .label = "private dir",
1136 .type = P_STRING,
1137 .p_class = P_GLOBAL,
1138 .ptr = &Globals.szPrivateDir,
1139 .special = NULL,
1140 .enum_list = NULL,
1141 .flags = FLAG_ADVANCED,
1144 .label = "passdb backend",
1145 .type = P_STRING,
1146 .p_class = P_GLOBAL,
1147 .ptr = &Globals.szPassdbBackend,
1148 .special = NULL,
1149 .enum_list = NULL,
1150 .flags = FLAG_ADVANCED | FLAG_WIZARD,
1153 .label = "algorithmic rid base",
1154 .type = P_INTEGER,
1155 .p_class = P_GLOBAL,
1156 .ptr = &Globals.AlgorithmicRidBase,
1157 .special = NULL,
1158 .enum_list = NULL,
1159 .flags = FLAG_ADVANCED,
1162 .label = "root directory",
1163 .type = P_STRING,
1164 .p_class = P_GLOBAL,
1165 .ptr = &Globals.szRootdir,
1166 .special = NULL,
1167 .enum_list = NULL,
1168 .flags = FLAG_ADVANCED,
1171 .label = "root dir",
1172 .type = P_STRING,
1173 .p_class = P_GLOBAL,
1174 .ptr = &Globals.szRootdir,
1175 .special = NULL,
1176 .enum_list = NULL,
1177 .flags = FLAG_HIDE,
1180 .label = "root",
1181 .type = P_STRING,
1182 .p_class = P_GLOBAL,
1183 .ptr = &Globals.szRootdir,
1184 .special = NULL,
1185 .enum_list = NULL,
1186 .flags = FLAG_HIDE,
1189 .label = "guest account",
1190 .type = P_STRING,
1191 .p_class = P_GLOBAL,
1192 .ptr = &Globals.szGuestaccount,
1193 .special = NULL,
1194 .enum_list = NULL,
1195 .flags = FLAG_BASIC | FLAG_ADVANCED,
1198 .label = "enable privileges",
1199 .type = P_BOOL,
1200 .p_class = P_GLOBAL,
1201 .ptr = &Globals.bEnablePrivileges,
1202 .special = NULL,
1203 .enum_list = NULL,
1204 .flags = FLAG_ADVANCED,
1208 .label = "pam password change",
1209 .type = P_BOOL,
1210 .p_class = P_GLOBAL,
1211 .ptr = &Globals.bPamPasswordChange,
1212 .special = NULL,
1213 .enum_list = NULL,
1214 .flags = FLAG_ADVANCED,
1217 .label = "passwd program",
1218 .type = P_STRING,
1219 .p_class = P_GLOBAL,
1220 .ptr = &Globals.szPasswdProgram,
1221 .special = NULL,
1222 .enum_list = NULL,
1223 .flags = FLAG_ADVANCED,
1226 .label = "passwd chat",
1227 .type = P_STRING,
1228 .p_class = P_GLOBAL,
1229 .ptr = &Globals.szPasswdChat,
1230 .special = NULL,
1231 .enum_list = NULL,
1232 .flags = FLAG_ADVANCED,
1235 .label = "passwd chat debug",
1236 .type = P_BOOL,
1237 .p_class = P_GLOBAL,
1238 .ptr = &Globals.bPasswdChatDebug,
1239 .special = NULL,
1240 .enum_list = NULL,
1241 .flags = FLAG_ADVANCED,
1244 .label = "passwd chat timeout",
1245 .type = P_INTEGER,
1246 .p_class = P_GLOBAL,
1247 .ptr = &Globals.iPasswdChatTimeout,
1248 .special = NULL,
1249 .enum_list = NULL,
1250 .flags = FLAG_ADVANCED,
1253 .label = "check password script",
1254 .type = P_STRING,
1255 .p_class = P_GLOBAL,
1256 .ptr = &Globals.szCheckPasswordScript,
1257 .special = NULL,
1258 .enum_list = NULL,
1259 .flags = FLAG_ADVANCED,
1262 .label = "username map",
1263 .type = P_STRING,
1264 .p_class = P_GLOBAL,
1265 .ptr = &Globals.szUsernameMap,
1266 .special = NULL,
1267 .enum_list = NULL,
1268 .flags = FLAG_ADVANCED,
1271 .label = "password level",
1272 .type = P_INTEGER,
1273 .p_class = P_GLOBAL,
1274 .ptr = &Globals.pwordlevel,
1275 .special = NULL,
1276 .enum_list = NULL,
1277 .flags = FLAG_ADVANCED,
1280 .label = "username level",
1281 .type = P_INTEGER,
1282 .p_class = P_GLOBAL,
1283 .ptr = &Globals.unamelevel,
1284 .special = NULL,
1285 .enum_list = NULL,
1286 .flags = FLAG_ADVANCED,
1289 .label = "unix password sync",
1290 .type = P_BOOL,
1291 .p_class = P_GLOBAL,
1292 .ptr = &Globals.bUnixPasswdSync,
1293 .special = NULL,
1294 .enum_list = NULL,
1295 .flags = FLAG_ADVANCED,
1298 .label = "restrict anonymous",
1299 .type = P_INTEGER,
1300 .p_class = P_GLOBAL,
1301 .ptr = &Globals.restrict_anonymous,
1302 .special = NULL,
1303 .enum_list = NULL,
1304 .flags = FLAG_ADVANCED,
1307 .label = "lanman auth",
1308 .type = P_BOOL,
1309 .p_class = P_GLOBAL,
1310 .ptr = &Globals.bLanmanAuth,
1311 .special = NULL,
1312 .enum_list = NULL,
1313 .flags = FLAG_ADVANCED,
1316 .label = "ntlm auth",
1317 .type = P_BOOL,
1318 .p_class = P_GLOBAL,
1319 .ptr = &Globals.bNTLMAuth,
1320 .special = NULL,
1321 .enum_list = NULL,
1322 .flags = FLAG_ADVANCED,
1325 .label = "client NTLMv2 auth",
1326 .type = P_BOOL,
1327 .p_class = P_GLOBAL,
1328 .ptr = &Globals.bClientNTLMv2Auth,
1329 .special = NULL,
1330 .enum_list = NULL,
1331 .flags = FLAG_ADVANCED,
1334 .label = "client lanman auth",
1335 .type = P_BOOL,
1336 .p_class = P_GLOBAL,
1337 .ptr = &Globals.bClientLanManAuth,
1338 .special = NULL,
1339 .enum_list = NULL,
1340 .flags = FLAG_ADVANCED,
1343 .label = "client plaintext auth",
1344 .type = P_BOOL,
1345 .p_class = P_GLOBAL,
1346 .ptr = &Globals.bClientPlaintextAuth,
1347 .special = NULL,
1348 .enum_list = NULL,
1349 .flags = FLAG_ADVANCED,
1352 .label = "username",
1353 .type = P_STRING,
1354 .p_class = P_LOCAL,
1355 .ptr = &sDefault.szUsername,
1356 .special = NULL,
1357 .enum_list = NULL,
1358 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1361 .label = "user",
1362 .type = P_STRING,
1363 .p_class = P_LOCAL,
1364 .ptr = &sDefault.szUsername,
1365 .special = NULL,
1366 .enum_list = NULL,
1367 .flags = FLAG_HIDE,
1370 .label = "users",
1371 .type = P_STRING,
1372 .p_class = P_LOCAL,
1373 .ptr = &sDefault.szUsername,
1374 .special = NULL,
1375 .enum_list = NULL,
1376 .flags = FLAG_HIDE,
1379 .label = "invalid users",
1380 .type = P_LIST,
1381 .p_class = P_LOCAL,
1382 .ptr = &sDefault.szInvalidUsers,
1383 .special = NULL,
1384 .enum_list = NULL,
1385 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1388 .label = "valid users",
1389 .type = P_LIST,
1390 .p_class = P_LOCAL,
1391 .ptr = &sDefault.szValidUsers,
1392 .special = NULL,
1393 .enum_list = NULL,
1394 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1397 .label = "admin users",
1398 .type = P_LIST,
1399 .p_class = P_LOCAL,
1400 .ptr = &sDefault.szAdminUsers,
1401 .special = NULL,
1402 .enum_list = NULL,
1403 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1406 .label = "read list",
1407 .type = P_LIST,
1408 .p_class = P_LOCAL,
1409 .ptr = &sDefault.readlist,
1410 .special = NULL,
1411 .enum_list = NULL,
1412 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1415 .label = "write list",
1416 .type = P_LIST,
1417 .p_class = P_LOCAL,
1418 .ptr = &sDefault.writelist,
1419 .special = NULL,
1420 .enum_list = NULL,
1421 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1424 .label = "printer admin",
1425 .type = P_LIST,
1426 .p_class = P_LOCAL,
1427 .ptr = &sDefault.printer_admin,
1428 .special = NULL,
1429 .enum_list = NULL,
1430 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_PRINT | FLAG_DEPRECATED,
1433 .label = "force user",
1434 .type = P_STRING,
1435 .p_class = P_LOCAL,
1436 .ptr = &sDefault.force_user,
1437 .special = NULL,
1438 .enum_list = NULL,
1439 .flags = FLAG_ADVANCED | FLAG_SHARE,
1442 .label = "force group",
1443 .type = P_STRING,
1444 .p_class = P_LOCAL,
1445 .ptr = &sDefault.force_group,
1446 .special = NULL,
1447 .enum_list = NULL,
1448 .flags = FLAG_ADVANCED | FLAG_SHARE,
1451 .label = "group",
1452 .type = P_STRING,
1453 .p_class = P_LOCAL,
1454 .ptr = &sDefault.force_group,
1455 .special = NULL,
1456 .enum_list = NULL,
1457 .flags = FLAG_ADVANCED,
1460 .label = "read only",
1461 .type = P_BOOL,
1462 .p_class = P_LOCAL,
1463 .ptr = &sDefault.bRead_only,
1464 .special = NULL,
1465 .enum_list = NULL,
1466 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE,
1469 .label = "write ok",
1470 .type = P_BOOLREV,
1471 .p_class = P_LOCAL,
1472 .ptr = &sDefault.bRead_only,
1473 .special = NULL,
1474 .enum_list = NULL,
1475 .flags = FLAG_HIDE,
1478 .label = "writeable",
1479 .type = P_BOOLREV,
1480 .p_class = P_LOCAL,
1481 .ptr = &sDefault.bRead_only,
1482 .special = NULL,
1483 .enum_list = NULL,
1484 .flags = FLAG_HIDE,
1487 .label = "writable",
1488 .type = P_BOOLREV,
1489 .p_class = P_LOCAL,
1490 .ptr = &sDefault.bRead_only,
1491 .special = NULL,
1492 .enum_list = NULL,
1493 .flags = FLAG_HIDE,
1496 .label = "acl check permissions",
1497 .type = P_BOOL,
1498 .p_class = P_LOCAL,
1499 .ptr = &sDefault.bAclCheckPermissions,
1500 .special = NULL,
1501 .enum_list = NULL,
1502 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1505 .label = "acl group control",
1506 .type = P_BOOL,
1507 .p_class = P_LOCAL,
1508 .ptr = &sDefault.bAclGroupControl,
1509 .special = NULL,
1510 .enum_list = NULL,
1511 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE | FLAG_DEPRECATED,
1514 .label = "acl map full control",
1515 .type = P_BOOL,
1516 .p_class = P_LOCAL,
1517 .ptr = &sDefault.bAclMapFullControl,
1518 .special = NULL,
1519 .enum_list = NULL,
1520 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1523 .label = "create mask",
1524 .type = P_OCTAL,
1525 .p_class = P_LOCAL,
1526 .ptr = &sDefault.iCreate_mask,
1527 .special = NULL,
1528 .enum_list = NULL,
1529 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1532 .label = "create mode",
1533 .type = P_OCTAL,
1534 .p_class = P_LOCAL,
1535 .ptr = &sDefault.iCreate_mask,
1536 .special = NULL,
1537 .enum_list = NULL,
1538 .flags = FLAG_HIDE,
1541 .label = "force create mode",
1542 .type = P_OCTAL,
1543 .p_class = P_LOCAL,
1544 .ptr = &sDefault.iCreate_force_mode,
1545 .special = NULL,
1546 .enum_list = NULL,
1547 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1550 .label = "security mask",
1551 .type = P_OCTAL,
1552 .p_class = P_LOCAL,
1553 .ptr = &sDefault.iSecurity_mask,
1554 .special = NULL,
1555 .enum_list = NULL,
1556 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1559 .label = "force security mode",
1560 .type = P_OCTAL,
1561 .p_class = P_LOCAL,
1562 .ptr = &sDefault.iSecurity_force_mode,
1563 .special = NULL,
1564 .enum_list = NULL,
1565 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1568 .label = "directory mask",
1569 .type = P_OCTAL,
1570 .p_class = P_LOCAL,
1571 .ptr = &sDefault.iDir_mask,
1572 .special = NULL,
1573 .enum_list = NULL,
1574 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1577 .label = "directory mode",
1578 .type = P_OCTAL,
1579 .p_class = P_LOCAL,
1580 .ptr = &sDefault.iDir_mask,
1581 .special = NULL,
1582 .enum_list = NULL,
1583 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
1586 .label = "force directory mode",
1587 .type = P_OCTAL,
1588 .p_class = P_LOCAL,
1589 .ptr = &sDefault.iDir_force_mode,
1590 .special = NULL,
1591 .enum_list = NULL,
1592 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1595 .label = "directory security mask",
1596 .type = P_OCTAL,
1597 .p_class = P_LOCAL,
1598 .ptr = &sDefault.iDir_Security_mask,
1599 .special = NULL,
1600 .enum_list = NULL,
1601 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1604 .label = "force directory security mode",
1605 .type = P_OCTAL,
1606 .p_class = P_LOCAL,
1607 .ptr = &sDefault.iDir_Security_force_mode,
1608 .special = NULL,
1609 .enum_list = NULL,
1610 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1613 .label = "force unknown acl user",
1614 .type = P_BOOL,
1615 .p_class = P_LOCAL,
1616 .ptr = &sDefault.bForceUnknownAclUser,
1617 .special = NULL,
1618 .enum_list = NULL,
1619 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1622 .label = "inherit permissions",
1623 .type = P_BOOL,
1624 .p_class = P_LOCAL,
1625 .ptr = &sDefault.bInheritPerms,
1626 .special = NULL,
1627 .enum_list = NULL,
1628 .flags = FLAG_ADVANCED | FLAG_SHARE,
1631 .label = "inherit acls",
1632 .type = P_BOOL,
1633 .p_class = P_LOCAL,
1634 .ptr = &sDefault.bInheritACLS,
1635 .special = NULL,
1636 .enum_list = NULL,
1637 .flags = FLAG_ADVANCED | FLAG_SHARE,
1640 .label = "inherit owner",
1641 .type = P_BOOL,
1642 .p_class = P_LOCAL,
1643 .ptr = &sDefault.bInheritOwner,
1644 .special = NULL,
1645 .enum_list = NULL,
1646 .flags = FLAG_ADVANCED | FLAG_SHARE,
1649 .label = "guest only",
1650 .type = P_BOOL,
1651 .p_class = P_LOCAL,
1652 .ptr = &sDefault.bGuest_only,
1653 .special = NULL,
1654 .enum_list = NULL,
1655 .flags = FLAG_ADVANCED | FLAG_SHARE,
1658 .label = "only guest",
1659 .type = P_BOOL,
1660 .p_class = P_LOCAL,
1661 .ptr = &sDefault.bGuest_only,
1662 .special = NULL,
1663 .enum_list = NULL,
1664 .flags = FLAG_HIDE,
1667 .label = "administrative share",
1668 .type = P_BOOL,
1669 .p_class = P_LOCAL,
1670 .ptr = &sDefault.bAdministrative_share,
1671 .special = NULL,
1672 .enum_list = NULL,
1673 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1677 .label = "guest ok",
1678 .type = P_BOOL,
1679 .p_class = P_LOCAL,
1680 .ptr = &sDefault.bGuest_ok,
1681 .special = NULL,
1682 .enum_list = NULL,
1683 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1686 .label = "public",
1687 .type = P_BOOL,
1688 .p_class = P_LOCAL,
1689 .ptr = &sDefault.bGuest_ok,
1690 .special = NULL,
1691 .enum_list = NULL,
1692 .flags = FLAG_HIDE,
1695 .label = "only user",
1696 .type = P_BOOL,
1697 .p_class = P_LOCAL,
1698 .ptr = &sDefault.bOnlyUser,
1699 .special = NULL,
1700 .enum_list = NULL,
1701 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED,
1704 .label = "hosts allow",
1705 .type = P_LIST,
1706 .p_class = P_LOCAL,
1707 .ptr = &sDefault.szHostsallow,
1708 .special = NULL,
1709 .enum_list = NULL,
1710 .flags = FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1713 .label = "allow hosts",
1714 .type = P_LIST,
1715 .p_class = P_LOCAL,
1716 .ptr = &sDefault.szHostsallow,
1717 .special = NULL,
1718 .enum_list = NULL,
1719 .flags = FLAG_HIDE,
1722 .label = "hosts deny",
1723 .type = P_LIST,
1724 .p_class = P_LOCAL,
1725 .ptr = &sDefault.szHostsdeny,
1726 .special = NULL,
1727 .enum_list = NULL,
1728 .flags = FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1731 .label = "deny hosts",
1732 .type = P_LIST,
1733 .p_class = P_LOCAL,
1734 .ptr = &sDefault.szHostsdeny,
1735 .special = NULL,
1736 .enum_list = NULL,
1737 .flags = FLAG_HIDE,
1740 .label = "preload modules",
1741 .type = P_LIST,
1742 .p_class = P_GLOBAL,
1743 .ptr = &Globals.szPreloadModules,
1744 .special = NULL,
1745 .enum_list = NULL,
1746 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
1749 .label = "use kerberos keytab",
1750 .type = P_BOOL,
1751 .p_class = P_GLOBAL,
1752 .ptr = &Globals.bUseKerberosKeytab,
1753 .special = NULL,
1754 .enum_list = NULL,
1755 .flags = FLAG_ADVANCED,
1758 {N_("Logging Options"), P_SEP, P_SEPARATOR},
1761 .label = "log level",
1762 .type = P_STRING,
1763 .p_class = P_GLOBAL,
1764 .ptr = &Globals.szLogLevel,
1765 .special = handle_debug_list,
1766 .enum_list = NULL,
1767 .flags = FLAG_ADVANCED,
1770 .label = "debuglevel",
1771 .type = P_STRING,
1772 .p_class = P_GLOBAL,
1773 .ptr = &Globals.szLogLevel,
1774 .special = handle_debug_list,
1775 .enum_list = NULL,
1776 .flags = FLAG_HIDE,
1779 .label = "syslog",
1780 .type = P_INTEGER,
1781 .p_class = P_GLOBAL,
1782 .ptr = &Globals.syslog,
1783 .special = NULL,
1784 .enum_list = NULL,
1785 .flags = FLAG_ADVANCED,
1788 .label = "syslog only",
1789 .type = P_BOOL,
1790 .p_class = P_GLOBAL,
1791 .ptr = &Globals.bSyslogOnly,
1792 .special = NULL,
1793 .enum_list = NULL,
1794 .flags = FLAG_ADVANCED,
1797 .label = "log file",
1798 .type = P_STRING,
1799 .p_class = P_GLOBAL,
1800 .ptr = &Globals.szLogFile,
1801 .special = NULL,
1802 .enum_list = NULL,
1803 .flags = FLAG_ADVANCED,
1806 .label = "max log size",
1807 .type = P_INTEGER,
1808 .p_class = P_GLOBAL,
1809 .ptr = &Globals.max_log_size,
1810 .special = NULL,
1811 .enum_list = NULL,
1812 .flags = FLAG_ADVANCED,
1815 .label = "debug timestamp",
1816 .type = P_BOOL,
1817 .p_class = P_GLOBAL,
1818 .ptr = &Globals.bTimestampLogs,
1819 .special = NULL,
1820 .enum_list = NULL,
1821 .flags = FLAG_ADVANCED,
1824 .label = "timestamp logs",
1825 .type = P_BOOL,
1826 .p_class = P_GLOBAL,
1827 .ptr = &Globals.bTimestampLogs,
1828 .special = NULL,
1829 .enum_list = NULL,
1830 .flags = FLAG_ADVANCED,
1833 .label = "debug prefix timestamp",
1834 .type = P_BOOL,
1835 .p_class = P_GLOBAL,
1836 .ptr = &Globals.bDebugPrefixTimestamp,
1837 .special = NULL,
1838 .enum_list = NULL,
1839 .flags = FLAG_ADVANCED,
1842 .label = "debug hires timestamp",
1843 .type = P_BOOL,
1844 .p_class = P_GLOBAL,
1845 .ptr = &Globals.bDebugHiresTimestamp,
1846 .special = NULL,
1847 .enum_list = NULL,
1848 .flags = FLAG_ADVANCED,
1851 .label = "debug pid",
1852 .type = P_BOOL,
1853 .p_class = P_GLOBAL,
1854 .ptr = &Globals.bDebugPid,
1855 .special = NULL,
1856 .enum_list = NULL,
1857 .flags = FLAG_ADVANCED,
1860 .label = "debug uid",
1861 .type = P_BOOL,
1862 .p_class = P_GLOBAL,
1863 .ptr = &Globals.bDebugUid,
1864 .special = NULL,
1865 .enum_list = NULL,
1866 .flags = FLAG_ADVANCED,
1869 .label = "debug class",
1870 .type = P_BOOL,
1871 .p_class = P_GLOBAL,
1872 .ptr = &Globals.bDebugClass,
1873 .special = NULL,
1874 .enum_list = NULL,
1875 .flags = FLAG_ADVANCED,
1878 .label = "enable core files",
1879 .type = P_BOOL,
1880 .p_class = P_GLOBAL,
1881 .ptr = &Globals.bEnableCoreFiles,
1882 .special = NULL,
1883 .enum_list = NULL,
1884 .flags = FLAG_ADVANCED,
1887 {N_("Protocol Options"), P_SEP, P_SEPARATOR},
1890 .label = "allocation roundup size",
1891 .type = P_INTEGER,
1892 .p_class = P_LOCAL,
1893 .ptr = &sDefault.iallocation_roundup_size,
1894 .special = NULL,
1895 .enum_list = NULL,
1896 .flags = FLAG_ADVANCED,
1899 .label = "aio read size",
1900 .type = P_INTEGER,
1901 .p_class = P_LOCAL,
1902 .ptr = &sDefault.iAioReadSize,
1903 .special = NULL,
1904 .enum_list = NULL,
1905 .flags = FLAG_ADVANCED,
1908 .label = "aio write size",
1909 .type = P_INTEGER,
1910 .p_class = P_LOCAL,
1911 .ptr = &sDefault.iAioWriteSize,
1912 .special = NULL,
1913 .enum_list = NULL,
1914 .flags = FLAG_ADVANCED,
1917 .label = "aio write behind",
1918 .type = P_STRING,
1919 .p_class = P_LOCAL,
1920 .ptr = &sDefault.szAioWriteBehind,
1921 .special = NULL,
1922 .enum_list = NULL,
1923 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
1926 .label = "smb ports",
1927 .type = P_STRING,
1928 .p_class = P_GLOBAL,
1929 .ptr = &Globals.smb_ports,
1930 .special = NULL,
1931 .enum_list = NULL,
1932 .flags = FLAG_ADVANCED,
1935 .label = "large readwrite",
1936 .type = P_BOOL,
1937 .p_class = P_GLOBAL,
1938 .ptr = &Globals.bLargeReadwrite,
1939 .special = NULL,
1940 .enum_list = NULL,
1941 .flags = FLAG_ADVANCED,
1944 .label = "max protocol",
1945 .type = P_ENUM,
1946 .p_class = P_GLOBAL,
1947 .ptr = &Globals.maxprotocol,
1948 .special = NULL,
1949 .enum_list = enum_protocol,
1950 .flags = FLAG_ADVANCED,
1953 .label = "protocol",
1954 .type = P_ENUM,
1955 .p_class = P_GLOBAL,
1956 .ptr = &Globals.maxprotocol,
1957 .special = NULL,
1958 .enum_list = enum_protocol,
1959 .flags = FLAG_ADVANCED,
1962 .label = "min protocol",
1963 .type = P_ENUM,
1964 .p_class = P_GLOBAL,
1965 .ptr = &Globals.minprotocol,
1966 .special = NULL,
1967 .enum_list = enum_protocol,
1968 .flags = FLAG_ADVANCED,
1971 .label = "min receivefile size",
1972 .type = P_INTEGER,
1973 .p_class = P_GLOBAL,
1974 .ptr = &Globals.iminreceivefile,
1975 .special = NULL,
1976 .enum_list = NULL,
1977 .flags = FLAG_ADVANCED,
1980 .label = "read raw",
1981 .type = P_BOOL,
1982 .p_class = P_GLOBAL,
1983 .ptr = &Globals.bReadRaw,
1984 .special = NULL,
1985 .enum_list = NULL,
1986 .flags = FLAG_ADVANCED,
1989 .label = "write raw",
1990 .type = P_BOOL,
1991 .p_class = P_GLOBAL,
1992 .ptr = &Globals.bWriteRaw,
1993 .special = NULL,
1994 .enum_list = NULL,
1995 .flags = FLAG_ADVANCED,
1998 .label = "disable netbios",
1999 .type = P_BOOL,
2000 .p_class = P_GLOBAL,
2001 .ptr = &Globals.bDisableNetbios,
2002 .special = NULL,
2003 .enum_list = NULL,
2004 .flags = FLAG_ADVANCED,
2007 .label = "reset on zero vc",
2008 .type = P_BOOL,
2009 .p_class = P_GLOBAL,
2010 .ptr = &Globals.bResetOnZeroVC,
2011 .special = NULL,
2012 .enum_list = NULL,
2013 .flags = FLAG_ADVANCED,
2016 .label = "acl compatibility",
2017 .type = P_ENUM,
2018 .p_class = P_GLOBAL,
2019 .ptr = &Globals.iAclCompat,
2020 .special = NULL,
2021 .enum_list = enum_acl_compat_vals,
2022 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2025 .label = "defer sharing violations",
2026 .type = P_BOOL,
2027 .p_class = P_GLOBAL,
2028 .ptr = &Globals.bDeferSharingViolations,
2029 .special = NULL,
2030 .enum_list = NULL,
2031 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
2034 .label = "ea support",
2035 .type = P_BOOL,
2036 .p_class = P_LOCAL,
2037 .ptr = &sDefault.bEASupport,
2038 .special = NULL,
2039 .enum_list = NULL,
2040 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2043 .label = "nt acl support",
2044 .type = P_BOOL,
2045 .p_class = P_LOCAL,
2046 .ptr = &sDefault.bNTAclSupport,
2047 .special = NULL,
2048 .enum_list = NULL,
2049 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2052 .label = "nt pipe support",
2053 .type = P_BOOL,
2054 .p_class = P_GLOBAL,
2055 .ptr = &Globals.bNTPipeSupport,
2056 .special = NULL,
2057 .enum_list = NULL,
2058 .flags = FLAG_ADVANCED,
2061 .label = "nt status support",
2062 .type = P_BOOL,
2063 .p_class = P_GLOBAL,
2064 .ptr = &Globals.bNTStatusSupport,
2065 .special = NULL,
2066 .enum_list = NULL,
2067 .flags = FLAG_ADVANCED,
2070 .label = "profile acls",
2071 .type = P_BOOL,
2072 .p_class = P_LOCAL,
2073 .ptr = &sDefault.bProfileAcls,
2074 .special = NULL,
2075 .enum_list = NULL,
2076 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
2079 .label = "announce version",
2080 .type = P_STRING,
2081 .p_class = P_GLOBAL,
2082 .ptr = &Globals.szAnnounceVersion,
2083 .special = NULL,
2084 .enum_list = NULL,
2085 .flags = FLAG_ADVANCED,
2088 .label = "announce as",
2089 .type = P_ENUM,
2090 .p_class = P_GLOBAL,
2091 .ptr = &Globals.announce_as,
2092 .special = NULL,
2093 .enum_list = enum_announce_as,
2094 .flags = FLAG_ADVANCED,
2097 .label = "map acl inherit",
2098 .type = P_BOOL,
2099 .p_class = P_LOCAL,
2100 .ptr = &sDefault.bMap_acl_inherit,
2101 .special = NULL,
2102 .enum_list = NULL,
2103 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2106 .label = "afs share",
2107 .type = P_BOOL,
2108 .p_class = P_LOCAL,
2109 .ptr = &sDefault.bAfs_Share,
2110 .special = NULL,
2111 .enum_list = NULL,
2112 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2115 .label = "max mux",
2116 .type = P_INTEGER,
2117 .p_class = P_GLOBAL,
2118 .ptr = &Globals.max_mux,
2119 .special = NULL,
2120 .enum_list = NULL,
2121 .flags = FLAG_ADVANCED,
2124 .label = "max xmit",
2125 .type = P_INTEGER,
2126 .p_class = P_GLOBAL,
2127 .ptr = &Globals.max_xmit,
2128 .special = NULL,
2129 .enum_list = NULL,
2130 .flags = FLAG_ADVANCED,
2133 .label = "name resolve order",
2134 .type = P_STRING,
2135 .p_class = P_GLOBAL,
2136 .ptr = &Globals.szNameResolveOrder,
2137 .special = NULL,
2138 .enum_list = NULL,
2139 .flags = FLAG_ADVANCED | FLAG_WIZARD,
2142 .label = "max ttl",
2143 .type = P_INTEGER,
2144 .p_class = P_GLOBAL,
2145 .ptr = &Globals.max_ttl,
2146 .special = NULL,
2147 .enum_list = NULL,
2148 .flags = FLAG_ADVANCED,
2151 .label = "max wins ttl",
2152 .type = P_INTEGER,
2153 .p_class = P_GLOBAL,
2154 .ptr = &Globals.max_wins_ttl,
2155 .special = NULL,
2156 .enum_list = NULL,
2157 .flags = FLAG_ADVANCED,
2160 .label = "min wins ttl",
2161 .type = P_INTEGER,
2162 .p_class = P_GLOBAL,
2163 .ptr = &Globals.min_wins_ttl,
2164 .special = NULL,
2165 .enum_list = NULL,
2166 .flags = FLAG_ADVANCED,
2169 .label = "time server",
2170 .type = P_BOOL,
2171 .p_class = P_GLOBAL,
2172 .ptr = &Globals.bTimeServer,
2173 .special = NULL,
2174 .enum_list = NULL,
2175 .flags = FLAG_ADVANCED,
2178 .label = "unix extensions",
2179 .type = P_BOOL,
2180 .p_class = P_GLOBAL,
2181 .ptr = &Globals.bUnixExtensions,
2182 .special = NULL,
2183 .enum_list = NULL,
2184 .flags = FLAG_ADVANCED,
2187 .label = "use spnego",
2188 .type = P_BOOL,
2189 .p_class = P_GLOBAL,
2190 .ptr = &Globals.bUseSpnego,
2191 .special = NULL,
2192 .enum_list = NULL,
2193 .flags = FLAG_ADVANCED,
2196 .label = "client signing",
2197 .type = P_ENUM,
2198 .p_class = P_GLOBAL,
2199 .ptr = &Globals.client_signing,
2200 .special = NULL,
2201 .enum_list = enum_smb_signing_vals,
2202 .flags = FLAG_ADVANCED,
2205 .label = "server signing",
2206 .type = P_ENUM,
2207 .p_class = P_GLOBAL,
2208 .ptr = &Globals.server_signing,
2209 .special = NULL,
2210 .enum_list = enum_smb_signing_vals,
2211 .flags = FLAG_ADVANCED,
2214 .label = "smb encrypt",
2215 .type = P_ENUM,
2216 .p_class = P_LOCAL,
2217 .ptr = &sDefault.ismb_encrypt,
2218 .special = NULL,
2219 .enum_list = enum_smb_signing_vals,
2220 .flags = FLAG_ADVANCED,
2223 .label = "client use spnego",
2224 .type = P_BOOL,
2225 .p_class = P_GLOBAL,
2226 .ptr = &Globals.bClientUseSpnego,
2227 .special = NULL,
2228 .enum_list = NULL,
2229 .flags = FLAG_ADVANCED,
2232 .label = "client ldap sasl wrapping",
2233 .type = P_ENUM,
2234 .p_class = P_GLOBAL,
2235 .ptr = &Globals.client_ldap_sasl_wrapping,
2236 .special = NULL,
2237 .enum_list = enum_ldap_sasl_wrapping,
2238 .flags = FLAG_ADVANCED,
2241 .label = "enable asu support",
2242 .type = P_BOOL,
2243 .p_class = P_GLOBAL,
2244 .ptr = &Globals.bASUSupport,
2245 .special = NULL,
2246 .enum_list = NULL,
2247 .flags = FLAG_ADVANCED,
2250 .label = "svcctl list",
2251 .type = P_LIST,
2252 .p_class = P_GLOBAL,
2253 .ptr = &Globals.szServicesList,
2254 .special = NULL,
2255 .enum_list = NULL,
2256 .flags = FLAG_ADVANCED,
2259 {N_("Tuning Options"), P_SEP, P_SEPARATOR},
2262 .label = "block size",
2263 .type = P_INTEGER,
2264 .p_class = P_LOCAL,
2265 .ptr = &sDefault.iBlock_size,
2266 .special = NULL,
2267 .enum_list = NULL,
2268 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2271 .label = "deadtime",
2272 .type = P_INTEGER,
2273 .p_class = P_GLOBAL,
2274 .ptr = &Globals.deadtime,
2275 .special = NULL,
2276 .enum_list = NULL,
2277 .flags = FLAG_ADVANCED,
2280 .label = "getwd cache",
2281 .type = P_BOOL,
2282 .p_class = P_GLOBAL,
2283 .ptr = &Globals.getwd_cache,
2284 .special = NULL,
2285 .enum_list = NULL,
2286 .flags = FLAG_ADVANCED,
2289 .label = "keepalive",
2290 .type = P_INTEGER,
2291 .p_class = P_GLOBAL,
2292 .ptr = &Globals.iKeepalive,
2293 .special = NULL,
2294 .enum_list = NULL,
2295 .flags = FLAG_ADVANCED,
2298 .label = "change notify",
2299 .type = P_BOOL,
2300 .p_class = P_LOCAL,
2301 .ptr = &sDefault.bChangeNotify,
2302 .special = NULL,
2303 .enum_list = NULL,
2304 .flags = FLAG_ADVANCED | FLAG_SHARE,
2307 .label = "directory name cache size",
2308 .type = P_INTEGER,
2309 .p_class = P_LOCAL,
2310 .ptr = &sDefault.iDirectoryNameCacheSize,
2311 .special = NULL,
2312 .enum_list = NULL,
2313 .flags = FLAG_ADVANCED | FLAG_SHARE,
2316 .label = "kernel change notify",
2317 .type = P_BOOL,
2318 .p_class = P_LOCAL,
2319 .ptr = &sDefault.bKernelChangeNotify,
2320 .special = NULL,
2321 .enum_list = NULL,
2322 .flags = FLAG_ADVANCED | FLAG_SHARE,
2325 .label = "lpq cache time",
2326 .type = P_INTEGER,
2327 .p_class = P_GLOBAL,
2328 .ptr = &Globals.lpqcachetime,
2329 .special = NULL,
2330 .enum_list = NULL,
2331 .flags = FLAG_ADVANCED,
2334 .label = "max smbd processes",
2335 .type = P_INTEGER,
2336 .p_class = P_GLOBAL,
2337 .ptr = &Globals.iMaxSmbdProcesses,
2338 .special = NULL,
2339 .enum_list = NULL,
2340 .flags = FLAG_ADVANCED,
2343 .label = "max connections",
2344 .type = P_INTEGER,
2345 .p_class = P_LOCAL,
2346 .ptr = &sDefault.iMaxConnections,
2347 .special = NULL,
2348 .enum_list = NULL,
2349 .flags = FLAG_ADVANCED | FLAG_SHARE,
2352 .label = "paranoid server security",
2353 .type = P_BOOL,
2354 .p_class = P_GLOBAL,
2355 .ptr = &Globals.paranoid_server_security,
2356 .special = NULL,
2357 .enum_list = NULL,
2358 .flags = FLAG_ADVANCED,
2361 .label = "max disk size",
2362 .type = P_INTEGER,
2363 .p_class = P_GLOBAL,
2364 .ptr = &Globals.maxdisksize,
2365 .special = NULL,
2366 .enum_list = NULL,
2367 .flags = FLAG_ADVANCED,
2370 .label = "max open files",
2371 .type = P_INTEGER,
2372 .p_class = P_GLOBAL,
2373 .ptr = &Globals.max_open_files,
2374 .special = NULL,
2375 .enum_list = NULL,
2376 .flags = FLAG_ADVANCED,
2379 .label = "min print space",
2380 .type = P_INTEGER,
2381 .p_class = P_LOCAL,
2382 .ptr = &sDefault.iMinPrintSpace,
2383 .special = NULL,
2384 .enum_list = NULL,
2385 .flags = FLAG_ADVANCED | FLAG_PRINT,
2388 .label = "socket options",
2389 .type = P_STRING,
2390 .p_class = P_GLOBAL,
2391 .ptr = &Globals.szSocketOptions,
2392 .special = NULL,
2393 .enum_list = NULL,
2394 .flags = FLAG_ADVANCED,
2397 .label = "strict allocate",
2398 .type = P_BOOL,
2399 .p_class = P_LOCAL,
2400 .ptr = &sDefault.bStrictAllocate,
2401 .special = NULL,
2402 .enum_list = NULL,
2403 .flags = FLAG_ADVANCED | FLAG_SHARE,
2406 .label = "strict sync",
2407 .type = P_BOOL,
2408 .p_class = P_LOCAL,
2409 .ptr = &sDefault.bStrictSync,
2410 .special = NULL,
2411 .enum_list = NULL,
2412 .flags = FLAG_ADVANCED | FLAG_SHARE,
2415 .label = "sync always",
2416 .type = P_BOOL,
2417 .p_class = P_LOCAL,
2418 .ptr = &sDefault.bSyncAlways,
2419 .special = NULL,
2420 .enum_list = NULL,
2421 .flags = FLAG_ADVANCED | FLAG_SHARE,
2424 .label = "use mmap",
2425 .type = P_BOOL,
2426 .p_class = P_GLOBAL,
2427 .ptr = &Globals.bUseMmap,
2428 .special = NULL,
2429 .enum_list = NULL,
2430 .flags = FLAG_ADVANCED,
2433 .label = "use sendfile",
2434 .type = P_BOOL,
2435 .p_class = P_LOCAL,
2436 .ptr = &sDefault.bUseSendfile,
2437 .special = NULL,
2438 .enum_list = NULL,
2439 .flags = FLAG_ADVANCED | FLAG_SHARE,
2442 .label = "hostname lookups",
2443 .type = P_BOOL,
2444 .p_class = P_GLOBAL,
2445 .ptr = &Globals.bHostnameLookups,
2446 .special = NULL,
2447 .enum_list = NULL,
2448 .flags = FLAG_ADVANCED,
2451 .label = "write cache size",
2452 .type = P_INTEGER,
2453 .p_class = P_LOCAL,
2454 .ptr = &sDefault.iWriteCacheSize,
2455 .special = NULL,
2456 .enum_list = NULL,
2457 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED,
2460 .label = "name cache timeout",
2461 .type = P_INTEGER,
2462 .p_class = P_GLOBAL,
2463 .ptr = &Globals.name_cache_timeout,
2464 .special = NULL,
2465 .enum_list = NULL,
2466 .flags = FLAG_ADVANCED,
2469 .label = "ctdbd socket",
2470 .type = P_STRING,
2471 .p_class = P_GLOBAL,
2472 .ptr = &Globals.ctdbdSocket,
2473 .special = NULL,
2474 .enum_list = NULL,
2475 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
2478 .label = "cluster addresses",
2479 .type = P_LIST,
2480 .p_class = P_GLOBAL,
2481 .ptr = &Globals.szClusterAddresses,
2482 .special = NULL,
2483 .enum_list = NULL,
2484 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
2487 .label = "clustering",
2488 .type = P_BOOL,
2489 .p_class = P_GLOBAL,
2490 .ptr = &Globals.clustering,
2491 .special = NULL,
2492 .enum_list = NULL,
2493 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
2496 {N_("Printing Options"), P_SEP, P_SEPARATOR},
2499 .label = "max reported print jobs",
2500 .type = P_INTEGER,
2501 .p_class = P_LOCAL,
2502 .ptr = &sDefault.iMaxReportedPrintJobs,
2503 .special = NULL,
2504 .enum_list = NULL,
2505 .flags = FLAG_ADVANCED | FLAG_PRINT,
2508 .label = "max print jobs",
2509 .type = P_INTEGER,
2510 .p_class = P_LOCAL,
2511 .ptr = &sDefault.iMaxPrintJobs,
2512 .special = NULL,
2513 .enum_list = NULL,
2514 .flags = FLAG_ADVANCED | FLAG_PRINT,
2517 .label = "load printers",
2518 .type = P_BOOL,
2519 .p_class = P_GLOBAL,
2520 .ptr = &Globals.bLoadPrinters,
2521 .special = NULL,
2522 .enum_list = NULL,
2523 .flags = FLAG_ADVANCED | FLAG_PRINT,
2526 .label = "printcap cache time",
2527 .type = P_INTEGER,
2528 .p_class = P_GLOBAL,
2529 .ptr = &Globals.PrintcapCacheTime,
2530 .special = NULL,
2531 .enum_list = NULL,
2532 .flags = FLAG_ADVANCED | FLAG_PRINT,
2535 .label = "printcap name",
2536 .type = P_STRING,
2537 .p_class = P_GLOBAL,
2538 .ptr = &Globals.szPrintcapname,
2539 .special = NULL,
2540 .enum_list = NULL,
2541 .flags = FLAG_ADVANCED | FLAG_PRINT,
2544 .label = "printcap",
2545 .type = P_STRING,
2546 .p_class = P_GLOBAL,
2547 .ptr = &Globals.szPrintcapname,
2548 .special = NULL,
2549 .enum_list = NULL,
2550 .flags = FLAG_HIDE,
2553 .label = "printable",
2554 .type = P_BOOL,
2555 .p_class = P_LOCAL,
2556 .ptr = &sDefault.bPrint_ok,
2557 .special = NULL,
2558 .enum_list = NULL,
2559 .flags = FLAG_ADVANCED | FLAG_PRINT,
2562 .label = "print ok",
2563 .type = P_BOOL,
2564 .p_class = P_LOCAL,
2565 .ptr = &sDefault.bPrint_ok,
2566 .special = NULL,
2567 .enum_list = NULL,
2568 .flags = FLAG_HIDE,
2571 .label = "printing",
2572 .type = P_ENUM,
2573 .p_class = P_LOCAL,
2574 .ptr = &sDefault.iPrinting,
2575 .special = handle_printing,
2576 .enum_list = enum_printing,
2577 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2580 .label = "cups options",
2581 .type = P_STRING,
2582 .p_class = P_LOCAL,
2583 .ptr = &sDefault.szCupsOptions,
2584 .special = NULL,
2585 .enum_list = NULL,
2586 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2589 .label = "cups server",
2590 .type = P_STRING,
2591 .p_class = P_GLOBAL,
2592 .ptr = &Globals.szCupsServer,
2593 .special = NULL,
2594 .enum_list = NULL,
2595 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2598 .label = "iprint server",
2599 .type = P_STRING,
2600 .p_class = P_GLOBAL,
2601 .ptr = &Globals.szIPrintServer,
2602 .special = NULL,
2603 .enum_list = NULL,
2604 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2607 .label = "print command",
2608 .type = P_STRING,
2609 .p_class = P_LOCAL,
2610 .ptr = &sDefault.szPrintcommand,
2611 .special = NULL,
2612 .enum_list = NULL,
2613 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2616 .label = "disable spoolss",
2617 .type = P_BOOL,
2618 .p_class = P_GLOBAL,
2619 .ptr = &Globals.bDisableSpoolss,
2620 .special = NULL,
2621 .enum_list = NULL,
2622 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2625 .label = "enable spoolss",
2626 .type = P_BOOLREV,
2627 .p_class = P_GLOBAL,
2628 .ptr = &Globals.bDisableSpoolss,
2629 .special = NULL,
2630 .enum_list = NULL,
2631 .flags = FLAG_HIDE,
2634 .label = "lpq command",
2635 .type = P_STRING,
2636 .p_class = P_LOCAL,
2637 .ptr = &sDefault.szLpqcommand,
2638 .special = NULL,
2639 .enum_list = NULL,
2640 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2643 .label = "lprm command",
2644 .type = P_STRING,
2645 .p_class = P_LOCAL,
2646 .ptr = &sDefault.szLprmcommand,
2647 .special = NULL,
2648 .enum_list = NULL,
2649 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2652 .label = "lppause command",
2653 .type = P_STRING,
2654 .p_class = P_LOCAL,
2655 .ptr = &sDefault.szLppausecommand,
2656 .special = NULL,
2657 .enum_list = NULL,
2658 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2661 .label = "lpresume command",
2662 .type = P_STRING,
2663 .p_class = P_LOCAL,
2664 .ptr = &sDefault.szLpresumecommand,
2665 .special = NULL,
2666 .enum_list = NULL,
2667 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2670 .label = "queuepause command",
2671 .type = P_STRING,
2672 .p_class = P_LOCAL,
2673 .ptr = &sDefault.szQueuepausecommand,
2674 .special = NULL,
2675 .enum_list = NULL,
2676 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2679 .label = "queueresume command",
2680 .type = P_STRING,
2681 .p_class = P_LOCAL,
2682 .ptr = &sDefault.szQueueresumecommand,
2683 .special = NULL,
2684 .enum_list = NULL,
2685 .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2688 .label = "addport command",
2689 .type = P_STRING,
2690 .p_class = P_GLOBAL,
2691 .ptr = &Globals.szAddPortCommand,
2692 .special = NULL,
2693 .enum_list = NULL,
2694 .flags = FLAG_ADVANCED,
2697 .label = "enumports command",
2698 .type = P_STRING,
2699 .p_class = P_GLOBAL,
2700 .ptr = &Globals.szEnumPortsCommand,
2701 .special = NULL,
2702 .enum_list = NULL,
2703 .flags = FLAG_ADVANCED,
2706 .label = "addprinter command",
2707 .type = P_STRING,
2708 .p_class = P_GLOBAL,
2709 .ptr = &Globals.szAddPrinterCommand,
2710 .special = NULL,
2711 .enum_list = NULL,
2712 .flags = FLAG_ADVANCED,
2715 .label = "deleteprinter command",
2716 .type = P_STRING,
2717 .p_class = P_GLOBAL,
2718 .ptr = &Globals.szDeletePrinterCommand,
2719 .special = NULL,
2720 .enum_list = NULL,
2721 .flags = FLAG_ADVANCED,
2724 .label = "show add printer wizard",
2725 .type = P_BOOL,
2726 .p_class = P_GLOBAL,
2727 .ptr = &Globals.bMsAddPrinterWizard,
2728 .special = NULL,
2729 .enum_list = NULL,
2730 .flags = FLAG_ADVANCED,
2733 .label = "os2 driver map",
2734 .type = P_STRING,
2735 .p_class = P_GLOBAL,
2736 .ptr = &Globals.szOs2DriverMap,
2737 .special = NULL,
2738 .enum_list = NULL,
2739 .flags = FLAG_ADVANCED,
2743 .label = "printer name",
2744 .type = P_STRING,
2745 .p_class = P_LOCAL,
2746 .ptr = &sDefault.szPrintername,
2747 .special = NULL,
2748 .enum_list = NULL,
2749 .flags = FLAG_ADVANCED | FLAG_PRINT,
2752 .label = "printer",
2753 .type = P_STRING,
2754 .p_class = P_LOCAL,
2755 .ptr = &sDefault.szPrintername,
2756 .special = NULL,
2757 .enum_list = NULL,
2758 .flags = FLAG_HIDE,
2761 .label = "use client driver",
2762 .type = P_BOOL,
2763 .p_class = P_LOCAL,
2764 .ptr = &sDefault.bUseClientDriver,
2765 .special = NULL,
2766 .enum_list = NULL,
2767 .flags = FLAG_ADVANCED | FLAG_PRINT,
2770 .label = "default devmode",
2771 .type = P_BOOL,
2772 .p_class = P_LOCAL,
2773 .ptr = &sDefault.bDefaultDevmode,
2774 .special = NULL,
2775 .enum_list = NULL,
2776 .flags = FLAG_ADVANCED | FLAG_PRINT,
2779 .label = "force printername",
2780 .type = P_BOOL,
2781 .p_class = P_LOCAL,
2782 .ptr = &sDefault.bForcePrintername,
2783 .special = NULL,
2784 .enum_list = NULL,
2785 .flags = FLAG_ADVANCED | FLAG_PRINT,
2788 .label = "printjob username",
2789 .type = P_STRING,
2790 .p_class = P_LOCAL,
2791 .ptr = &sDefault.szPrintjobUsername,
2792 .special = NULL,
2793 .enum_list = NULL,
2794 .flags = FLAG_ADVANCED | FLAG_PRINT,
2797 {N_("Filename Handling"), P_SEP, P_SEPARATOR},
2800 .label = "mangling method",
2801 .type = P_STRING,
2802 .p_class = P_GLOBAL,
2803 .ptr = &Globals.szManglingMethod,
2804 .special = NULL,
2805 .enum_list = NULL,
2806 .flags = FLAG_ADVANCED,
2809 .label = "mangle prefix",
2810 .type = P_INTEGER,
2811 .p_class = P_GLOBAL,
2812 .ptr = &Globals.mangle_prefix,
2813 .special = NULL,
2814 .enum_list = NULL,
2815 .flags = FLAG_ADVANCED,
2819 .label = "default case",
2820 .type = P_ENUM,
2821 .p_class = P_LOCAL,
2822 .ptr = &sDefault.iDefaultCase,
2823 .special = NULL,
2824 .enum_list = enum_case,
2825 .flags = FLAG_ADVANCED | FLAG_SHARE,
2828 .label = "case sensitive",
2829 .type = P_ENUM,
2830 .p_class = P_LOCAL,
2831 .ptr = &sDefault.iCaseSensitive,
2832 .special = NULL,
2833 .enum_list = enum_bool_auto,
2834 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2837 .label = "casesignames",
2838 .type = P_ENUM,
2839 .p_class = P_LOCAL,
2840 .ptr = &sDefault.iCaseSensitive,
2841 .special = NULL,
2842 .enum_list = enum_bool_auto,
2843 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_HIDE,
2846 .label = "preserve case",
2847 .type = P_BOOL,
2848 .p_class = P_LOCAL,
2849 .ptr = &sDefault.bCasePreserve,
2850 .special = NULL,
2851 .enum_list = NULL,
2852 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2855 .label = "short preserve case",
2856 .type = P_BOOL,
2857 .p_class = P_LOCAL,
2858 .ptr = &sDefault.bShortCasePreserve,
2859 .special = NULL,
2860 .enum_list = NULL,
2861 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2864 .label = "mangling char",
2865 .type = P_CHAR,
2866 .p_class = P_LOCAL,
2867 .ptr = &sDefault.magic_char,
2868 .special = NULL,
2869 .enum_list = NULL,
2870 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2873 .label = "hide dot files",
2874 .type = P_BOOL,
2875 .p_class = P_LOCAL,
2876 .ptr = &sDefault.bHideDotFiles,
2877 .special = NULL,
2878 .enum_list = NULL,
2879 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2882 .label = "hide special files",
2883 .type = P_BOOL,
2884 .p_class = P_LOCAL,
2885 .ptr = &sDefault.bHideSpecialFiles,
2886 .special = NULL,
2887 .enum_list = NULL,
2888 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2891 .label = "hide unreadable",
2892 .type = P_BOOL,
2893 .p_class = P_LOCAL,
2894 .ptr = &sDefault.bHideUnReadable,
2895 .special = NULL,
2896 .enum_list = NULL,
2897 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2900 .label = "hide unwriteable files",
2901 .type = P_BOOL,
2902 .p_class = P_LOCAL,
2903 .ptr = &sDefault.bHideUnWriteableFiles,
2904 .special = NULL,
2905 .enum_list = NULL,
2906 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2909 .label = "delete veto files",
2910 .type = P_BOOL,
2911 .p_class = P_LOCAL,
2912 .ptr = &sDefault.bDeleteVetoFiles,
2913 .special = NULL,
2914 .enum_list = NULL,
2915 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2918 .label = "veto files",
2919 .type = P_STRING,
2920 .p_class = P_LOCAL,
2921 .ptr = &sDefault.szVetoFiles,
2922 .special = NULL,
2923 .enum_list = NULL,
2924 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2927 .label = "hide files",
2928 .type = P_STRING,
2929 .p_class = P_LOCAL,
2930 .ptr = &sDefault.szHideFiles,
2931 .special = NULL,
2932 .enum_list = NULL,
2933 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2936 .label = "veto oplock files",
2937 .type = P_STRING,
2938 .p_class = P_LOCAL,
2939 .ptr = &sDefault.szVetoOplockFiles,
2940 .special = NULL,
2941 .enum_list = NULL,
2942 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2945 .label = "map archive",
2946 .type = P_BOOL,
2947 .p_class = P_LOCAL,
2948 .ptr = &sDefault.bMap_archive,
2949 .special = NULL,
2950 .enum_list = NULL,
2951 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2954 .label = "map hidden",
2955 .type = P_BOOL,
2956 .p_class = P_LOCAL,
2957 .ptr = &sDefault.bMap_hidden,
2958 .special = NULL,
2959 .enum_list = NULL,
2960 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2963 .label = "map system",
2964 .type = P_BOOL,
2965 .p_class = P_LOCAL,
2966 .ptr = &sDefault.bMap_system,
2967 .special = NULL,
2968 .enum_list = NULL,
2969 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2972 .label = "map readonly",
2973 .type = P_ENUM,
2974 .p_class = P_LOCAL,
2975 .ptr = &sDefault.iMap_readonly,
2976 .special = NULL,
2977 .enum_list = enum_map_readonly,
2978 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2981 .label = "mangled names",
2982 .type = P_BOOL,
2983 .p_class = P_LOCAL,
2984 .ptr = &sDefault.bMangledNames,
2985 .special = NULL,
2986 .enum_list = NULL,
2987 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2990 .label = "max stat cache size",
2991 .type = P_INTEGER,
2992 .p_class = P_GLOBAL,
2993 .ptr = &Globals.iMaxStatCacheSize,
2994 .special = NULL,
2995 .enum_list = NULL,
2996 .flags = FLAG_ADVANCED,
2999 .label = "stat cache",
3000 .type = P_BOOL,
3001 .p_class = P_GLOBAL,
3002 .ptr = &Globals.bStatCache,
3003 .special = NULL,
3004 .enum_list = NULL,
3005 .flags = FLAG_ADVANCED,
3008 .label = "store dos attributes",
3009 .type = P_BOOL,
3010 .p_class = P_LOCAL,
3011 .ptr = &sDefault.bStoreDosAttributes,
3012 .special = NULL,
3013 .enum_list = NULL,
3014 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3017 .label = "dmapi support",
3018 .type = P_BOOL,
3019 .p_class = P_LOCAL,
3020 .ptr = &sDefault.bDmapiSupport,
3021 .special = NULL,
3022 .enum_list = NULL,
3023 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3027 {N_("Domain Options"), P_SEP, P_SEPARATOR},
3030 .label = "machine password timeout",
3031 .type = P_INTEGER,
3032 .p_class = P_GLOBAL,
3033 .ptr = &Globals.machine_password_timeout,
3034 .special = NULL,
3035 .enum_list = NULL,
3036 .flags = FLAG_ADVANCED | FLAG_WIZARD,
3039 {N_("Logon Options"), P_SEP, P_SEPARATOR},
3042 .label = "add user script",
3043 .type = P_STRING,
3044 .p_class = P_GLOBAL,
3045 .ptr = &Globals.szAddUserScript,
3046 .special = NULL,
3047 .enum_list = NULL,
3048 .flags = FLAG_ADVANCED,
3051 .label = "rename user script",
3052 .type = P_STRING,
3053 .p_class = P_GLOBAL,
3054 .ptr = &Globals.szRenameUserScript,
3055 .special = NULL,
3056 .enum_list = NULL,
3057 .flags = FLAG_ADVANCED,
3060 .label = "delete user script",
3061 .type = P_STRING,
3062 .p_class = P_GLOBAL,
3063 .ptr = &Globals.szDelUserScript,
3064 .special = NULL,
3065 .enum_list = NULL,
3066 .flags = FLAG_ADVANCED,
3069 .label = "add group script",
3070 .type = P_STRING,
3071 .p_class = P_GLOBAL,
3072 .ptr = &Globals.szAddGroupScript,
3073 .special = NULL,
3074 .enum_list = NULL,
3075 .flags = FLAG_ADVANCED,
3078 .label = "delete group script",
3079 .type = P_STRING,
3080 .p_class = P_GLOBAL,
3081 .ptr = &Globals.szDelGroupScript,
3082 .special = NULL,
3083 .enum_list = NULL,
3084 .flags = FLAG_ADVANCED,
3087 .label = "add user to group script",
3088 .type = P_STRING,
3089 .p_class = P_GLOBAL,
3090 .ptr = &Globals.szAddUserToGroupScript,
3091 .special = NULL,
3092 .enum_list = NULL,
3093 .flags = FLAG_ADVANCED,
3096 .label = "delete user from group script",
3097 .type = P_STRING,
3098 .p_class = P_GLOBAL,
3099 .ptr = &Globals.szDelUserFromGroupScript,
3100 .special = NULL,
3101 .enum_list = NULL,
3102 .flags = FLAG_ADVANCED,
3105 .label = "set primary group script",
3106 .type = P_STRING,
3107 .p_class = P_GLOBAL,
3108 .ptr = &Globals.szSetPrimaryGroupScript,
3109 .special = NULL,
3110 .enum_list = NULL,
3111 .flags = FLAG_ADVANCED,
3114 .label = "add machine script",
3115 .type = P_STRING,
3116 .p_class = P_GLOBAL,
3117 .ptr = &Globals.szAddMachineScript,
3118 .special = NULL,
3119 .enum_list = NULL,
3120 .flags = FLAG_ADVANCED,
3123 .label = "shutdown script",
3124 .type = P_STRING,
3125 .p_class = P_GLOBAL,
3126 .ptr = &Globals.szShutdownScript,
3127 .special = NULL,
3128 .enum_list = NULL,
3129 .flags = FLAG_ADVANCED,
3132 .label = "abort shutdown script",
3133 .type = P_STRING,
3134 .p_class = P_GLOBAL,
3135 .ptr = &Globals.szAbortShutdownScript,
3136 .special = NULL,
3137 .enum_list = NULL,
3138 .flags = FLAG_ADVANCED,
3141 .label = "username map script",
3142 .type = P_STRING,
3143 .p_class = P_GLOBAL,
3144 .ptr = &Globals.szUsernameMapScript,
3145 .special = NULL,
3146 .enum_list = NULL,
3147 .flags = FLAG_ADVANCED,
3150 .label = "logon script",
3151 .type = P_STRING,
3152 .p_class = P_GLOBAL,
3153 .ptr = &Globals.szLogonScript,
3154 .special = NULL,
3155 .enum_list = NULL,
3156 .flags = FLAG_ADVANCED,
3159 .label = "logon path",
3160 .type = P_STRING,
3161 .p_class = P_GLOBAL,
3162 .ptr = &Globals.szLogonPath,
3163 .special = NULL,
3164 .enum_list = NULL,
3165 .flags = FLAG_ADVANCED,
3168 .label = "logon drive",
3169 .type = P_STRING,
3170 .p_class = P_GLOBAL,
3171 .ptr = &Globals.szLogonDrive,
3172 .special = NULL,
3173 .enum_list = NULL,
3174 .flags = FLAG_ADVANCED,
3177 .label = "logon home",
3178 .type = P_STRING,
3179 .p_class = P_GLOBAL,
3180 .ptr = &Globals.szLogonHome,
3181 .special = NULL,
3182 .enum_list = NULL,
3183 .flags = FLAG_ADVANCED,
3186 .label = "domain logons",
3187 .type = P_BOOL,
3188 .p_class = P_GLOBAL,
3189 .ptr = &Globals.bDomainLogons,
3190 .special = NULL,
3191 .enum_list = NULL,
3192 .flags = FLAG_ADVANCED,
3195 {N_("Browse Options"), P_SEP, P_SEPARATOR},
3198 .label = "os level",
3199 .type = P_INTEGER,
3200 .p_class = P_GLOBAL,
3201 .ptr = &Globals.os_level,
3202 .special = NULL,
3203 .enum_list = NULL,
3204 .flags = FLAG_BASIC | FLAG_ADVANCED,
3207 .label = "lm announce",
3208 .type = P_ENUM,
3209 .p_class = P_GLOBAL,
3210 .ptr = &Globals.lm_announce,
3211 .special = NULL,
3212 .enum_list = enum_bool_auto,
3213 .flags = FLAG_ADVANCED,
3216 .label = "lm interval",
3217 .type = P_INTEGER,
3218 .p_class = P_GLOBAL,
3219 .ptr = &Globals.lm_interval,
3220 .special = NULL,
3221 .enum_list = NULL,
3222 .flags = FLAG_ADVANCED,
3225 .label = "preferred master",
3226 .type = P_ENUM,
3227 .p_class = P_GLOBAL,
3228 .ptr = &Globals.iPreferredMaster,
3229 .special = NULL,
3230 .enum_list = enum_bool_auto,
3231 .flags = FLAG_BASIC | FLAG_ADVANCED,
3234 .label = "prefered master",
3235 .type = P_ENUM,
3236 .p_class = P_GLOBAL,
3237 .ptr = &Globals.iPreferredMaster,
3238 .special = NULL,
3239 .enum_list = enum_bool_auto,
3240 .flags = FLAG_HIDE,
3243 .label = "local master",
3244 .type = P_BOOL,
3245 .p_class = P_GLOBAL,
3246 .ptr = &Globals.bLocalMaster,
3247 .special = NULL,
3248 .enum_list = NULL,
3249 .flags = FLAG_BASIC | FLAG_ADVANCED,
3252 .label = "domain master",
3253 .type = P_ENUM,
3254 .p_class = P_GLOBAL,
3255 .ptr = &Globals.iDomainMaster,
3256 .special = NULL,
3257 .enum_list = enum_bool_auto,
3258 .flags = FLAG_BASIC | FLAG_ADVANCED,
3261 .label = "browse list",
3262 .type = P_BOOL,
3263 .p_class = P_GLOBAL,
3264 .ptr = &Globals.bBrowseList,
3265 .special = NULL,
3266 .enum_list = NULL,
3267 .flags = FLAG_ADVANCED,
3270 .label = "browseable",
3271 .type = P_BOOL,
3272 .p_class = P_LOCAL,
3273 .ptr = &sDefault.bBrowseable,
3274 .special = NULL,
3275 .enum_list = NULL,
3276 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
3279 .label = "browsable",
3280 .type = P_BOOL,
3281 .p_class = P_LOCAL,
3282 .ptr = &sDefault.bBrowseable,
3283 .special = NULL,
3284 .enum_list = NULL,
3285 .flags = FLAG_HIDE,
3288 .label = "enhanced browsing",
3289 .type = P_BOOL,
3290 .p_class = P_GLOBAL,
3291 .ptr = &Globals.enhanced_browsing,
3292 .special = NULL,
3293 .enum_list = NULL,
3294 .flags = FLAG_ADVANCED,
3297 {N_("WINS Options"), P_SEP, P_SEPARATOR},
3300 .label = "dns proxy",
3301 .type = P_BOOL,
3302 .p_class = P_GLOBAL,
3303 .ptr = &Globals.bDNSproxy,
3304 .special = NULL,
3305 .enum_list = NULL,
3306 .flags = FLAG_ADVANCED,
3309 .label = "wins proxy",
3310 .type = P_BOOL,
3311 .p_class = P_GLOBAL,
3312 .ptr = &Globals.bWINSproxy,
3313 .special = NULL,
3314 .enum_list = NULL,
3315 .flags = FLAG_ADVANCED,
3318 .label = "wins server",
3319 .type = P_LIST,
3320 .p_class = P_GLOBAL,
3321 .ptr = &Globals.szWINSservers,
3322 .special = NULL,
3323 .enum_list = NULL,
3324 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
3327 .label = "wins support",
3328 .type = P_BOOL,
3329 .p_class = P_GLOBAL,
3330 .ptr = &Globals.bWINSsupport,
3331 .special = NULL,
3332 .enum_list = NULL,
3333 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
3336 .label = "wins hook",
3337 .type = P_STRING,
3338 .p_class = P_GLOBAL,
3339 .ptr = &Globals.szWINSHook,
3340 .special = NULL,
3341 .enum_list = NULL,
3342 .flags = FLAG_ADVANCED,
3345 {N_("Locking Options"), P_SEP, P_SEPARATOR},
3348 .label = "blocking locks",
3349 .type = P_BOOL,
3350 .p_class = P_LOCAL,
3351 .ptr = &sDefault.bBlockingLocks,
3352 .special = NULL,
3353 .enum_list = NULL,
3354 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3357 .label = "csc policy",
3358 .type = P_ENUM,
3359 .p_class = P_LOCAL,
3360 .ptr = &sDefault.iCSCPolicy,
3361 .special = NULL,
3362 .enum_list = enum_csc_policy,
3363 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3366 .label = "fake oplocks",
3367 .type = P_BOOL,
3368 .p_class = P_LOCAL,
3369 .ptr = &sDefault.bFakeOplocks,
3370 .special = NULL,
3371 .enum_list = NULL,
3372 .flags = FLAG_ADVANCED | FLAG_SHARE,
3375 .label = "kernel oplocks",
3376 .type = P_BOOL,
3377 .p_class = P_GLOBAL,
3378 .ptr = &Globals.bKernelOplocks,
3379 .special = NULL,
3380 .enum_list = NULL,
3381 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
3384 .label = "locking",
3385 .type = P_BOOL,
3386 .p_class = P_LOCAL,
3387 .ptr = &sDefault.bLocking,
3388 .special = NULL,
3389 .enum_list = NULL,
3390 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3393 .label = "lock spin time",
3394 .type = P_INTEGER,
3395 .p_class = P_GLOBAL,
3396 .ptr = &Globals.iLockSpinTime,
3397 .special = NULL,
3398 .enum_list = NULL,
3399 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
3402 .label = "oplocks",
3403 .type = P_BOOL,
3404 .p_class = P_LOCAL,
3405 .ptr = &sDefault.bOpLocks,
3406 .special = NULL,
3407 .enum_list = NULL,
3408 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3411 .label = "level2 oplocks",
3412 .type = P_BOOL,
3413 .p_class = P_LOCAL,
3414 .ptr = &sDefault.bLevel2OpLocks,
3415 .special = NULL,
3416 .enum_list = NULL,
3417 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3420 .label = "oplock break wait time",
3421 .type = P_INTEGER,
3422 .p_class = P_GLOBAL,
3423 .ptr = &Globals.oplock_break_wait_time,
3424 .special = NULL,
3425 .enum_list = NULL,
3426 .flags = FLAG_ADVANCED | FLAG_GLOBAL,
3429 .label = "oplock contention limit",
3430 .type = P_INTEGER,
3431 .p_class = P_LOCAL,
3432 .ptr = &sDefault.iOplockContentionLimit,
3433 .special = NULL,
3434 .enum_list = NULL,
3435 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3438 .label = "posix locking",
3439 .type = P_BOOL,
3440 .p_class = P_LOCAL,
3441 .ptr = &sDefault.bPosixLocking,
3442 .special = NULL,
3443 .enum_list = NULL,
3444 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3447 .label = "strict locking",
3448 .type = P_ENUM,
3449 .p_class = P_LOCAL,
3450 .ptr = &sDefault.iStrictLocking,
3451 .special = NULL,
3452 .enum_list = enum_bool_auto,
3453 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3456 .label = "share modes",
3457 .type = P_BOOL,
3458 .p_class = P_LOCAL,
3459 .ptr = &sDefault.bShareModes,
3460 .special = NULL,
3461 .enum_list = NULL,
3462 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3465 {N_("Ldap Options"), P_SEP, P_SEPARATOR},
3468 .label = "ldap admin dn",
3469 .type = P_STRING,
3470 .p_class = P_GLOBAL,
3471 .ptr = &Globals.szLdapAdminDn,
3472 .special = NULL,
3473 .enum_list = NULL,
3474 .flags = FLAG_ADVANCED,
3477 .label = "ldap delete dn",
3478 .type = P_BOOL,
3479 .p_class = P_GLOBAL,
3480 .ptr = &Globals.ldap_delete_dn,
3481 .special = NULL,
3482 .enum_list = NULL,
3483 .flags = FLAG_ADVANCED,
3486 .label = "ldap group suffix",
3487 .type = P_STRING,
3488 .p_class = P_GLOBAL,
3489 .ptr = &Globals.szLdapGroupSuffix,
3490 .special = NULL,
3491 .enum_list = NULL,
3492 .flags = FLAG_ADVANCED,
3495 .label = "ldap idmap suffix",
3496 .type = P_STRING,
3497 .p_class = P_GLOBAL,
3498 .ptr = &Globals.szLdapIdmapSuffix,
3499 .special = NULL,
3500 .enum_list = NULL,
3501 .flags = FLAG_ADVANCED,
3504 .label = "ldap machine suffix",
3505 .type = P_STRING,
3506 .p_class = P_GLOBAL,
3507 .ptr = &Globals.szLdapMachineSuffix,
3508 .special = NULL,
3509 .enum_list = NULL,
3510 .flags = FLAG_ADVANCED,
3513 .label = "ldap passwd sync",
3514 .type = P_ENUM,
3515 .p_class = P_GLOBAL,
3516 .ptr = &Globals.ldap_passwd_sync,
3517 .special = NULL,
3518 .enum_list = enum_ldap_passwd_sync,
3519 .flags = FLAG_ADVANCED,
3522 .label = "ldap password sync",
3523 .type = P_ENUM,
3524 .p_class = P_GLOBAL,
3525 .ptr = &Globals.ldap_passwd_sync,
3526 .special = NULL,
3527 .enum_list = enum_ldap_passwd_sync,
3528 .flags = FLAG_HIDE,
3531 .label = "ldap replication sleep",
3532 .type = P_INTEGER,
3533 .p_class = P_GLOBAL,
3534 .ptr = &Globals.ldap_replication_sleep,
3535 .special = NULL,
3536 .enum_list = NULL,
3537 .flags = FLAG_ADVANCED,
3540 .label = "ldap suffix",
3541 .type = P_STRING,
3542 .p_class = P_GLOBAL,
3543 .ptr = &Globals.szLdapSuffix,
3544 .special = NULL,
3545 .enum_list = NULL,
3546 .flags = FLAG_ADVANCED,
3549 .label = "ldap ssl",
3550 .type = P_ENUM,
3551 .p_class = P_GLOBAL,
3552 .ptr = &Globals.ldap_ssl,
3553 .special = NULL,
3554 .enum_list = enum_ldap_ssl,
3555 .flags = FLAG_ADVANCED,
3558 .label = "ldap timeout",
3559 .type = P_INTEGER,
3560 .p_class = P_GLOBAL,
3561 .ptr = &Globals.ldap_timeout,
3562 .special = NULL,
3563 .enum_list = NULL,
3564 .flags = FLAG_ADVANCED,
3567 .label = "ldap connection timeout",
3568 .type = P_INTEGER,
3569 .p_class = P_GLOBAL,
3570 .ptr = &Globals.ldap_connection_timeout,
3571 .special = NULL,
3572 .enum_list = NULL,
3573 .flags = FLAG_ADVANCED,
3576 .label = "ldap page size",
3577 .type = P_INTEGER,
3578 .p_class = P_GLOBAL,
3579 .ptr = &Globals.ldap_page_size,
3580 .special = NULL,
3581 .enum_list = NULL,
3582 .flags = FLAG_ADVANCED,
3585 .label = "ldap user suffix",
3586 .type = P_STRING,
3587 .p_class = P_GLOBAL,
3588 .ptr = &Globals.szLdapUserSuffix,
3589 .special = NULL,
3590 .enum_list = NULL,
3591 .flags = FLAG_ADVANCED,
3594 .label = "ldap debug level",
3595 .type = P_INTEGER,
3596 .p_class = P_GLOBAL,
3597 .ptr = &Globals.ldap_debug_level,
3598 .special = handle_ldap_debug_level,
3599 .enum_list = NULL,
3600 .flags = FLAG_ADVANCED,
3603 .label = "ldap debug threshold",
3604 .type = P_INTEGER,
3605 .p_class = P_GLOBAL,
3606 .ptr = &Globals.ldap_debug_threshold,
3607 .special = NULL,
3608 .enum_list = NULL,
3609 .flags = FLAG_ADVANCED,
3612 {N_("EventLog Options"), P_SEP, P_SEPARATOR},
3615 .label = "eventlog list",
3616 .type = P_LIST,
3617 .p_class = P_GLOBAL,
3618 .ptr = &Globals.szEventLogs,
3619 .special = NULL,
3620 .enum_list = NULL,
3621 .flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
3624 {N_("Miscellaneous Options"), P_SEP, P_SEPARATOR},
3627 .label = "add share command",
3628 .type = P_STRING,
3629 .p_class = P_GLOBAL,
3630 .ptr = &Globals.szAddShareCommand,
3631 .special = NULL,
3632 .enum_list = NULL,
3633 .flags = FLAG_ADVANCED,
3636 .label = "change share command",
3637 .type = P_STRING,
3638 .p_class = P_GLOBAL,
3639 .ptr = &Globals.szChangeShareCommand,
3640 .special = NULL,
3641 .enum_list = NULL,
3642 .flags = FLAG_ADVANCED,
3645 .label = "delete share command",
3646 .type = P_STRING,
3647 .p_class = P_GLOBAL,
3648 .ptr = &Globals.szDeleteShareCommand,
3649 .special = NULL,
3650 .enum_list = NULL,
3651 .flags = FLAG_ADVANCED,
3654 .label = "config file",
3655 .type = P_STRING,
3656 .p_class = P_GLOBAL,
3657 .ptr = &Globals.szConfigFile,
3658 .special = NULL,
3659 .enum_list = NULL,
3660 .flags = FLAG_HIDE,
3663 .label = "preload",
3664 .type = P_STRING,
3665 .p_class = P_GLOBAL,
3666 .ptr = &Globals.szAutoServices,
3667 .special = NULL,
3668 .enum_list = NULL,
3669 .flags = FLAG_ADVANCED,
3672 .label = "auto services",
3673 .type = P_STRING,
3674 .p_class = P_GLOBAL,
3675 .ptr = &Globals.szAutoServices,
3676 .special = NULL,
3677 .enum_list = NULL,
3678 .flags = FLAG_ADVANCED,
3681 .label = "lock directory",
3682 .type = P_STRING,
3683 .p_class = P_GLOBAL,
3684 .ptr = &Globals.szLockDir,
3685 .special = NULL,
3686 .enum_list = NULL,
3687 .flags = FLAG_ADVANCED,
3690 .label = "lock dir",
3691 .type = P_STRING,
3692 .p_class = P_GLOBAL,
3693 .ptr = &Globals.szLockDir,
3694 .special = NULL,
3695 .enum_list = NULL,
3696 .flags = FLAG_HIDE,
3699 .label = "pid directory",
3700 .type = P_STRING,
3701 .p_class = P_GLOBAL,
3702 .ptr = &Globals.szPidDir,
3703 .special = NULL,
3704 .enum_list = NULL,
3705 .flags = FLAG_ADVANCED,
3707 #ifdef WITH_UTMP
3709 .label = "utmp directory",
3710 .type = P_STRING,
3711 .p_class = P_GLOBAL,
3712 .ptr = &Globals.szUtmpDir,
3713 .special = NULL,
3714 .enum_list = NULL,
3715 .flags = FLAG_ADVANCED,
3718 .label = "wtmp directory",
3719 .type = P_STRING,
3720 .p_class = P_GLOBAL,
3721 .ptr = &Globals.szWtmpDir,
3722 .special = NULL,
3723 .enum_list = NULL,
3724 .flags = FLAG_ADVANCED,
3727 .label = "utmp",
3728 .type = P_BOOL,
3729 .p_class = P_GLOBAL,
3730 .ptr = &Globals.bUtmp,
3731 .special = NULL,
3732 .enum_list = NULL,
3733 .flags = FLAG_ADVANCED,
3735 #endif
3737 .label = "default service",
3738 .type = P_STRING,
3739 .p_class = P_GLOBAL,
3740 .ptr = &Globals.szDefaultService,
3741 .special = NULL,
3742 .enum_list = NULL,
3743 .flags = FLAG_ADVANCED,
3746 .label = "default",
3747 .type = P_STRING,
3748 .p_class = P_GLOBAL,
3749 .ptr = &Globals.szDefaultService,
3750 .special = NULL,
3751 .enum_list = NULL,
3752 .flags = FLAG_ADVANCED,
3755 .label = "message command",
3756 .type = P_STRING,
3757 .p_class = P_GLOBAL,
3758 .ptr = &Globals.szMsgCommand,
3759 .special = NULL,
3760 .enum_list = NULL,
3761 .flags = FLAG_ADVANCED,
3764 .label = "dfree cache time",
3765 .type = P_INTEGER,
3766 .p_class = P_LOCAL,
3767 .ptr = &sDefault.iDfreeCacheTime,
3768 .special = NULL,
3769 .enum_list = NULL,
3770 .flags = FLAG_ADVANCED,
3773 .label = "dfree command",
3774 .type = P_STRING,
3775 .p_class = P_LOCAL,
3776 .ptr = &sDefault.szDfree,
3777 .special = NULL,
3778 .enum_list = NULL,
3779 .flags = FLAG_ADVANCED,
3782 .label = "get quota command",
3783 .type = P_STRING,
3784 .p_class = P_GLOBAL,
3785 .ptr = &Globals.szGetQuota,
3786 .special = NULL,
3787 .enum_list = NULL,
3788 .flags = FLAG_ADVANCED,
3791 .label = "set quota command",
3792 .type = P_STRING,
3793 .p_class = P_GLOBAL,
3794 .ptr = &Globals.szSetQuota,
3795 .special = NULL,
3796 .enum_list = NULL,
3797 .flags = FLAG_ADVANCED,
3800 .label = "remote announce",
3801 .type = P_STRING,
3802 .p_class = P_GLOBAL,
3803 .ptr = &Globals.szRemoteAnnounce,
3804 .special = NULL,
3805 .enum_list = NULL,
3806 .flags = FLAG_ADVANCED,
3809 .label = "remote browse sync",
3810 .type = P_STRING,
3811 .p_class = P_GLOBAL,
3812 .ptr = &Globals.szRemoteBrowseSync,
3813 .special = NULL,
3814 .enum_list = NULL,
3815 .flags = FLAG_ADVANCED,
3818 .label = "socket address",
3819 .type = P_STRING,
3820 .p_class = P_GLOBAL,
3821 .ptr = &Globals.szSocketAddress,
3822 .special = NULL,
3823 .enum_list = NULL,
3824 .flags = FLAG_ADVANCED,
3827 .label = "homedir map",
3828 .type = P_STRING,
3829 .p_class = P_GLOBAL,
3830 .ptr = &Globals.szNISHomeMapName,
3831 .special = NULL,
3832 .enum_list = NULL,
3833 .flags = FLAG_ADVANCED,
3836 .label = "afs username map",
3837 .type = P_STRING,
3838 .p_class = P_GLOBAL,
3839 .ptr = &Globals.szAfsUsernameMap,
3840 .special = NULL,
3841 .enum_list = NULL,
3842 .flags = FLAG_ADVANCED,
3845 .label = "afs token lifetime",
3846 .type = P_INTEGER,
3847 .p_class = P_GLOBAL,
3848 .ptr = &Globals.iAfsTokenLifetime,
3849 .special = NULL,
3850 .enum_list = NULL,
3851 .flags = FLAG_ADVANCED,
3854 .label = "log nt token command",
3855 .type = P_STRING,
3856 .p_class = P_GLOBAL,
3857 .ptr = &Globals.szLogNtTokenCommand,
3858 .special = NULL,
3859 .enum_list = NULL,
3860 .flags = FLAG_ADVANCED,
3863 .label = "time offset",
3864 .type = P_INTEGER,
3865 .p_class = P_GLOBAL,
3866 .ptr = &extra_time_offset,
3867 .special = NULL,
3868 .enum_list = NULL,
3869 .flags = FLAG_ADVANCED,
3872 .label = "NIS homedir",
3873 .type = P_BOOL,
3874 .p_class = P_GLOBAL,
3875 .ptr = &Globals.bNISHomeMap,
3876 .special = NULL,
3877 .enum_list = NULL,
3878 .flags = FLAG_ADVANCED,
3881 .label = "-valid",
3882 .type = P_BOOL,
3883 .p_class = P_LOCAL,
3884 .ptr = &sDefault.valid,
3885 .special = NULL,
3886 .enum_list = NULL,
3887 .flags = FLAG_HIDE,
3890 .label = "copy",
3891 .type = P_STRING,
3892 .p_class = P_LOCAL,
3893 .ptr = &sDefault.szCopy,
3894 .special = handle_copy,
3895 .enum_list = NULL,
3896 .flags = FLAG_HIDE,
3899 .label = "include",
3900 .type = P_STRING,
3901 .p_class = P_LOCAL,
3902 .ptr = &sDefault.szInclude,
3903 .special = handle_include,
3904 .enum_list = NULL,
3905 .flags = FLAG_HIDE,
3908 .label = "preexec",
3909 .type = P_STRING,
3910 .p_class = P_LOCAL,
3911 .ptr = &sDefault.szPreExec,
3912 .special = NULL,
3913 .enum_list = NULL,
3914 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
3917 .label = "exec",
3918 .type = P_STRING,
3919 .p_class = P_LOCAL,
3920 .ptr = &sDefault.szPreExec,
3921 .special = NULL,
3922 .enum_list = NULL,
3923 .flags = FLAG_ADVANCED,
3926 .label = "preexec close",
3927 .type = P_BOOL,
3928 .p_class = P_LOCAL,
3929 .ptr = &sDefault.bPreexecClose,
3930 .special = NULL,
3931 .enum_list = NULL,
3932 .flags = FLAG_ADVANCED | FLAG_SHARE,
3935 .label = "postexec",
3936 .type = P_STRING,
3937 .p_class = P_LOCAL,
3938 .ptr = &sDefault.szPostExec,
3939 .special = NULL,
3940 .enum_list = NULL,
3941 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
3944 .label = "root preexec",
3945 .type = P_STRING,
3946 .p_class = P_LOCAL,
3947 .ptr = &sDefault.szRootPreExec,
3948 .special = NULL,
3949 .enum_list = NULL,
3950 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
3953 .label = "root preexec close",
3954 .type = P_BOOL,
3955 .p_class = P_LOCAL,
3956 .ptr = &sDefault.bRootpreexecClose,
3957 .special = NULL,
3958 .enum_list = NULL,
3959 .flags = FLAG_ADVANCED | FLAG_SHARE,
3962 .label = "root postexec",
3963 .type = P_STRING,
3964 .p_class = P_LOCAL,
3965 .ptr = &sDefault.szRootPostExec,
3966 .special = NULL,
3967 .enum_list = NULL,
3968 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
3971 .label = "available",
3972 .type = P_BOOL,
3973 .p_class = P_LOCAL,
3974 .ptr = &sDefault.bAvailable,
3975 .special = NULL,
3976 .enum_list = NULL,
3977 .flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
3980 .label = "registry shares",
3981 .type = P_BOOL,
3982 .p_class = P_GLOBAL,
3983 .ptr = &Globals.bRegistryShares,
3984 .special = NULL,
3985 .enum_list = NULL,
3986 .flags = FLAG_ADVANCED,
3989 .label = "usershare allow guests",
3990 .type = P_BOOL,
3991 .p_class = P_GLOBAL,
3992 .ptr = &Globals.bUsershareAllowGuests,
3993 .special = NULL,
3994 .enum_list = NULL,
3995 .flags = FLAG_ADVANCED,
3998 .label = "usershare max shares",
3999 .type = P_INTEGER,
4000 .p_class = P_GLOBAL,
4001 .ptr = &Globals.iUsershareMaxShares,
4002 .special = NULL,
4003 .enum_list = NULL,
4004 .flags = FLAG_ADVANCED,
4007 .label = "usershare owner only",
4008 .type = P_BOOL,
4009 .p_class = P_GLOBAL,
4010 .ptr = &Globals.bUsershareOwnerOnly,
4011 .special = NULL,
4012 .enum_list = NULL,
4013 .flags = FLAG_ADVANCED,
4016 .label = "usershare path",
4017 .type = P_STRING,
4018 .p_class = P_GLOBAL,
4019 .ptr = &Globals.szUsersharePath,
4020 .special = NULL,
4021 .enum_list = NULL,
4022 .flags = FLAG_ADVANCED,
4025 .label = "usershare prefix allow list",
4026 .type = P_LIST,
4027 .p_class = P_GLOBAL,
4028 .ptr = &Globals.szUsersharePrefixAllowList,
4029 .special = NULL,
4030 .enum_list = NULL,
4031 .flags = FLAG_ADVANCED,
4034 .label = "usershare prefix deny list",
4035 .type = P_LIST,
4036 .p_class = P_GLOBAL,
4037 .ptr = &Globals.szUsersharePrefixDenyList,
4038 .special = NULL,
4039 .enum_list = NULL,
4040 .flags = FLAG_ADVANCED,
4043 .label = "usershare template share",
4044 .type = P_STRING,
4045 .p_class = P_GLOBAL,
4046 .ptr = &Globals.szUsershareTemplateShare,
4047 .special = NULL,
4048 .enum_list = NULL,
4049 .flags = FLAG_ADVANCED,
4052 .label = "volume",
4053 .type = P_STRING,
4054 .p_class = P_LOCAL,
4055 .ptr = &sDefault.volume,
4056 .special = NULL,
4057 .enum_list = NULL,
4058 .flags = FLAG_ADVANCED | FLAG_SHARE,
4061 .label = "fstype",
4062 .type = P_STRING,
4063 .p_class = P_LOCAL,
4064 .ptr = &sDefault.fstype,
4065 .special = NULL,
4066 .enum_list = NULL,
4067 .flags = FLAG_ADVANCED | FLAG_SHARE,
4070 .label = "set directory",
4071 .type = P_BOOLREV,
4072 .p_class = P_LOCAL,
4073 .ptr = &sDefault.bNo_set_dir,
4074 .special = NULL,
4075 .enum_list = NULL,
4076 .flags = FLAG_ADVANCED | FLAG_SHARE,
4079 .label = "wide links",
4080 .type = P_BOOL,
4081 .p_class = P_LOCAL,
4082 .ptr = &sDefault.bWidelinks,
4083 .special = NULL,
4084 .enum_list = NULL,
4085 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4088 .label = "follow symlinks",
4089 .type = P_BOOL,
4090 .p_class = P_LOCAL,
4091 .ptr = &sDefault.bSymlinks,
4092 .special = NULL,
4093 .enum_list = NULL,
4094 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4097 .label = "dont descend",
4098 .type = P_STRING,
4099 .p_class = P_LOCAL,
4100 .ptr = &sDefault.szDontdescend,
4101 .special = NULL,
4102 .enum_list = NULL,
4103 .flags = FLAG_ADVANCED | FLAG_SHARE,
4106 .label = "magic script",
4107 .type = P_STRING,
4108 .p_class = P_LOCAL,
4109 .ptr = &sDefault.szMagicScript,
4110 .special = NULL,
4111 .enum_list = NULL,
4112 .flags = FLAG_ADVANCED | FLAG_SHARE,
4115 .label = "magic output",
4116 .type = P_STRING,
4117 .p_class = P_LOCAL,
4118 .ptr = &sDefault.szMagicOutput,
4119 .special = NULL,
4120 .enum_list = NULL,
4121 .flags = FLAG_ADVANCED | FLAG_SHARE,
4124 .label = "delete readonly",
4125 .type = P_BOOL,
4126 .p_class = P_LOCAL,
4127 .ptr = &sDefault.bDeleteReadonly,
4128 .special = NULL,
4129 .enum_list = NULL,
4130 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4133 .label = "dos filemode",
4134 .type = P_BOOL,
4135 .p_class = P_LOCAL,
4136 .ptr = &sDefault.bDosFilemode,
4137 .special = NULL,
4138 .enum_list = NULL,
4139 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4142 .label = "dos filetimes",
4143 .type = P_BOOL,
4144 .p_class = P_LOCAL,
4145 .ptr = &sDefault.bDosFiletimes,
4146 .special = NULL,
4147 .enum_list = NULL,
4148 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4151 .label = "dos filetime resolution",
4152 .type = P_BOOL,
4153 .p_class = P_LOCAL,
4154 .ptr = &sDefault.bDosFiletimeResolution,
4155 .special = NULL,
4156 .enum_list = NULL,
4157 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4160 .label = "fake directory create times",
4161 .type = P_BOOL,
4162 .p_class = P_LOCAL,
4163 .ptr = &sDefault.bFakeDirCreateTimes,
4164 .special = NULL,
4165 .enum_list = NULL,
4166 .flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4169 .label = "panic action",
4170 .type = P_STRING,
4171 .p_class = P_GLOBAL,
4172 .ptr = &Globals.szPanicAction,
4173 .special = NULL,
4174 .enum_list = NULL,
4175 .flags = FLAG_ADVANCED,
4178 {N_("VFS module options"), P_SEP, P_SEPARATOR},
4181 .label = "vfs objects",
4182 .type = P_LIST,
4183 .p_class = P_LOCAL,
4184 .ptr = &sDefault.szVfsObjects,
4185 .special = NULL,
4186 .enum_list = NULL,
4187 .flags = FLAG_ADVANCED | FLAG_SHARE,
4190 .label = "vfs object",
4191 .type = P_LIST,
4192 .p_class = P_LOCAL,
4193 .ptr = &sDefault.szVfsObjects,
4194 .special = NULL,
4195 .enum_list = NULL,
4196 .flags = FLAG_HIDE,
4200 {N_("MSDFS options"), P_SEP, P_SEPARATOR},
4203 .label = "msdfs root",
4204 .type = P_BOOL,
4205 .p_class = P_LOCAL,
4206 .ptr = &sDefault.bMSDfsRoot,
4207 .special = NULL,
4208 .enum_list = NULL,
4209 .flags = FLAG_ADVANCED | FLAG_SHARE,
4212 .label = "msdfs proxy",
4213 .type = P_STRING,
4214 .p_class = P_LOCAL,
4215 .ptr = &sDefault.szMSDfsProxy,
4216 .special = NULL,
4217 .enum_list = NULL,
4218 .flags = FLAG_ADVANCED | FLAG_SHARE,
4221 .label = "host msdfs",
4222 .type = P_BOOL,
4223 .p_class = P_GLOBAL,
4224 .ptr = &Globals.bHostMSDfs,
4225 .special = NULL,
4226 .enum_list = NULL,
4227 .flags = FLAG_ADVANCED,
4230 {N_("Winbind options"), P_SEP, P_SEPARATOR},
4233 .label = "passdb expand explicit",
4234 .type = P_BOOL,
4235 .p_class = P_GLOBAL,
4236 .ptr = &Globals.bPassdbExpandExplicit,
4237 .special = NULL,
4238 .enum_list = NULL,
4239 .flags = FLAG_ADVANCED,
4242 .label = "idmap domains",
4243 .type = P_LIST,
4244 .p_class = P_GLOBAL,
4245 .ptr = &Globals.szIdmapDomains,
4246 .special = NULL,
4247 .enum_list = NULL,
4248 .flags = FLAG_ADVANCED,
4251 .label = "idmap backend",
4252 .type = P_LIST,
4253 .p_class = P_GLOBAL,
4254 .ptr = &Globals.szIdmapBackend,
4255 .special = NULL,
4256 .enum_list = NULL,
4257 .flags = FLAG_ADVANCED,
4260 .label = "idmap alloc backend",
4261 .type = P_STRING,
4262 .p_class = P_GLOBAL,
4263 .ptr = &Globals.szIdmapAllocBackend,
4264 .special = NULL,
4265 .enum_list = NULL,
4266 .flags = FLAG_ADVANCED,
4269 .label = "idmap cache time",
4270 .type = P_INTEGER,
4271 .p_class = P_GLOBAL,
4272 .ptr = &Globals.iIdmapCacheTime,
4273 .special = NULL,
4274 .enum_list = NULL,
4275 .flags = FLAG_ADVANCED,
4278 .label = "idmap negative cache time",
4279 .type = P_INTEGER,
4280 .p_class = P_GLOBAL,
4281 .ptr = &Globals.iIdmapNegativeCacheTime,
4282 .special = NULL,
4283 .enum_list = NULL,
4284 .flags = FLAG_ADVANCED,
4287 .label = "idmap uid",
4288 .type = P_STRING,
4289 .p_class = P_GLOBAL,
4290 .ptr = &Globals.szIdmapUID,
4291 .special = handle_idmap_uid,
4292 .enum_list = NULL,
4293 .flags = FLAG_ADVANCED,
4296 .label = "winbind uid",
4297 .type = P_STRING,
4298 .p_class = P_GLOBAL,
4299 .ptr = &Globals.szIdmapUID,
4300 .special = handle_idmap_uid,
4301 .enum_list = NULL,
4302 .flags = FLAG_HIDE,
4305 .label = "idmap gid",
4306 .type = P_STRING,
4307 .p_class = P_GLOBAL,
4308 .ptr = &Globals.szIdmapGID,
4309 .special = handle_idmap_gid,
4310 .enum_list = NULL,
4311 .flags = FLAG_ADVANCED,
4314 .label = "winbind gid",
4315 .type = P_STRING,
4316 .p_class = P_GLOBAL,
4317 .ptr = &Globals.szIdmapGID,
4318 .special = handle_idmap_gid,
4319 .enum_list = NULL,
4320 .flags = FLAG_HIDE,
4323 .label = "template homedir",
4324 .type = P_STRING,
4325 .p_class = P_GLOBAL,
4326 .ptr = &Globals.szTemplateHomedir,
4327 .special = NULL,
4328 .enum_list = NULL,
4329 .flags = FLAG_ADVANCED,
4332 .label = "template shell",
4333 .type = P_STRING,
4334 .p_class = P_GLOBAL,
4335 .ptr = &Globals.szTemplateShell,
4336 .special = NULL,
4337 .enum_list = NULL,
4338 .flags = FLAG_ADVANCED,
4341 .label = "winbind separator",
4342 .type = P_STRING,
4343 .p_class = P_GLOBAL,
4344 .ptr = &Globals.szWinbindSeparator,
4345 .special = NULL,
4346 .enum_list = NULL,
4347 .flags = FLAG_ADVANCED,
4350 .label = "winbind cache time",
4351 .type = P_INTEGER,
4352 .p_class = P_GLOBAL,
4353 .ptr = &Globals.winbind_cache_time,
4354 .special = NULL,
4355 .enum_list = NULL,
4356 .flags = FLAG_ADVANCED,
4359 .label = "winbind enum users",
4360 .type = P_BOOL,
4361 .p_class = P_GLOBAL,
4362 .ptr = &Globals.bWinbindEnumUsers,
4363 .special = NULL,
4364 .enum_list = NULL,
4365 .flags = FLAG_ADVANCED,
4368 .label = "winbind enum groups",
4369 .type = P_BOOL,
4370 .p_class = P_GLOBAL,
4371 .ptr = &Globals.bWinbindEnumGroups,
4372 .special = NULL,
4373 .enum_list = NULL,
4374 .flags = FLAG_ADVANCED,
4377 .label = "winbind use default domain",
4378 .type = P_BOOL,
4379 .p_class = P_GLOBAL,
4380 .ptr = &Globals.bWinbindUseDefaultDomain,
4381 .special = NULL,
4382 .enum_list = NULL,
4383 .flags = FLAG_ADVANCED,
4386 .label = "winbind trusted domains only",
4387 .type = P_BOOL,
4388 .p_class = P_GLOBAL,
4389 .ptr = &Globals.bWinbindTrustedDomainsOnly,
4390 .special = NULL,
4391 .enum_list = NULL,
4392 .flags = FLAG_ADVANCED,
4395 .label = "winbind nested groups",
4396 .type = P_BOOL,
4397 .p_class = P_GLOBAL,
4398 .ptr = &Globals.bWinbindNestedGroups,
4399 .special = NULL,
4400 .enum_list = NULL,
4401 .flags = FLAG_ADVANCED,
4404 .label = "winbind expand groups",
4405 .type = P_INTEGER,
4406 .p_class = P_GLOBAL,
4407 .ptr = &Globals.winbind_expand_groups,
4408 .special = NULL,
4409 .enum_list = NULL,
4410 .flags = FLAG_ADVANCED,
4413 .label = "winbind nss info",
4414 .type = P_LIST,
4415 .p_class = P_GLOBAL,
4416 .ptr = &Globals.szWinbindNssInfo,
4417 .special = NULL,
4418 .enum_list = NULL,
4419 .flags = FLAG_ADVANCED,
4422 .label = "winbind refresh tickets",
4423 .type = P_BOOL,
4424 .p_class = P_GLOBAL,
4425 .ptr = &Globals.bWinbindRefreshTickets,
4426 .special = NULL,
4427 .enum_list = NULL,
4428 .flags = FLAG_ADVANCED,
4431 .label = "winbind offline logon",
4432 .type = P_BOOL,
4433 .p_class = P_GLOBAL,
4434 .ptr = &Globals.bWinbindOfflineLogon,
4435 .special = NULL,
4436 .enum_list = NULL,
4437 .flags = FLAG_ADVANCED,
4440 .label = "winbind normalize names",
4441 .type = P_BOOL,
4442 .p_class = P_GLOBAL,
4443 .ptr = &Globals.bWinbindNormalizeNames,
4444 .special = NULL,
4445 .enum_list = NULL,
4446 .flags = FLAG_ADVANCED,
4449 .label = "winbind rpc only",
4450 .type = P_BOOL,
4451 .p_class = P_GLOBAL,
4452 .ptr = &Globals.bWinbindRpcOnly,
4453 .special = NULL,
4454 .enum_list = NULL,
4455 .flags = FLAG_ADVANCED,
4458 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
4461 /***************************************************************************
4462 Initialise the sDefault parameter structure for the printer values.
4463 ***************************************************************************/
4465 static void init_printer_values(struct service *pService)
4467 /* choose defaults depending on the type of printing */
4468 switch (pService->iPrinting) {
4469 case PRINT_BSD:
4470 case PRINT_AIX:
4471 case PRINT_LPRNT:
4472 case PRINT_LPROS2:
4473 string_set(&pService->szLpqcommand, "lpq -P'%p'");
4474 string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
4475 string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
4476 break;
4478 case PRINT_LPRNG:
4479 case PRINT_PLP:
4480 string_set(&pService->szLpqcommand, "lpq -P'%p'");
4481 string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
4482 string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
4483 string_set(&pService->szQueuepausecommand, "lpc stop '%p'");
4484 string_set(&pService->szQueueresumecommand, "lpc start '%p'");
4485 string_set(&pService->szLppausecommand, "lpc hold '%p' %j");
4486 string_set(&pService->szLpresumecommand, "lpc release '%p' %j");
4487 break;
4489 case PRINT_CUPS:
4490 case PRINT_IPRINT:
4491 #ifdef HAVE_CUPS
4492 /* set the lpq command to contain the destination printer
4493 name only. This is used by cups_queue_get() */
4494 string_set(&pService->szLpqcommand, "%p");
4495 string_set(&pService->szLprmcommand, "");
4496 string_set(&pService->szPrintcommand, "");
4497 string_set(&pService->szLppausecommand, "");
4498 string_set(&pService->szLpresumecommand, "");
4499 string_set(&pService->szQueuepausecommand, "");
4500 string_set(&pService->szQueueresumecommand, "");
4501 #else
4502 string_set(&pService->szLpqcommand, "lpq -P'%p'");
4503 string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
4504 string_set(&pService->szPrintcommand, "lpr -P'%p' %s; rm %s");
4505 string_set(&pService->szLppausecommand, "lp -i '%p-%j' -H hold");
4506 string_set(&pService->szLpresumecommand, "lp -i '%p-%j' -H resume");
4507 string_set(&pService->szQueuepausecommand, "disable '%p'");
4508 string_set(&pService->szQueueresumecommand, "enable '%p'");
4509 #endif /* HAVE_CUPS */
4510 break;
4512 case PRINT_SYSV:
4513 case PRINT_HPUX:
4514 string_set(&pService->szLpqcommand, "lpstat -o%p");
4515 string_set(&pService->szLprmcommand, "cancel %p-%j");
4516 string_set(&pService->szPrintcommand, "lp -c -d%p %s; rm %s");
4517 string_set(&pService->szQueuepausecommand, "disable %p");
4518 string_set(&pService->szQueueresumecommand, "enable %p");
4519 #ifndef HPUX
4520 string_set(&pService->szLppausecommand, "lp -i %p-%j -H hold");
4521 string_set(&pService->szLpresumecommand, "lp -i %p-%j -H resume");
4522 #endif /* HPUX */
4523 break;
4525 case PRINT_QNX:
4526 string_set(&pService->szLpqcommand, "lpq -P%p");
4527 string_set(&pService->szLprmcommand, "lprm -P%p %j");
4528 string_set(&pService->szPrintcommand, "lp -r -P%p %s");
4529 break;
4531 #ifdef DEVELOPER
4532 case PRINT_TEST:
4533 case PRINT_VLP:
4534 string_set(&pService->szPrintcommand, "vlp print %p %s");
4535 string_set(&pService->szLpqcommand, "vlp lpq %p");
4536 string_set(&pService->szLprmcommand, "vlp lprm %p %j");
4537 string_set(&pService->szLppausecommand, "vlp lppause %p %j");
4538 string_set(&pService->szLpresumecommand, "vlp lpresum %p %j");
4539 string_set(&pService->szQueuepausecommand, "vlp queuepause %p");
4540 string_set(&pService->szQueueresumecommand, "vlp queueresume %p");
4541 break;
4542 #endif /* DEVELOPER */
4547 /***************************************************************************
4548 Initialise the global parameter structure.
4549 ***************************************************************************/
4551 static void init_globals(bool first_time_only)
4553 static bool done_init = False;
4554 char *s = NULL;
4555 int i;
4557 /* If requested to initialize only once and we've already done it... */
4558 if (first_time_only && done_init) {
4559 /* ... then we have nothing more to do */
4560 return;
4563 if (!done_init) {
4564 /* The logfile can be set before this is invoked. Free it if so. */
4565 if (Globals.szLogFile != NULL) {
4566 string_free(&Globals.szLogFile);
4567 Globals.szLogFile = NULL;
4569 done_init = True;
4570 } else {
4571 for (i = 0; parm_table[i].label; i++) {
4572 if ((parm_table[i].type == P_STRING ||
4573 parm_table[i].type == P_USTRING) &&
4574 parm_table[i].ptr)
4576 string_free((char **)parm_table[i].ptr);
4581 memset((void *)&Globals, '\0', sizeof(Globals));
4583 for (i = 0; parm_table[i].label; i++) {
4584 if ((parm_table[i].type == P_STRING ||
4585 parm_table[i].type == P_USTRING) &&
4586 parm_table[i].ptr)
4588 string_set((char **)parm_table[i].ptr, "");
4592 string_set(&sDefault.fstype, FSTYPE_STRING);
4593 string_set(&sDefault.szPrintjobUsername, "%U");
4595 init_printer_values(&sDefault);
4598 DEBUG(3, ("Initialising global parameters\n"));
4600 string_set(&Globals.szSMBPasswdFile, get_dyn_SMB_PASSWD_FILE());
4601 string_set(&Globals.szPrivateDir, get_dyn_PRIVATE_DIR());
4603 /* use the new 'hash2' method by default, with a prefix of 1 */
4604 string_set(&Globals.szManglingMethod, "hash2");
4605 Globals.mangle_prefix = 1;
4607 string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
4609 /* using UTF8 by default allows us to support all chars */
4610 string_set(&Globals.unix_charset, DEFAULT_UNIX_CHARSET);
4612 #if defined(HAVE_NL_LANGINFO) && defined(CODESET)
4613 /* If the system supports nl_langinfo(), try to grab the value
4614 from the user's locale */
4615 string_set(&Globals.display_charset, "LOCALE");
4616 #else
4617 string_set(&Globals.display_charset, DEFAULT_DISPLAY_CHARSET);
4618 #endif
4620 /* Use codepage 850 as a default for the dos character set */
4621 string_set(&Globals.dos_charset, DEFAULT_DOS_CHARSET);
4624 * Allow the default PASSWD_CHAT to be overridden in local.h.
4626 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
4628 set_global_myname(myhostname());
4629 string_set(&Globals.szNetbiosName,global_myname());
4631 set_global_myworkgroup(WORKGROUP);
4632 string_set(&Globals.szWorkgroup, lp_workgroup());
4634 string_set(&Globals.szPasswdProgram, "");
4635 string_set(&Globals.szPidDir, get_dyn_PIDDIR());
4636 string_set(&Globals.szLockDir, get_dyn_LOCKDIR());
4637 string_set(&Globals.szSocketAddress, "0.0.0.0");
4639 if (asprintf(&s, "Samba %s", SAMBA_VERSION_STRING) < 0) {
4640 smb_panic("init_globals: ENOMEM");
4642 string_set(&Globals.szServerString, s);
4643 SAFE_FREE(s);
4644 if (asprintf(&s, "%d.%d", DEFAULT_MAJOR_VERSION,
4645 DEFAULT_MINOR_VERSION) < 0) {
4646 smb_panic("init_globals: ENOMEM");
4648 string_set(&Globals.szAnnounceVersion, s);
4649 SAFE_FREE(s);
4650 #ifdef DEVELOPER
4651 string_set(&Globals.szPanicAction, "/bin/sleep 999999999");
4652 #endif
4654 string_set(&Globals.szSocketOptions, DEFAULT_SOCKET_OPTIONS);
4656 string_set(&Globals.szLogonDrive, "");
4657 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
4658 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
4659 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
4661 string_set(&Globals.szNameResolveOrder, "lmhosts wins host bcast");
4662 string_set(&Globals.szPasswordServer, "*");
4664 Globals.AlgorithmicRidBase = BASE_RID;
4666 Globals.bLoadPrinters = True;
4667 Globals.PrintcapCacheTime = 750; /* 12.5 minutes */
4669 Globals.ConfigBackend = config_backend;
4671 /* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
4672 /* Discovered by 2 days of pain by Don McCall @ HP :-). */
4673 Globals.max_xmit = 0x4104;
4674 Globals.max_mux = 50; /* This is *needed* for profile support. */
4675 Globals.lpqcachetime = 30; /* changed to handle large print servers better -- jerry */
4676 Globals.bDisableSpoolss = False;
4677 Globals.iMaxSmbdProcesses = 0;/* no limit specified */
4678 Globals.pwordlevel = 0;
4679 Globals.unamelevel = 0;
4680 Globals.deadtime = 0;
4681 Globals.getwd_cache = true;
4682 Globals.bLargeReadwrite = True;
4683 Globals.max_log_size = 5000;
4684 Globals.max_open_files = MAX_OPEN_FILES;
4685 Globals.open_files_db_hash_size = SMB_OPEN_DATABASE_TDB_HASH_SIZE;
4686 Globals.maxprotocol = PROTOCOL_NT1;
4687 Globals.minprotocol = PROTOCOL_CORE;
4688 Globals.security = SEC_USER;
4689 Globals.paranoid_server_security = True;
4690 Globals.bEncryptPasswords = True;
4691 Globals.bUpdateEncrypt = False;
4692 Globals.clientSchannel = Auto;
4693 Globals.serverSchannel = Auto;
4694 Globals.bReadRaw = True;
4695 Globals.bWriteRaw = True;
4696 Globals.bNullPasswords = False;
4697 Globals.bObeyPamRestrictions = False;
4698 Globals.syslog = 1;
4699 Globals.bSyslogOnly = False;
4700 Globals.bTimestampLogs = True;
4701 string_set(&Globals.szLogLevel, "0");
4702 Globals.bDebugPrefixTimestamp = False;
4703 Globals.bDebugHiresTimestamp = False;
4704 Globals.bDebugPid = False;
4705 Globals.bDebugUid = False;
4706 Globals.bDebugClass = False;
4707 Globals.bEnableCoreFiles = True;
4708 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
4709 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
4710 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
4711 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
4712 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
4713 Globals.lm_interval = 60;
4714 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
4715 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
4716 Globals.bNISHomeMap = False;
4717 #ifdef WITH_NISPLUS_HOME
4718 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
4719 #else
4720 string_set(&Globals.szNISHomeMapName, "auto.home");
4721 #endif
4722 #endif
4723 Globals.bTimeServer = False;
4724 Globals.bBindInterfacesOnly = False;
4725 Globals.bUnixPasswdSync = False;
4726 Globals.bPamPasswordChange = False;
4727 Globals.bPasswdChatDebug = False;
4728 Globals.iPasswdChatTimeout = 2; /* 2 second default. */
4729 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
4730 Globals.bNTStatusSupport = True; /* Use NT status by default. */
4731 Globals.bStatCache = True; /* use stat cache by default */
4732 Globals.iMaxStatCacheSize = 256; /* 256k by default */
4733 Globals.restrict_anonymous = 0;
4734 Globals.bClientLanManAuth = False; /* Do NOT use the LanMan hash if it is available */
4735 Globals.bClientPlaintextAuth = False; /* Do NOT use a plaintext password even if is requested by the server */
4736 Globals.bLanmanAuth = False; /* Do NOT use the LanMan hash, even if it is supplied */
4737 Globals.bNTLMAuth = True; /* Do use NTLMv1 if it is supplied by the client (otherwise NTLMv2) */
4738 Globals.bClientNTLMv2Auth = False; /* Client should not use NTLMv2, as we can't tell that the server supports it. */
4739 /* Note, that we will use NTLM2 session security (which is different), if it is available */
4741 Globals.map_to_guest = 0; /* By Default, "Never" */
4742 Globals.oplock_break_wait_time = 0; /* By Default, 0 msecs. */
4743 Globals.enhanced_browsing = true;
4744 Globals.iLockSpinTime = WINDOWS_MINIMUM_LOCK_TIMEOUT_MS; /* msec. */
4745 #ifdef MMAP_BLACKLIST
4746 Globals.bUseMmap = False;
4747 #else
4748 Globals.bUseMmap = True;
4749 #endif
4750 Globals.bUnixExtensions = True;
4751 Globals.bResetOnZeroVC = False;
4753 /* hostname lookups can be very expensive and are broken on
4754 a large number of sites (tridge) */
4755 Globals.bHostnameLookups = False;
4757 string_set(&Globals.szPassdbBackend, "smbpasswd");
4758 string_set(&Globals.szLdapSuffix, "");
4759 string_set(&Globals.szLdapMachineSuffix, "");
4760 string_set(&Globals.szLdapUserSuffix, "");
4761 string_set(&Globals.szLdapGroupSuffix, "");
4762 string_set(&Globals.szLdapIdmapSuffix, "");
4764 string_set(&Globals.szLdapAdminDn, "");
4765 Globals.ldap_ssl = LDAP_SSL_ON;
4766 Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
4767 Globals.ldap_delete_dn = False;
4768 Globals.ldap_replication_sleep = 1000; /* wait 1 sec for replication */
4769 Globals.ldap_timeout = LDAP_DEFAULT_TIMEOUT;
4770 Globals.ldap_connection_timeout = LDAP_CONNECTION_DEFAULT_TIMEOUT;
4771 Globals.ldap_page_size = LDAP_PAGE_SIZE;
4773 Globals.ldap_debug_level = 0;
4774 Globals.ldap_debug_threshold = 10;
4776 /* This is what we tell the afs client. in reality we set the token
4777 * to never expire, though, when this runs out the afs client will
4778 * forget the token. Set to 0 to get NEVERDATE.*/
4779 Globals.iAfsTokenLifetime = 604800;
4781 /* these parameters are set to defaults that are more appropriate
4782 for the increasing samba install base:
4784 as a member of the workgroup, that will possibly become a
4785 _local_ master browser (lm = True). this is opposed to a forced
4786 local master browser startup (pm = True).
4788 doesn't provide WINS server service by default (wsupp = False),
4789 and doesn't provide domain master browser services by default, either.
4793 Globals.bMsAddPrinterWizard = True;
4794 Globals.os_level = 20;
4795 Globals.bLocalMaster = True;
4796 Globals.iDomainMaster = Auto; /* depending on bDomainLogons */
4797 Globals.bDomainLogons = False;
4798 Globals.bBrowseList = True;
4799 Globals.bWINSsupport = False;
4800 Globals.bWINSproxy = False;
4802 Globals.bDNSproxy = True;
4804 /* this just means to use them if they exist */
4805 Globals.bKernelOplocks = True;
4807 Globals.bAllowTrustedDomains = True;
4809 string_set(&Globals.szTemplateShell, "/bin/false");
4810 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
4811 string_set(&Globals.szWinbindSeparator, "\\");
4813 string_set(&Globals.szCupsServer, "");
4814 string_set(&Globals.szIPrintServer, "");
4816 string_set(&Globals.ctdbdSocket, "");
4817 Globals.szClusterAddresses = NULL;
4818 Globals.clustering = False;
4820 Globals.winbind_cache_time = 300; /* 5 minutes */
4821 Globals.bWinbindEnumUsers = False;
4822 Globals.bWinbindEnumGroups = False;
4823 Globals.bWinbindUseDefaultDomain = False;
4824 Globals.bWinbindTrustedDomainsOnly = False;
4825 Globals.bWinbindNestedGroups = True;
4826 Globals.winbind_expand_groups = 1;
4827 Globals.szWinbindNssInfo = str_list_make(NULL, "template", NULL);
4828 Globals.bWinbindRefreshTickets = False;
4829 Globals.bWinbindOfflineLogon = False;
4831 Globals.iIdmapCacheTime = 900; /* 15 minutes by default */
4832 Globals.iIdmapNegativeCacheTime = 120; /* 2 minutes by default */
4834 Globals.bPassdbExpandExplicit = False;
4836 Globals.name_cache_timeout = 660; /* In seconds */
4838 Globals.bUseSpnego = True;
4839 Globals.bClientUseSpnego = True;
4841 Globals.client_signing = Auto;
4842 Globals.server_signing = False;
4844 Globals.bDeferSharingViolations = True;
4845 string_set(&Globals.smb_ports, SMB_PORTS);
4847 Globals.bEnablePrivileges = True;
4848 Globals.bHostMSDfs = True;
4849 Globals.bASUSupport = False;
4851 /* User defined shares. */
4852 if (asprintf(&s, "%s/usershares", get_dyn_STATEDIR()) < 0) {
4853 smb_panic("init_globals: ENOMEM");
4855 string_set(&Globals.szUsersharePath, s);
4856 SAFE_FREE(s);
4857 string_set(&Globals.szUsershareTemplateShare, "");
4858 Globals.iUsershareMaxShares = 0;
4859 /* By default disallow sharing of directories not owned by the sharer. */
4860 Globals.bUsershareOwnerOnly = True;
4861 /* By default disallow guest access to usershares. */
4862 Globals.bUsershareAllowGuests = False;
4864 Globals.iKeepalive = DEFAULT_KEEPALIVE;
4866 /* By default no shares out of the registry */
4867 Globals.bRegistryShares = False;
4869 Globals.iminreceivefile = 0;
4872 /*******************************************************************
4873 Convenience routine to grab string parameters into temporary memory
4874 and run standard_sub_basic on them. The buffers can be written to by
4875 callers without affecting the source string.
4876 ********************************************************************/
4878 static char *lp_string(const char *s)
4880 char *ret;
4881 TALLOC_CTX *ctx = talloc_tos();
4883 /* The follow debug is useful for tracking down memory problems
4884 especially if you have an inner loop that is calling a lp_*()
4885 function that returns a string. Perhaps this debug should be
4886 present all the time? */
4888 #if 0
4889 DEBUG(10, ("lp_string(%s)\n", s));
4890 #endif
4892 ret = talloc_sub_basic(ctx,
4893 get_current_username(),
4894 current_user_info.domain,
4896 if (trim_char(ret, '\"', '\"')) {
4897 if (strchr(ret,'\"') != NULL) {
4898 TALLOC_FREE(ret);
4899 ret = talloc_sub_basic(ctx,
4900 get_current_username(),
4901 current_user_info.domain,
4905 return ret;
4909 In this section all the functions that are used to access the
4910 parameters from the rest of the program are defined
4913 #define FN_GLOBAL_STRING(fn_name,ptr) \
4914 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
4915 #define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
4916 const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
4917 #define FN_GLOBAL_LIST(fn_name,ptr) \
4918 const char **fn_name(void) {return(*(const char ***)(ptr));}
4919 #define FN_GLOBAL_BOOL(fn_name,ptr) \
4920 bool fn_name(void) {return(*(bool *)(ptr));}
4921 #define FN_GLOBAL_CHAR(fn_name,ptr) \
4922 char fn_name(void) {return(*(char *)(ptr));}
4923 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
4924 int fn_name(void) {return(*(int *)(ptr));}
4926 #define FN_LOCAL_STRING(fn_name,val) \
4927 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
4928 #define FN_LOCAL_CONST_STRING(fn_name,val) \
4929 const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
4930 #define FN_LOCAL_LIST(fn_name,val) \
4931 const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
4932 #define FN_LOCAL_BOOL(fn_name,val) \
4933 bool fn_name(int i) {return(bool)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
4934 #define FN_LOCAL_INTEGER(fn_name,val) \
4935 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
4937 #define FN_LOCAL_PARM_BOOL(fn_name,val) \
4938 bool fn_name(const struct share_params *p) {return(bool)(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
4939 #define FN_LOCAL_PARM_INTEGER(fn_name,val) \
4940 int fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
4941 #define FN_LOCAL_PARM_STRING(fn_name,val) \
4942 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));}
4943 #define FN_LOCAL_CHAR(fn_name,val) \
4944 char fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
4946 FN_GLOBAL_STRING(lp_smb_ports, &Globals.smb_ports)
4947 FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
4948 FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
4949 FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
4950 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
4951 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
4952 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
4953 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
4954 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
4955 FN_GLOBAL_INTEGER(lp_printcap_cache_time, &Globals.PrintcapCacheTime)
4956 FN_GLOBAL_STRING(lp_addport_cmd, &Globals.szAddPortCommand)
4957 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
4958 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
4959 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
4960 FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
4961 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
4962 FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
4963 FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
4964 FN_GLOBAL_INTEGER(lp_mangle_prefix, &Globals.mangle_prefix)
4965 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
4966 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
4967 FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
4968 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
4969 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
4970 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
4971 FN_GLOBAL_STRING(lp_get_quota_command, &Globals.szGetQuota)
4972 FN_GLOBAL_STRING(lp_set_quota_command, &Globals.szSetQuota)
4973 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
4974 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
4975 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
4976 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
4977 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
4978 FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
4979 FN_GLOBAL_CONST_STRING(lp_afs_username_map, &Globals.szAfsUsernameMap)
4980 FN_GLOBAL_INTEGER(lp_afs_token_lifetime, &Globals.iAfsTokenLifetime)
4981 FN_GLOBAL_STRING(lp_log_nt_token_command, &Globals.szLogNtTokenCommand)
4982 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
4983 FN_GLOBAL_CONST_STRING(lp_logon_script, &Globals.szLogonScript)
4984 FN_GLOBAL_CONST_STRING(lp_logon_path, &Globals.szLogonPath)
4985 FN_GLOBAL_CONST_STRING(lp_logon_drive, &Globals.szLogonDrive)
4986 FN_GLOBAL_CONST_STRING(lp_logon_home, &Globals.szLogonHome)
4987 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
4988 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
4989 FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
4990 FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
4991 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
4992 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
4993 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
4994 FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
4995 /* FN_GLOBAL_STRING(lp_passdb_backend, &Globals.szPassdbBackend)
4996 * lp_passdb_backend() should be replace by the this macro again after
4997 * some releases.
4998 * */
4999 const char *lp_passdb_backend(void)
5001 char *delim, *quote;
5003 delim = strchr( Globals.szPassdbBackend, ' ');
5004 /* no space at all */
5005 if (delim == NULL) {
5006 goto out;
5009 quote = strchr(Globals.szPassdbBackend, '"');
5010 /* no quote char or non in the first part */
5011 if (quote == NULL || quote > delim) {
5012 *delim = '\0';
5013 goto warn;
5016 quote = strchr(quote+1, '"');
5017 if (quote == NULL) {
5018 DEBUG(0, ("WARNING: Your 'passdb backend' configuration is invalid due to a missing second \" char.\n"));
5019 goto out;
5020 } else if (*(quote+1) == '\0') {
5021 /* space, fitting quote char, and one backend only */
5022 goto out;
5023 } else {
5024 /* terminate string after the fitting quote char */
5025 *(quote+1) = '\0';
5028 warn:
5029 DEBUG(0, ("WARNING: Your 'passdb backend' configuration includes multiple backends. This\n"
5030 "is deprecated since Samba 3.0.23. Please check WHATSNEW.txt or the section 'Passdb\n"
5031 "Changes' from the ChangeNotes as part of the Samba HOWTO collection. Only the first\n"
5032 "backend (%s) is used. The rest is ignored.\n", Globals.szPassdbBackend));
5034 out:
5035 return Globals.szPassdbBackend;
5037 FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules)
5038 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
5039 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
5040 FN_GLOBAL_STRING(lp_renameuser_script, &Globals.szRenameUserScript)
5041 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
5043 FN_GLOBAL_CONST_STRING(lp_guestaccount, &Globals.szGuestaccount)
5044 FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
5045 FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
5046 FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
5047 FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserFromGroupScript)
5048 FN_GLOBAL_STRING(lp_setprimarygroup_script, &Globals.szSetPrimaryGroupScript)
5050 FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
5052 FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript)
5053 FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript)
5054 FN_GLOBAL_STRING(lp_username_map_script, &Globals.szUsernameMapScript)
5056 FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript)
5058 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
5059 FN_GLOBAL_CONST_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
5060 FN_GLOBAL_CONST_STRING(lp_template_shell, &Globals.szTemplateShell)
5061 FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
5062 FN_GLOBAL_INTEGER(lp_acl_compatibility, &Globals.iAclCompat)
5063 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
5064 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
5065 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
5066 FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only, &Globals.bWinbindTrustedDomainsOnly)
5067 FN_GLOBAL_BOOL(lp_winbind_nested_groups, &Globals.bWinbindNestedGroups)
5068 FN_GLOBAL_INTEGER(lp_winbind_expand_groups, &Globals.winbind_expand_groups)
5069 FN_GLOBAL_BOOL(lp_winbind_refresh_tickets, &Globals.bWinbindRefreshTickets)
5070 FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon)
5071 FN_GLOBAL_BOOL(lp_winbind_normalize_names, &Globals.bWinbindNormalizeNames)
5072 FN_GLOBAL_BOOL(lp_winbind_rpc_only, &Globals.bWinbindRpcOnly)
5074 FN_GLOBAL_LIST(lp_idmap_domains, &Globals.szIdmapDomains)
5075 FN_GLOBAL_LIST(lp_idmap_backend, &Globals.szIdmapBackend) /* deprecated */
5076 FN_GLOBAL_STRING(lp_idmap_alloc_backend, &Globals.szIdmapAllocBackend)
5077 FN_GLOBAL_INTEGER(lp_idmap_cache_time, &Globals.iIdmapCacheTime)
5078 FN_GLOBAL_INTEGER(lp_idmap_negative_cache_time, &Globals.iIdmapNegativeCacheTime)
5079 FN_GLOBAL_INTEGER(lp_keepalive, &Globals.iKeepalive)
5080 FN_GLOBAL_BOOL(lp_passdb_expand_explicit, &Globals.bPassdbExpandExplicit)
5082 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
5083 FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
5084 FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
5085 FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
5086 FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
5087 FN_GLOBAL_INTEGER(lp_ldap_replication_sleep, &Globals.ldap_replication_sleep)
5088 FN_GLOBAL_INTEGER(lp_ldap_timeout, &Globals.ldap_timeout)
5089 FN_GLOBAL_INTEGER(lp_ldap_connection_timeout, &Globals.ldap_connection_timeout)
5090 FN_GLOBAL_INTEGER(lp_ldap_page_size, &Globals.ldap_page_size)
5091 FN_GLOBAL_INTEGER(lp_ldap_debug_level, &Globals.ldap_debug_level)
5092 FN_GLOBAL_INTEGER(lp_ldap_debug_threshold, &Globals.ldap_debug_threshold)
5093 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
5094 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
5095 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
5096 FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
5097 FN_GLOBAL_LIST(lp_usershare_prefix_allow_list, &Globals.szUsersharePrefixAllowList)
5098 FN_GLOBAL_LIST(lp_usershare_prefix_deny_list, &Globals.szUsersharePrefixDenyList)
5100 FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
5102 FN_GLOBAL_BOOL(lp_registry_shares, &Globals.bRegistryShares)
5103 FN_GLOBAL_BOOL(lp_usershare_allow_guests, &Globals.bUsershareAllowGuests)
5104 FN_GLOBAL_BOOL(lp_usershare_owner_only, &Globals.bUsershareOwnerOnly)
5105 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
5106 FN_GLOBAL_BOOL(lp_reset_on_zero_vc, &Globals.bResetOnZeroVC)
5107 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
5108 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
5109 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
5110 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
5111 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
5112 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
5113 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
5114 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
5115 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
5116 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
5117 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
5118 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
5119 FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
5120 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
5121 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
5122 FN_GLOBAL_INTEGER(lp_client_schannel, &Globals.clientSchannel)
5123 FN_GLOBAL_INTEGER(lp_server_schannel, &Globals.serverSchannel)
5124 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
5125 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
5126 FN_GLOBAL_BOOL(lp_debug_prefix_timestamp, &Globals.bDebugPrefixTimestamp)
5127 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
5128 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
5129 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
5130 FN_GLOBAL_BOOL(lp_debug_class, &Globals.bDebugClass)
5131 FN_GLOBAL_BOOL(lp_enable_core_files, &Globals.bEnableCoreFiles)
5132 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
5133 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
5134 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
5135 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
5136 FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
5137 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
5138 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
5139 FN_GLOBAL_INTEGER(lp_passwd_chat_timeout, &Globals.iPasswdChatTimeout)
5140 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
5141 FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
5142 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
5143 FN_GLOBAL_INTEGER(lp_max_stat_cache_size, &Globals.iMaxStatCacheSize)
5144 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
5145 FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
5146 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
5147 FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
5148 FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
5149 FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
5150 FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
5151 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
5152 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
5153 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
5154 FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
5155 FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
5156 FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
5157 FN_GLOBAL_BOOL(lp_client_use_spnego, &Globals.bClientUseSpnego)
5158 FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
5159 FN_LOCAL_PARM_BOOL(lp_change_notify, bChangeNotify)
5160 FN_LOCAL_PARM_BOOL(lp_kernel_change_notify, bKernelChangeNotify)
5161 FN_GLOBAL_BOOL(lp_use_kerberos_keytab, &Globals.bUseKerberosKeytab)
5162 FN_GLOBAL_BOOL(lp_defer_sharing_violations, &Globals.bDeferSharingViolations)
5163 FN_GLOBAL_BOOL(lp_enable_privileges, &Globals.bEnablePrivileges)
5164 FN_GLOBAL_BOOL(lp_enable_asu_support, &Globals.bASUSupport)
5165 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
5166 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
5167 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
5168 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
5169 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
5170 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
5171 FN_GLOBAL_INTEGER(lp_open_files_db_hash_size, &Globals.open_files_db_hash_size)
5172 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
5173 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
5174 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
5175 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
5176 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
5177 FN_GLOBAL_BOOL(lp_getwd_cache, &Globals.getwd_cache)
5178 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
5179 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
5180 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
5181 FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
5182 FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
5183 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
5184 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
5185 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
5186 FN_GLOBAL_BOOL(_lp_disable_spoolss, &Globals.bDisableSpoolss)
5187 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
5188 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
5189 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
5190 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
5191 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
5192 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
5193 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
5194 FN_GLOBAL_INTEGER(lp_lock_spin_time, &Globals.iLockSpinTime)
5195 FN_GLOBAL_INTEGER(lp_usershare_max_shares, &Globals.iUsershareMaxShares)
5196 FN_GLOBAL_CONST_STRING(lp_socket_options, &Globals.szSocketOptions)
5197 FN_GLOBAL_INTEGER(lp_config_backend, &Globals.ConfigBackend)
5199 FN_LOCAL_STRING(lp_preexec, szPreExec)
5200 FN_LOCAL_STRING(lp_postexec, szPostExec)
5201 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
5202 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
5203 FN_LOCAL_STRING(lp_servicename, szService)
5204 FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
5205 FN_LOCAL_STRING(lp_pathname, szPath)
5206 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
5207 FN_LOCAL_STRING(lp_username, szUsername)
5208 FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
5209 FN_LOCAL_LIST(lp_valid_users, szValidUsers)
5210 FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
5211 FN_GLOBAL_LIST(lp_svcctl_list, &Globals.szServicesList)
5212 FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
5213 FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
5214 FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer)
5215 FN_GLOBAL_CONST_STRING(lp_ctdbd_socket, &Globals.ctdbdSocket)
5216 FN_GLOBAL_LIST(lp_cluster_addresses, &Globals.szClusterAddresses)
5217 FN_GLOBAL_BOOL(lp_clustering, &Globals.clustering)
5218 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
5219 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
5220 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
5221 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
5222 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
5223 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
5224 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
5225 static FN_LOCAL_STRING(_lp_printername, szPrintername)
5226 FN_LOCAL_CONST_STRING(lp_printjob_username, szPrintjobUsername)
5227 FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
5228 FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
5229 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
5230 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
5231 FN_LOCAL_STRING(lp_comment, comment)
5232 FN_LOCAL_STRING(lp_force_user, force_user)
5233 FN_LOCAL_STRING(lp_force_group, force_group)
5234 FN_LOCAL_LIST(lp_readlist, readlist)
5235 FN_LOCAL_LIST(lp_writelist, writelist)
5236 FN_LOCAL_LIST(lp_printer_admin, printer_admin)
5237 FN_LOCAL_STRING(lp_fstype, fstype)
5238 FN_LOCAL_LIST(lp_vfs_objects, szVfsObjects)
5239 FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
5240 static FN_LOCAL_STRING(lp_volume, volume)
5241 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
5242 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
5243 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
5244 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
5245 FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
5246 FN_LOCAL_STRING(lp_dfree_command, szDfree)
5247 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
5248 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
5249 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
5250 FN_LOCAL_INTEGER(lp_casesensitive, iCaseSensitive)
5251 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
5252 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
5253 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
5254 FN_LOCAL_BOOL(lp_hide_special_files, bHideSpecialFiles)
5255 FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
5256 FN_LOCAL_BOOL(lp_hideunwriteable_files, bHideUnWriteableFiles)
5257 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
5258 FN_LOCAL_BOOL(lp_readonly, bRead_only)
5259 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
5260 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
5261 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
5262 FN_LOCAL_BOOL(lp_administrative_share, bAdministrative_share)
5263 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
5264 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
5265 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
5266 FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
5267 FN_LOCAL_BOOL(lp_dmapi_support, bDmapiSupport)
5268 FN_LOCAL_PARM_BOOL(lp_locking, bLocking)
5269 FN_LOCAL_PARM_INTEGER(lp_strict_locking, iStrictLocking)
5270 FN_LOCAL_PARM_BOOL(lp_posix_locking, bPosixLocking)
5271 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
5272 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
5273 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
5274 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
5275 FN_LOCAL_PARM_BOOL(lp_manglednames, bMangledNames)
5276 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
5277 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
5278 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
5279 FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
5280 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
5281 FN_LOCAL_BOOL(lp_map_system, bMap_system)
5282 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
5283 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
5284 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
5285 FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
5286 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
5287 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
5288 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
5289 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
5290 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
5291 FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
5292 FN_LOCAL_BOOL(lp_inherit_owner, bInheritOwner)
5293 FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
5294 FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
5295 FN_LOCAL_BOOL(lp_force_printername, bForcePrintername)
5296 FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
5297 FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
5298 FN_LOCAL_BOOL(lp_ea_support, bEASupport)
5299 FN_LOCAL_BOOL(_lp_use_sendfile, bUseSendfile)
5300 FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
5301 FN_LOCAL_BOOL(lp_map_acl_inherit, bMap_acl_inherit)
5302 FN_LOCAL_BOOL(lp_afs_share, bAfs_Share)
5303 FN_LOCAL_BOOL(lp_acl_check_permissions, bAclCheckPermissions)
5304 FN_LOCAL_BOOL(lp_acl_group_control, bAclGroupControl)
5305 FN_LOCAL_BOOL(lp_acl_map_full_control, bAclMapFullControl)
5306 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
5307 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
5308 FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
5309 FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
5310 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
5311 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
5312 FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
5313 FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
5314 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
5315 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
5316 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
5317 FN_LOCAL_INTEGER(lp_printing, iPrinting)
5318 FN_LOCAL_INTEGER(lp_max_reported_jobs, iMaxReportedPrintJobs)
5319 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
5320 FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
5321 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
5322 FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
5323 FN_LOCAL_INTEGER(lp_dfree_cache_time, iDfreeCacheTime)
5324 FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size)
5325 FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
5326 FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
5327 FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
5328 FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize)
5329 FN_LOCAL_INTEGER(lp_smb_encrypt, ismb_encrypt)
5330 FN_LOCAL_CHAR(lp_magicchar, magic_char)
5331 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
5332 FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)
5333 FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
5334 FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
5335 FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
5336 FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
5337 FN_GLOBAL_INTEGER(lp_client_ldap_sasl_wrapping, &Globals.client_ldap_sasl_wrapping)
5339 /* local prototypes */
5341 static int map_parameter(const char *pszParmName);
5342 static int map_parameter_canonical(const char *pszParmName, bool *inverse);
5343 static bool set_boolean(bool *pb, const char *pszParmValue);
5344 static const char *get_boolean(bool bool_value);
5345 static int getservicebyname(const char *pszServiceName,
5346 struct service *pserviceDest);
5347 static void copy_service(struct service *pserviceDest,
5348 struct service *pserviceSource,
5349 struct bitmap *pcopymapDest);
5350 static bool do_parameter(const char *pszParmName, const char *pszParmValue,
5351 void *userdata);
5352 static bool do_section(const char *pszSectionName, void *userdata);
5353 static void init_copymap(struct service *pservice);
5354 static bool hash_a_service(const char *name, int number);
5355 static void free_service_byindex(int iService);
5356 static char * canonicalize_servicename(const char *name);
5357 static void show_parameter(int parmIndex);
5358 static bool is_synonym_of(int parm1, int parm2, bool *inverse);
5360 /* This is a helper function for parametrical options support. */
5361 /* It returns a pointer to parametrical option value if it exists or NULL otherwise */
5362 /* Actual parametrical functions are quite simple */
5363 static param_opt_struct *get_parametrics(int snum, const char *type, const char *option)
5365 bool global_section = False;
5366 char* param_key;
5367 param_opt_struct *data;
5369 if (snum >= iNumServices) return NULL;
5371 if (snum < 0) {
5372 data = Globals.param_opt;
5373 global_section = True;
5374 } else {
5375 data = ServicePtrs[snum]->param_opt;
5378 if (asprintf(&param_key, "%s:%s", type, option) == -1) {
5379 DEBUG(0,("asprintf failed!\n"));
5380 return NULL;
5383 while (data) {
5384 if (strcmp(data->key, param_key) == 0) {
5385 string_free(&param_key);
5386 return data;
5388 data = data->next;
5391 if (!global_section) {
5392 /* Try to fetch the same option but from globals */
5393 /* but only if we are not already working with Globals */
5394 data = Globals.param_opt;
5395 while (data) {
5396 if (strcmp(data->key, param_key) == 0) {
5397 string_free(&param_key);
5398 return data;
5400 data = data->next;
5404 string_free(&param_key);
5406 return NULL;
5410 #define MISSING_PARAMETER(name) \
5411 DEBUG(0, ("%s(): value is NULL or empty!\n", #name))
5413 /*******************************************************************
5414 convenience routine to return int parameters.
5415 ********************************************************************/
5416 static int lp_int(const char *s)
5419 if (!s || !*s) {
5420 MISSING_PARAMETER(lp_int);
5421 return (-1);
5424 return (int)strtol(s, NULL, 0);
5427 /*******************************************************************
5428 convenience routine to return unsigned long parameters.
5429 ********************************************************************/
5430 static unsigned long lp_ulong(const char *s)
5433 if (!s || !*s) {
5434 MISSING_PARAMETER(lp_ulong);
5435 return (0);
5438 return strtoul(s, NULL, 0);
5441 /*******************************************************************
5442 convenience routine to return boolean parameters.
5443 ********************************************************************/
5444 static bool lp_bool(const char *s)
5446 bool ret = False;
5448 if (!s || !*s) {
5449 MISSING_PARAMETER(lp_bool);
5450 return False;
5453 if (!set_boolean(&ret,s)) {
5454 DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
5455 return False;
5458 return ret;
5461 /*******************************************************************
5462 convenience routine to return enum parameters.
5463 ********************************************************************/
5464 static int lp_enum(const char *s,const struct enum_list *_enum)
5466 int i;
5468 if (!s || !*s || !_enum) {
5469 MISSING_PARAMETER(lp_enum);
5470 return (-1);
5473 for (i=0; _enum[i].name; i++) {
5474 if (strequal(_enum[i].name,s))
5475 return _enum[i].value;
5478 DEBUG(0,("lp_enum(%s,enum): value is not in enum_list!\n",s));
5479 return (-1);
5482 #undef MISSING_PARAMETER
5484 /* DO NOT USE lp_parm_string ANYMORE!!!!
5485 * use lp_parm_const_string or lp_parm_talloc_string
5487 * lp_parm_string is only used to let old modules find this symbol
5489 #undef lp_parm_string
5490 char *lp_parm_string(const char *servicename, const char *type, const char *option);
5491 char *lp_parm_string(const char *servicename, const char *type, const char *option)
5493 return lp_parm_talloc_string(lp_servicenumber(servicename), type, option, NULL);
5496 /* Return parametric option from a given service. Type is a part of option before ':' */
5497 /* Parametric option has following syntax: 'Type: option = value' */
5498 /* the returned value is talloced on the talloc_tos() */
5499 char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def)
5501 param_opt_struct *data = get_parametrics(snum, type, option);
5503 if (data == NULL||data->value==NULL) {
5504 if (def) {
5505 return lp_string(def);
5506 } else {
5507 return NULL;
5511 return lp_string(data->value);
5514 /* Return parametric option from a given service. Type is a part of option before ':' */
5515 /* Parametric option has following syntax: 'Type: option = value' */
5516 const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def)
5518 param_opt_struct *data = get_parametrics(snum, type, option);
5520 if (data == NULL||data->value==NULL)
5521 return def;
5523 return data->value;
5526 /* Return parametric option from a given service. Type is a part of option before ':' */
5527 /* Parametric option has following syntax: 'Type: option = value' */
5529 const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def)
5531 param_opt_struct *data = get_parametrics(snum, type, option);
5533 if (data == NULL||data->value==NULL)
5534 return (const char **)def;
5536 if (data->list==NULL) {
5537 data->list = str_list_make(NULL, data->value, NULL);
5540 return (const char **)data->list;
5543 /* Return parametric option from a given service. Type is a part of option before ':' */
5544 /* Parametric option has following syntax: 'Type: option = value' */
5546 int lp_parm_int(int snum, const char *type, const char *option, int def)
5548 param_opt_struct *data = get_parametrics(snum, type, option);
5550 if (data && data->value && *data->value)
5551 return lp_int(data->value);
5553 return def;
5556 /* Return parametric option from a given service. Type is a part of option before ':' */
5557 /* Parametric option has following syntax: 'Type: option = value' */
5559 unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsigned long def)
5561 param_opt_struct *data = get_parametrics(snum, type, option);
5563 if (data && data->value && *data->value)
5564 return lp_ulong(data->value);
5566 return def;
5569 /* Return parametric option from a given service. Type is a part of option before ':' */
5570 /* Parametric option has following syntax: 'Type: option = value' */
5572 bool lp_parm_bool(int snum, const char *type, const char *option, bool def)
5574 param_opt_struct *data = get_parametrics(snum, type, option);
5576 if (data && data->value && *data->value)
5577 return lp_bool(data->value);
5579 return def;
5582 /* Return parametric option from a given service. Type is a part of option before ':' */
5583 /* Parametric option has following syntax: 'Type: option = value' */
5585 int lp_parm_enum(int snum, const char *type, const char *option,
5586 const struct enum_list *_enum, int def)
5588 param_opt_struct *data = get_parametrics(snum, type, option);
5590 if (data && data->value && *data->value && _enum)
5591 return lp_enum(data->value, _enum);
5593 return def;
5597 /***************************************************************************
5598 Initialise a service to the defaults.
5599 ***************************************************************************/
5601 static void init_service(struct service *pservice)
5603 memset((char *)pservice, '\0', sizeof(struct service));
5604 copy_service(pservice, &sDefault, NULL);
5607 /***************************************************************************
5608 Free the dynamically allocated parts of a service struct.
5609 ***************************************************************************/
5611 static void free_service(struct service *pservice)
5613 int i;
5614 param_opt_struct *data, *pdata;
5615 if (!pservice)
5616 return;
5618 if (pservice->szService)
5619 DEBUG(5, ("free_service: Freeing service %s\n",
5620 pservice->szService));
5622 string_free(&pservice->szService);
5623 bitmap_free(pservice->copymap);
5625 for (i = 0; parm_table[i].label; i++) {
5626 if ((parm_table[i].type == P_STRING ||
5627 parm_table[i].type == P_USTRING) &&
5628 parm_table[i].p_class == P_LOCAL)
5629 string_free((char **)
5630 (((char *)pservice) +
5631 PTR_DIFF(parm_table[i].ptr, &sDefault)));
5632 else if (parm_table[i].type == P_LIST &&
5633 parm_table[i].p_class == P_LOCAL)
5634 TALLOC_FREE(*((char ***)
5635 (((char *)pservice) +
5636 PTR_DIFF(parm_table[i].ptr,
5637 &sDefault))));
5640 data = pservice->param_opt;
5641 if (data)
5642 DEBUG(5,("Freeing parametrics:\n"));
5643 while (data) {
5644 DEBUG(5,("[%s = %s]\n", data->key, data->value));
5645 string_free(&data->key);
5646 string_free(&data->value);
5647 TALLOC_FREE(data->list);
5648 pdata = data->next;
5649 SAFE_FREE(data);
5650 data = pdata;
5653 ZERO_STRUCTP(pservice);
5657 /***************************************************************************
5658 remove a service indexed in the ServicePtrs array from the ServiceHash
5659 and free the dynamically allocated parts
5660 ***************************************************************************/
5662 static void free_service_byindex(int idx)
5664 if ( !LP_SNUM_OK(idx) )
5665 return;
5667 ServicePtrs[idx]->valid = False;
5668 invalid_services[num_invalid_services++] = idx;
5670 /* we have to cleanup the hash record */
5672 if (ServicePtrs[idx]->szService) {
5673 char *canon_name = canonicalize_servicename(
5674 ServicePtrs[idx]->szService );
5676 dbwrap_delete_bystring(ServiceHash, canon_name );
5677 TALLOC_FREE(canon_name);
5680 free_service(ServicePtrs[idx]);
5683 /***************************************************************************
5684 Add a new service to the services array initialising it with the given
5685 service.
5686 ***************************************************************************/
5688 static int add_a_service(const struct service *pservice, const char *name)
5690 int i;
5691 struct service tservice;
5692 int num_to_alloc = iNumServices + 1;
5693 param_opt_struct *data, *pdata;
5695 tservice = *pservice;
5697 /* it might already exist */
5698 if (name) {
5699 i = getservicebyname(name, NULL);
5700 if (i >= 0) {
5701 /* Clean all parametric options for service */
5702 /* They will be added during parsing again */
5703 data = ServicePtrs[i]->param_opt;
5704 while (data) {
5705 string_free(&data->key);
5706 string_free(&data->value);
5707 TALLOC_FREE(data->list);
5708 pdata = data->next;
5709 SAFE_FREE(data);
5710 data = pdata;
5712 ServicePtrs[i]->param_opt = NULL;
5713 return (i);
5717 /* find an invalid one */
5718 i = iNumServices;
5719 if (num_invalid_services > 0) {
5720 i = invalid_services[--num_invalid_services];
5723 /* if not, then create one */
5724 if (i == iNumServices) {
5725 struct service **tsp;
5726 int *tinvalid;
5728 tsp = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(ServicePtrs, struct service *, num_to_alloc);
5729 if (tsp == NULL) {
5730 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
5731 return (-1);
5733 ServicePtrs = tsp;
5734 ServicePtrs[iNumServices] = SMB_MALLOC_P(struct service);
5735 if (!ServicePtrs[iNumServices]) {
5736 DEBUG(0,("add_a_service: out of memory!\n"));
5737 return (-1);
5739 iNumServices++;
5741 /* enlarge invalid_services here for now... */
5742 tinvalid = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(invalid_services, int,
5743 num_to_alloc);
5744 if (tinvalid == NULL) {
5745 DEBUG(0,("add_a_service: failed to enlarge "
5746 "invalid_services!\n"));
5747 return (-1);
5749 invalid_services = tinvalid;
5750 } else {
5751 free_service_byindex(i);
5754 ServicePtrs[i]->valid = True;
5756 init_service(ServicePtrs[i]);
5757 copy_service(ServicePtrs[i], &tservice, NULL);
5758 if (name)
5759 string_set(&ServicePtrs[i]->szService, name);
5761 DEBUG(8,("add_a_service: Creating snum = %d for %s\n",
5762 i, ServicePtrs[i]->szService));
5764 if (!hash_a_service(ServicePtrs[i]->szService, i)) {
5765 return (-1);
5768 return (i);
5771 /***************************************************************************
5772 Convert a string to uppercase and remove whitespaces.
5773 ***************************************************************************/
5775 static char *canonicalize_servicename(const char *src)
5777 char *result;
5779 if ( !src ) {
5780 DEBUG(0,("canonicalize_servicename: NULL source name!\n"));
5781 return NULL;
5784 result = talloc_strdup(talloc_tos(), src);
5785 SMB_ASSERT(result != NULL);
5787 strlower_m(result);
5788 return result;
5791 /***************************************************************************
5792 Add a name/index pair for the services array to the hash table.
5793 ***************************************************************************/
5795 static bool hash_a_service(const char *name, int idx)
5797 char *canon_name;
5799 if ( !ServiceHash ) {
5800 DEBUG(10,("hash_a_service: creating servicehash\n"));
5801 ServiceHash = db_open_rbt(NULL);
5802 if ( !ServiceHash ) {
5803 DEBUG(0,("hash_a_service: open tdb servicehash failed!\n"));
5804 return False;
5808 DEBUG(10,("hash_a_service: hashing index %d for service name %s\n",
5809 idx, name));
5811 canon_name = canonicalize_servicename( name );
5813 dbwrap_store_bystring(ServiceHash, canon_name,
5814 make_tdb_data((uint8 *)&idx, sizeof(idx)),
5815 TDB_REPLACE);
5817 TALLOC_FREE(canon_name);
5819 return True;
5822 /***************************************************************************
5823 Add a new home service, with the specified home directory, defaults coming
5824 from service ifrom.
5825 ***************************************************************************/
5827 bool lp_add_home(const char *pszHomename, int iDefaultService,
5828 const char *user, const char *pszHomedir)
5830 int i;
5832 i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
5834 if (i < 0)
5835 return (False);
5837 if (!(*(ServicePtrs[iDefaultService]->szPath))
5838 || strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(GLOBAL_SECTION_SNUM))) {
5839 string_set(&ServicePtrs[i]->szPath, pszHomedir);
5842 if (!(*(ServicePtrs[i]->comment))) {
5843 char *comment = NULL;
5844 if (asprintf(&comment, "Home directory of %s", user) < 0) {
5845 return false;
5847 string_set(&ServicePtrs[i]->comment, comment);
5848 SAFE_FREE(comment);
5851 /* set the browseable flag from the global default */
5853 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
5855 ServicePtrs[i]->autoloaded = True;
5857 DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename,
5858 user, ServicePtrs[i]->szPath ));
5860 return (True);
5863 /***************************************************************************
5864 Add a new service, based on an old one.
5865 ***************************************************************************/
5867 int lp_add_service(const char *pszService, int iDefaultService)
5869 if (iDefaultService < 0) {
5870 return add_a_service(&sDefault, pszService);
5873 return (add_a_service(ServicePtrs[iDefaultService], pszService));
5876 /***************************************************************************
5877 Add the IPC service.
5878 ***************************************************************************/
5880 static bool lp_add_ipc(const char *ipc_name, bool guest_ok)
5882 char *comment = NULL;
5883 int i = add_a_service(&sDefault, ipc_name);
5885 if (i < 0)
5886 return (False);
5888 if (asprintf(&comment, "IPC Service (%s)",
5889 Globals.szServerString) < 0) {
5890 return (False);
5893 string_set(&ServicePtrs[i]->szPath, tmpdir());
5894 string_set(&ServicePtrs[i]->szUsername, "");
5895 string_set(&ServicePtrs[i]->comment, comment);
5896 string_set(&ServicePtrs[i]->fstype, "IPC");
5897 ServicePtrs[i]->iMaxConnections = 0;
5898 ServicePtrs[i]->bAvailable = True;
5899 ServicePtrs[i]->bRead_only = True;
5900 ServicePtrs[i]->bGuest_only = False;
5901 ServicePtrs[i]->bAdministrative_share = True;
5902 ServicePtrs[i]->bGuest_ok = guest_ok;
5903 ServicePtrs[i]->bPrint_ok = False;
5904 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
5906 DEBUG(3, ("adding IPC service\n"));
5908 SAFE_FREE(comment);
5909 return (True);
5912 /***************************************************************************
5913 Add a new printer service, with defaults coming from service iFrom.
5914 ***************************************************************************/
5916 bool lp_add_printer(const char *pszPrintername, int iDefaultService)
5918 const char *comment = "From Printcap";
5919 int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
5921 if (i < 0)
5922 return (False);
5924 /* note that we do NOT default the availability flag to True - */
5925 /* we take it from the default service passed. This allows all */
5926 /* dynamic printers to be disabled by disabling the [printers] */
5927 /* entry (if/when the 'available' keyword is implemented!). */
5929 /* the printer name is set to the service name. */
5930 string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
5931 string_set(&ServicePtrs[i]->comment, comment);
5933 /* set the browseable flag from the gloabl default */
5934 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
5936 /* Printers cannot be read_only. */
5937 ServicePtrs[i]->bRead_only = False;
5938 /* No share modes on printer services. */
5939 ServicePtrs[i]->bShareModes = False;
5940 /* No oplocks on printer services. */
5941 ServicePtrs[i]->bOpLocks = False;
5942 /* Printer services must be printable. */
5943 ServicePtrs[i]->bPrint_ok = True;
5945 DEBUG(3, ("adding printer service %s\n", pszPrintername));
5947 return (True);
5951 /***************************************************************************
5952 Check whether the given parameter name is valid.
5953 Parametric options (names containing a colon) are considered valid.
5954 ***************************************************************************/
5956 bool lp_parameter_is_valid(const char *pszParmName)
5958 return ((map_parameter(pszParmName) != -1) ||
5959 (strchr(pszParmName, ':') != NULL));
5962 /***************************************************************************
5963 Check whether the given name is the name of a global parameter.
5964 Returns True for strings belonging to parameters of class
5965 P_GLOBAL, False for all other strings, also for parametric options
5966 and strings not belonging to any option.
5967 ***************************************************************************/
5969 bool lp_parameter_is_global(const char *pszParmName)
5971 int num = map_parameter(pszParmName);
5973 if (num >= 0) {
5974 return (parm_table[num].p_class == P_GLOBAL);
5977 return False;
5980 /**************************************************************************
5981 Check whether the given name is the canonical name of a parameter.
5982 Returns False if it is not a valid parameter Name.
5983 For parametric options, True is returned.
5984 **************************************************************************/
5986 bool lp_parameter_is_canonical(const char *parm_name)
5988 if (!lp_parameter_is_valid(parm_name)) {
5989 return False;
5992 return (map_parameter(parm_name) ==
5993 map_parameter_canonical(parm_name, NULL));
5996 /**************************************************************************
5997 Determine the canonical name for a parameter.
5998 Indicate when it is an inverse (boolean) synonym instead of a
5999 "usual" synonym.
6000 **************************************************************************/
6002 bool lp_canonicalize_parameter(const char *parm_name, const char **canon_parm,
6003 bool *inverse)
6005 int num;
6007 if (!lp_parameter_is_valid(parm_name)) {
6008 *canon_parm = NULL;
6009 return False;
6012 num = map_parameter_canonical(parm_name, inverse);
6013 if (num < 0) {
6014 /* parametric option */
6015 *canon_parm = parm_name;
6016 } else {
6017 *canon_parm = parm_table[num].label;
6020 return True;
6024 /**************************************************************************
6025 Determine the canonical name for a parameter.
6026 Turn the value given into the inverse boolean expression when
6027 the synonym is an invers boolean synonym.
6029 Return True if parm_name is a valid parameter name and
6030 in case it is an invers boolean synonym, if the val string could
6031 successfully be converted to the reverse bool.
6032 Return false in all other cases.
6033 **************************************************************************/
6035 bool lp_canonicalize_parameter_with_value(const char *parm_name,
6036 const char *val,
6037 const char **canon_parm,
6038 const char **canon_val)
6040 int num;
6041 bool inverse;
6043 if (!lp_parameter_is_valid(parm_name)) {
6044 *canon_parm = NULL;
6045 *canon_val = NULL;
6046 return False;
6049 num = map_parameter_canonical(parm_name, &inverse);
6050 if (num < 0) {
6051 /* parametric option */
6052 *canon_parm = parm_name;
6053 *canon_val = val;
6054 } else {
6055 *canon_parm = parm_table[num].label;
6056 if (inverse) {
6057 if (!lp_invert_boolean(val, canon_val)) {
6058 *canon_val = NULL;
6059 return False;
6061 } else {
6062 *canon_val = val;
6066 return True;
6069 /***************************************************************************
6070 Map a parameter's string representation to something we can use.
6071 Returns False if the parameter string is not recognised, else TRUE.
6072 ***************************************************************************/
6074 static int map_parameter(const char *pszParmName)
6076 int iIndex;
6078 if (*pszParmName == '-')
6079 return (-1);
6081 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
6082 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
6083 return (iIndex);
6085 /* Warn only if it isn't parametric option */
6086 if (strchr(pszParmName, ':') == NULL)
6087 DEBUG(1, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
6088 /* We do return 'fail' for parametric options as well because they are
6089 stored in different storage
6091 return (-1);
6094 /***************************************************************************
6095 Map a parameter's string representation to the index of the canonical
6096 form of the parameter (it might be a synonym).
6097 Returns -1 if the parameter string is not recognised.
6098 ***************************************************************************/
6100 static int map_parameter_canonical(const char *pszParmName, bool *inverse)
6102 int parm_num, canon_num;
6103 bool loc_inverse = False;
6105 parm_num = map_parameter(pszParmName);
6106 if ((parm_num < 0) || !(parm_table[parm_num].flags & FLAG_HIDE)) {
6107 /* invalid, parametric or no canidate for synonyms ... */
6108 goto done;
6111 for (canon_num = 0; parm_table[canon_num].label; canon_num++) {
6112 if (is_synonym_of(parm_num, canon_num, &loc_inverse)) {
6113 parm_num = canon_num;
6114 goto done;
6118 done:
6119 if (inverse != NULL) {
6120 *inverse = loc_inverse;
6122 return parm_num;
6125 /***************************************************************************
6126 return true if parameter number parm1 is a synonym of parameter
6127 number parm2 (parm2 being the principal name).
6128 set inverse to True if parm1 is P_BOOLREV and parm2 is P_BOOL,
6129 False otherwise.
6130 ***************************************************************************/
6132 static bool is_synonym_of(int parm1, int parm2, bool *inverse)
6134 if ((parm_table[parm1].ptr == parm_table[parm2].ptr) &&
6135 (parm_table[parm1].flags & FLAG_HIDE) &&
6136 !(parm_table[parm2].flags & FLAG_HIDE))
6138 if (inverse != NULL) {
6139 if ((parm_table[parm1].type == P_BOOLREV) &&
6140 (parm_table[parm2].type == P_BOOL))
6142 *inverse = True;
6143 } else {
6144 *inverse = False;
6147 return True;
6149 return False;
6152 /***************************************************************************
6153 Show one parameter's name, type, [values,] and flags.
6154 (helper functions for show_parameter_list)
6155 ***************************************************************************/
6157 static void show_parameter(int parmIndex)
6159 int enumIndex, flagIndex;
6160 int parmIndex2;
6161 bool hadFlag;
6162 bool hadSyn;
6163 bool inverse;
6164 const char *type[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
6165 "P_OCTAL", "P_LIST", "P_STRING", "P_USTRING",
6166 "P_ENUM", "P_SEP"};
6167 unsigned flags[] = { FLAG_BASIC, FLAG_SHARE, FLAG_PRINT, FLAG_GLOBAL,
6168 FLAG_WIZARD, FLAG_ADVANCED, FLAG_DEVELOPER, FLAG_DEPRECATED,
6169 FLAG_HIDE, FLAG_DOS_STRING};
6170 const char *flag_names[] = { "FLAG_BASIC", "FLAG_SHARE", "FLAG_PRINT",
6171 "FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
6172 "FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL};
6174 printf("%s=%s", parm_table[parmIndex].label,
6175 type[parm_table[parmIndex].type]);
6176 if (parm_table[parmIndex].type == P_ENUM) {
6177 printf(",");
6178 for (enumIndex=0;
6179 parm_table[parmIndex].enum_list[enumIndex].name;
6180 enumIndex++)
6182 printf("%s%s",
6183 enumIndex ? "|" : "",
6184 parm_table[parmIndex].enum_list[enumIndex].name);
6187 printf(",");
6188 hadFlag = False;
6189 for (flagIndex=0; flag_names[flagIndex]; flagIndex++) {
6190 if (parm_table[parmIndex].flags & flags[flagIndex]) {
6191 printf("%s%s",
6192 hadFlag ? "|" : "",
6193 flag_names[flagIndex]);
6194 hadFlag = True;
6198 /* output synonyms */
6199 hadSyn = False;
6200 for (parmIndex2=0; parm_table[parmIndex2].label; parmIndex2++) {
6201 if (is_synonym_of(parmIndex, parmIndex2, &inverse)) {
6202 printf(" (%ssynonym of %s)", inverse ? "inverse " : "",
6203 parm_table[parmIndex2].label);
6204 } else if (is_synonym_of(parmIndex2, parmIndex, &inverse)) {
6205 if (!hadSyn) {
6206 printf(" (synonyms: ");
6207 hadSyn = True;
6208 } else {
6209 printf(", ");
6211 printf("%s%s", parm_table[parmIndex2].label,
6212 inverse ? "[i]" : "");
6215 if (hadSyn) {
6216 printf(")");
6219 printf("\n");
6222 /***************************************************************************
6223 Show all parameter's name, type, [values,] and flags.
6224 ***************************************************************************/
6226 void show_parameter_list(void)
6228 int classIndex, parmIndex;
6229 const char *section_names[] = { "local", "global", NULL};
6231 for (classIndex=0; section_names[classIndex]; classIndex++) {
6232 printf("[%s]\n", section_names[classIndex]);
6233 for (parmIndex = 0; parm_table[parmIndex].label; parmIndex++) {
6234 if (parm_table[parmIndex].p_class == classIndex) {
6235 show_parameter(parmIndex);
6241 /***************************************************************************
6242 Set a boolean variable from the text value stored in the passed string.
6243 Returns True in success, False if the passed string does not correctly
6244 represent a boolean.
6245 ***************************************************************************/
6247 static bool set_boolean(bool *pb, const char *pszParmValue)
6249 bool bRetval;
6250 bool value;
6252 bRetval = True;
6253 value = False;
6254 if (strwicmp(pszParmValue, "yes") == 0 ||
6255 strwicmp(pszParmValue, "true") == 0 ||
6256 strwicmp(pszParmValue, "1") == 0)
6257 value = True;
6258 else if (strwicmp(pszParmValue, "no") == 0 ||
6259 strwicmp(pszParmValue, "False") == 0 ||
6260 strwicmp(pszParmValue, "0") == 0)
6261 value = False;
6262 else {
6263 DEBUG(2,
6264 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
6265 pszParmValue));
6266 bRetval = False;
6269 if ((pb != NULL) && (bRetval != False)) {
6270 *pb = value;
6273 return (bRetval);
6277 /***************************************************************************
6278 Check if a given string correctly represents a boolean value.
6279 ***************************************************************************/
6281 bool lp_string_is_valid_boolean(const char *parm_value)
6283 return set_boolean(NULL, parm_value);
6286 /***************************************************************************
6287 Get the standard string representation of a boolean value ("yes" or "no")
6288 ***************************************************************************/
6290 static const char *get_boolean(bool bool_value)
6292 static const char *yes_str = "yes";
6293 static const char *no_str = "no";
6295 return (bool_value ? yes_str : no_str);
6298 /***************************************************************************
6299 Provide the string of the negated boolean value associated to the boolean
6300 given as a string. Returns False if the passed string does not correctly
6301 represent a boolean.
6302 ***************************************************************************/
6304 bool lp_invert_boolean(const char *str, const char **inverse_str)
6306 bool val;
6308 if (!set_boolean(&val, str)) {
6309 return False;
6312 *inverse_str = get_boolean(!val);
6313 return True;
6316 /***************************************************************************
6317 Provide the canonical string representation of a boolean value given
6318 as a string. Return True on success, False if the string given does
6319 not correctly represent a boolean.
6320 ***************************************************************************/
6322 bool lp_canonicalize_boolean(const char *str, const char**canon_str)
6324 bool val;
6326 if (!set_boolean(&val, str)) {
6327 return False;
6330 *canon_str = get_boolean(val);
6331 return True;
6334 /***************************************************************************
6335 Find a service by name. Otherwise works like get_service.
6336 ***************************************************************************/
6338 static int getservicebyname(const char *pszServiceName, struct service *pserviceDest)
6340 int iService = -1;
6341 char *canon_name;
6342 TDB_DATA data;
6344 if (ServiceHash == NULL) {
6345 return -1;
6348 canon_name = canonicalize_servicename(pszServiceName);
6350 data = dbwrap_fetch_bystring(ServiceHash, canon_name, canon_name);
6352 if ((data.dptr != NULL) && (data.dsize == sizeof(iService))) {
6353 iService = *(int *)data.dptr;
6356 TALLOC_FREE(canon_name);
6358 if ((iService != -1) && (LP_SNUM_OK(iService))
6359 && (pserviceDest != NULL)) {
6360 copy_service(pserviceDest, ServicePtrs[iService], NULL);
6363 return (iService);
6366 /***************************************************************************
6367 Copy a service structure to another.
6368 If pcopymapDest is NULL then copy all fields
6369 ***************************************************************************/
6371 static void copy_service(struct service *pserviceDest, struct service *pserviceSource,
6372 struct bitmap *pcopymapDest)
6374 int i;
6375 bool bcopyall = (pcopymapDest == NULL);
6376 param_opt_struct *data, *pdata, *paramo;
6377 bool not_added;
6379 for (i = 0; parm_table[i].label; i++)
6380 if (parm_table[i].ptr && parm_table[i].p_class == P_LOCAL &&
6381 (bcopyall || bitmap_query(pcopymapDest,i))) {
6382 void *def_ptr = parm_table[i].ptr;
6383 void *src_ptr =
6384 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
6385 &sDefault);
6386 void *dest_ptr =
6387 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
6388 &sDefault);
6390 switch (parm_table[i].type) {
6391 case P_BOOL:
6392 case P_BOOLREV:
6393 *(bool *)dest_ptr = *(bool *)src_ptr;
6394 break;
6396 case P_INTEGER:
6397 case P_ENUM:
6398 case P_OCTAL:
6399 *(int *)dest_ptr = *(int *)src_ptr;
6400 break;
6402 case P_CHAR:
6403 *(char *)dest_ptr = *(char *)src_ptr;
6404 break;
6406 case P_STRING:
6407 string_set((char **)dest_ptr,
6408 *(char **)src_ptr);
6409 break;
6411 case P_USTRING:
6412 string_set((char **)dest_ptr,
6413 *(char **)src_ptr);
6414 strupper_m(*(char **)dest_ptr);
6415 break;
6416 case P_LIST:
6417 TALLOC_FREE(*((char ***)dest_ptr));
6418 str_list_copy(NULL, (char ***)dest_ptr,
6419 *(const char ***)src_ptr);
6420 break;
6421 default:
6422 break;
6426 if (bcopyall) {
6427 init_copymap(pserviceDest);
6428 if (pserviceSource->copymap)
6429 bitmap_copy(pserviceDest->copymap,
6430 pserviceSource->copymap);
6433 data = pserviceSource->param_opt;
6434 while (data) {
6435 not_added = True;
6436 pdata = pserviceDest->param_opt;
6437 /* Traverse destination */
6438 while (pdata) {
6439 /* If we already have same option, override it */
6440 if (strcmp(pdata->key, data->key) == 0) {
6441 string_free(&pdata->value);
6442 TALLOC_FREE(data->list);
6443 pdata->value = SMB_STRDUP(data->value);
6444 not_added = False;
6445 break;
6447 pdata = pdata->next;
6449 if (not_added) {
6450 paramo = SMB_XMALLOC_P(param_opt_struct);
6451 paramo->key = SMB_STRDUP(data->key);
6452 paramo->value = SMB_STRDUP(data->value);
6453 paramo->list = NULL;
6454 DLIST_ADD(pserviceDest->param_opt, paramo);
6456 data = data->next;
6460 /***************************************************************************
6461 Check a service for consistency. Return False if the service is in any way
6462 incomplete or faulty, else True.
6463 ***************************************************************************/
6465 bool service_ok(int iService)
6467 bool bRetval;
6469 bRetval = True;
6470 if (ServicePtrs[iService]->szService[0] == '\0') {
6471 DEBUG(0, ("The following message indicates an internal error:\n"));
6472 DEBUG(0, ("No service name in service entry.\n"));
6473 bRetval = False;
6476 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
6477 /* I can't see why you'd want a non-printable printer service... */
6478 if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
6479 if (!ServicePtrs[iService]->bPrint_ok) {
6480 DEBUG(0, ("WARNING: [%s] service MUST be printable!\n",
6481 ServicePtrs[iService]->szService));
6482 ServicePtrs[iService]->bPrint_ok = True;
6484 /* [printers] service must also be non-browsable. */
6485 if (ServicePtrs[iService]->bBrowseable)
6486 ServicePtrs[iService]->bBrowseable = False;
6489 if (ServicePtrs[iService]->szPath[0] == '\0' &&
6490 strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0 &&
6491 ServicePtrs[iService]->szMSDfsProxy[0] == '\0'
6493 DEBUG(0, ("WARNING: No path in service %s - making it unavailable!\n",
6494 ServicePtrs[iService]->szService));
6495 ServicePtrs[iService]->bAvailable = False;
6498 /* If a service is flagged unavailable, log the fact at level 1. */
6499 if (!ServicePtrs[iService]->bAvailable)
6500 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
6501 ServicePtrs[iService]->szService));
6503 return (bRetval);
6507 * process_registry_globals
6509 static bool process_registry_globals(void)
6511 WERROR werr;
6512 struct smbconf_service *service = NULL;
6513 uint32_t count;
6514 TALLOC_CTX *mem_ctx = talloc_stackframe();
6515 bool ret = false;
6517 if (conf_ctx == NULL) {
6518 /* first time */
6519 werr = smbconf_init(NULL, &conf_ctx, "registry:");
6520 if (!W_ERROR_IS_OK(werr)) {
6521 goto done;
6525 if (!smbconf_share_exists(conf_ctx, GLOBAL_NAME)) {
6526 /* nothing to read from the registry yet but make sure lp_load
6527 * doesn't return false */
6528 ret = true;
6529 goto done;
6532 werr = smbconf_get_share(conf_ctx, mem_ctx, GLOBAL_NAME, &service);
6533 if (!W_ERROR_IS_OK(werr)) {
6534 goto done;
6537 for (count = 0; count < service->num_params; count++) {
6538 ret = do_parameter(service->param_names[count],
6539 service->param_values[count],
6540 NULL);
6541 if (ret != true) {
6542 goto done;
6546 ret = do_parameter("registry shares", "yes", NULL);
6547 /* store the csn */
6548 smbconf_changed(conf_ctx, &conf_last_csn, NULL, NULL);
6550 done:
6551 TALLOC_FREE(mem_ctx);
6552 return ret;
6555 static struct file_lists {
6556 struct file_lists *next;
6557 char *name;
6558 char *subfname;
6559 time_t modtime;
6560 } *file_lists = NULL;
6562 /*******************************************************************
6563 Keep a linked list of all config files so we know when one has changed
6564 it's date and needs to be reloaded.
6565 ********************************************************************/
6567 static void add_to_file_list(const char *fname, const char *subfname)
6569 struct file_lists *f = file_lists;
6571 while (f) {
6572 if (f->name && !strcmp(f->name, fname))
6573 break;
6574 f = f->next;
6577 if (!f) {
6578 f = SMB_MALLOC_P(struct file_lists);
6579 if (!f)
6580 return;
6581 f->next = file_lists;
6582 f->name = SMB_STRDUP(fname);
6583 if (!f->name) {
6584 SAFE_FREE(f);
6585 return;
6587 f->subfname = SMB_STRDUP(subfname);
6588 if (!f->subfname) {
6589 SAFE_FREE(f);
6590 return;
6592 file_lists = f;
6593 f->modtime = file_modtime(subfname);
6594 } else {
6595 time_t t = file_modtime(subfname);
6596 if (t)
6597 f->modtime = t;
6602 * Utility function for outsiders to check if we're running on registry.
6604 bool lp_config_backend_is_registry(void)
6606 return (lp_config_backend() == CONFIG_BACKEND_REGISTRY);
6610 * Utility function to check if the config backend is FILE.
6612 bool lp_config_backend_is_file(void)
6614 return (lp_config_backend() == CONFIG_BACKEND_FILE);
6617 /*******************************************************************
6618 Check if a config file has changed date.
6619 ********************************************************************/
6621 bool lp_file_list_changed(void)
6623 struct file_lists *f = file_lists;
6625 DEBUG(6, ("lp_file_list_changed()\n"));
6627 if (lp_config_backend_is_registry()) {
6628 if (conf_ctx == NULL) {
6629 WERROR werr;
6630 werr = smbconf_init(NULL, &conf_ctx, "registry:");
6631 if (!W_ERROR_IS_OK(werr)) {
6632 DEBUG(0, ("error opening configuration: %s\n",
6633 dos_errstr(werr)));
6634 return false;
6637 if (smbconf_changed(conf_ctx, &conf_last_csn, NULL, NULL)) {
6638 DEBUGADD(6, ("registry config changed\n"));
6639 return true;
6643 while (f) {
6644 char *n2 = NULL;
6645 time_t mod_time;
6647 n2 = alloc_sub_basic(get_current_username(),
6648 current_user_info.domain,
6649 f->name);
6650 if (!n2) {
6651 return false;
6653 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
6654 f->name, n2, ctime(&f->modtime)));
6656 mod_time = file_modtime(n2);
6658 if (mod_time && ((f->modtime != mod_time) || (f->subfname == NULL) || (strcmp(n2, f->subfname) != 0))) {
6659 DEBUGADD(6,
6660 ("file %s modified: %s\n", n2,
6661 ctime(&mod_time)));
6662 f->modtime = mod_time;
6663 SAFE_FREE(f->subfname);
6664 f->subfname = n2; /* Passing ownership of
6665 return from alloc_sub_basic
6666 above. */
6667 return true;
6669 SAFE_FREE(n2);
6670 f = f->next;
6672 return (False);
6676 /***************************************************************************
6677 Run standard_sub_basic on netbios name... needed because global_myname
6678 is not accessed through any lp_ macro.
6679 Note: We must *NOT* use string_set() here as ptr points to global_myname.
6680 ***************************************************************************/
6682 static bool handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
6684 bool ret;
6685 char *netbios_name = alloc_sub_basic(get_current_username(),
6686 current_user_info.domain,
6687 pszParmValue);
6689 ret = set_global_myname(netbios_name);
6690 SAFE_FREE(netbios_name);
6691 string_set(&Globals.szNetbiosName,global_myname());
6693 DEBUG(4, ("handle_netbios_name: set global_myname to: %s\n",
6694 global_myname()));
6696 return ret;
6699 static bool handle_charset(int snum, const char *pszParmValue, char **ptr)
6701 if (strcmp(*ptr, pszParmValue) != 0) {
6702 string_set(ptr, pszParmValue);
6703 init_iconv();
6705 return True;
6710 static bool handle_workgroup(int snum, const char *pszParmValue, char **ptr)
6712 bool ret;
6714 ret = set_global_myworkgroup(pszParmValue);
6715 string_set(&Globals.szWorkgroup,lp_workgroup());
6717 return ret;
6720 static bool handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
6722 bool ret;
6724 ret = set_global_scope(pszParmValue);
6725 string_set(&Globals.szNetbiosScope,global_scope());
6727 return ret;
6730 static bool handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
6732 TALLOC_FREE(Globals.szNetbiosAliases);
6733 Globals.szNetbiosAliases = str_list_make(NULL, pszParmValue, NULL);
6734 return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
6737 /***************************************************************************
6738 Handle the include operation.
6739 ***************************************************************************/
6740 static bool bAllowIncludeRegistry = true;
6742 static bool handle_include(int snum, const char *pszParmValue, char **ptr)
6744 char *fname;
6746 if (strequal(pszParmValue, INCLUDE_REGISTRY_NAME)) {
6747 if (!bAllowIncludeRegistry) {
6748 return true;
6750 if (bInGlobalSection) {
6751 return process_registry_globals();
6752 } else {
6753 DEBUG(1, ("\"include = registry\" only effective "
6754 "in %s section\n", GLOBAL_NAME));
6755 return false;
6759 fname = alloc_sub_basic(get_current_username(),
6760 current_user_info.domain,
6761 pszParmValue);
6763 add_to_file_list(pszParmValue, fname);
6765 string_set(ptr, fname);
6767 if (file_exist(fname, NULL)) {
6768 bool ret = pm_process(fname, do_section, do_parameter, NULL);
6769 SAFE_FREE(fname);
6770 return ret;
6773 DEBUG(2, ("Can't find include file %s\n", fname));
6774 SAFE_FREE(fname);
6775 return false;
6778 /***************************************************************************
6779 Handle the interpretation of the copy parameter.
6780 ***************************************************************************/
6782 static bool handle_copy(int snum, const char *pszParmValue, char **ptr)
6784 bool bRetval;
6785 int iTemp;
6786 struct service serviceTemp;
6788 string_set(ptr, pszParmValue);
6790 init_service(&serviceTemp);
6792 bRetval = False;
6794 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
6796 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0) {
6797 if (iTemp == iServiceIndex) {
6798 DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue));
6799 } else {
6800 copy_service(ServicePtrs[iServiceIndex],
6801 &serviceTemp,
6802 ServicePtrs[iServiceIndex]->copymap);
6803 bRetval = True;
6805 } else {
6806 DEBUG(0, ("Unable to copy service - source not found: %s\n", pszParmValue));
6807 bRetval = False;
6810 free_service(&serviceTemp);
6811 return (bRetval);
6814 static bool handle_ldap_debug_level(int snum, const char *pszParmValue, char **ptr)
6816 Globals.ldap_debug_level = lp_int(pszParmValue);
6817 init_ldap_debugging();
6818 return true;
6821 /***************************************************************************
6822 Handle idmap/non unix account uid and gid allocation parameters. The format of these
6823 parameters is:
6825 [global]
6827 idmap uid = 1000-1999
6828 idmap gid = 700-899
6830 We only do simple parsing checks here. The strings are parsed into useful
6831 structures in the idmap daemon code.
6833 ***************************************************************************/
6835 /* Some lp_ routines to return idmap [ug]id information */
6837 static uid_t idmap_uid_low, idmap_uid_high;
6838 static gid_t idmap_gid_low, idmap_gid_high;
6840 bool lp_idmap_uid(uid_t *low, uid_t *high)
6842 if (idmap_uid_low == 0 || idmap_uid_high == 0)
6843 return False;
6845 if (low)
6846 *low = idmap_uid_low;
6848 if (high)
6849 *high = idmap_uid_high;
6851 return True;
6854 bool lp_idmap_gid(gid_t *low, gid_t *high)
6856 if (idmap_gid_low == 0 || idmap_gid_high == 0)
6857 return False;
6859 if (low)
6860 *low = idmap_gid_low;
6862 if (high)
6863 *high = idmap_gid_high;
6865 return True;
6868 /* Do some simple checks on "idmap [ug]id" parameter values */
6870 static bool handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
6872 uint32 low, high;
6874 if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
6875 return False;
6877 /* Parse OK */
6879 string_set(ptr, pszParmValue);
6881 idmap_uid_low = low;
6882 idmap_uid_high = high;
6884 return True;
6887 static bool handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
6889 uint32 low, high;
6891 if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
6892 return False;
6894 /* Parse OK */
6896 string_set(ptr, pszParmValue);
6898 idmap_gid_low = low;
6899 idmap_gid_high = high;
6901 return True;
6904 /***************************************************************************
6905 Handle the DEBUG level list.
6906 ***************************************************************************/
6908 static bool handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
6910 string_set(ptr, pszParmValueIn);
6911 return debug_parse_levels(pszParmValueIn);
6914 /***************************************************************************
6915 Handle ldap suffixes - default to ldapsuffix if sub-suffixes are not defined.
6916 ***************************************************************************/
6918 static const char *append_ldap_suffix( const char *str )
6920 const char *suffix_string;
6923 suffix_string = talloc_asprintf(talloc_tos(), "%s,%s", str,
6924 Globals.szLdapSuffix );
6925 if ( !suffix_string ) {
6926 DEBUG(0,("append_ldap_suffix: talloc_asprintf() failed!\n"));
6927 return "";
6930 return suffix_string;
6933 const char *lp_ldap_machine_suffix(void)
6935 if (Globals.szLdapMachineSuffix[0])
6936 return append_ldap_suffix(Globals.szLdapMachineSuffix);
6938 return lp_string(Globals.szLdapSuffix);
6941 const char *lp_ldap_user_suffix(void)
6943 if (Globals.szLdapUserSuffix[0])
6944 return append_ldap_suffix(Globals.szLdapUserSuffix);
6946 return lp_string(Globals.szLdapSuffix);
6949 const char *lp_ldap_group_suffix(void)
6951 if (Globals.szLdapGroupSuffix[0])
6952 return append_ldap_suffix(Globals.szLdapGroupSuffix);
6954 return lp_string(Globals.szLdapSuffix);
6957 const char *lp_ldap_idmap_suffix(void)
6959 if (Globals.szLdapIdmapSuffix[0])
6960 return append_ldap_suffix(Globals.szLdapIdmapSuffix);
6962 return lp_string(Globals.szLdapSuffix);
6965 /****************************************************************************
6966 set the value for a P_ENUM
6967 ***************************************************************************/
6969 static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue,
6970 int *ptr )
6972 int i;
6974 for (i = 0; parm->enum_list[i].name; i++) {
6975 if ( strequal(pszParmValue, parm->enum_list[i].name)) {
6976 *ptr = parm->enum_list[i].value;
6977 break;
6982 /***************************************************************************
6983 ***************************************************************************/
6985 static bool handle_printing(int snum, const char *pszParmValue, char **ptr)
6987 static int parm_num = -1;
6988 struct service *s;
6990 if ( parm_num == -1 )
6991 parm_num = map_parameter( "printing" );
6993 lp_set_enum_parm( &parm_table[parm_num], pszParmValue, (int*)ptr );
6995 if ( snum < 0 )
6996 s = &sDefault;
6997 else
6998 s = ServicePtrs[snum];
7000 init_printer_values( s );
7002 return True;
7006 /***************************************************************************
7007 Initialise a copymap.
7008 ***************************************************************************/
7010 static void init_copymap(struct service *pservice)
7012 int i;
7013 if (pservice->copymap) {
7014 bitmap_free(pservice->copymap);
7016 pservice->copymap = bitmap_allocate(NUMPARAMETERS);
7017 if (!pservice->copymap)
7018 DEBUG(0,
7019 ("Couldn't allocate copymap!! (size %d)\n",
7020 (int)NUMPARAMETERS));
7021 else
7022 for (i = 0; i < NUMPARAMETERS; i++)
7023 bitmap_set(pservice->copymap, i);
7026 /***************************************************************************
7027 Return the local pointer to a parameter given the service number and the
7028 pointer into the default structure.
7029 ***************************************************************************/
7031 void *lp_local_ptr(int snum, void *ptr)
7033 return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
7036 /***************************************************************************
7037 Process a parameter for a particular service number. If snum < 0
7038 then assume we are in the globals.
7039 ***************************************************************************/
7041 bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
7043 int parmnum, i, slen;
7044 void *parm_ptr = NULL; /* where we are going to store the result */
7045 void *def_ptr = NULL;
7046 char *param_key = NULL;
7047 char *sep;
7048 param_opt_struct *paramo, *data;
7049 bool not_added;
7051 parmnum = map_parameter(pszParmName);
7053 if (parmnum < 0) {
7054 if ((sep=strchr(pszParmName, ':')) != NULL) {
7055 TALLOC_CTX *frame = talloc_stackframe();
7057 *sep = '\0';
7058 param_key = talloc_asprintf(frame, "%s:", pszParmName);
7059 if (!param_key) {
7060 TALLOC_FREE(frame);
7061 return false;
7063 slen = strlen(param_key);
7064 param_key = talloc_asprintf_append(param_key, sep+1);
7065 if (!param_key) {
7066 TALLOC_FREE(frame);
7067 return false;
7069 trim_char(param_key+slen, ' ', ' ');
7070 not_added = True;
7071 data = (snum < 0) ? Globals.param_opt :
7072 ServicePtrs[snum]->param_opt;
7073 /* Traverse destination */
7074 while (data) {
7075 /* If we already have same option, override it */
7076 if (strcmp(data->key, param_key) == 0) {
7077 string_free(&data->value);
7078 TALLOC_FREE(data->list);
7079 data->value = SMB_STRDUP(pszParmValue);
7080 not_added = False;
7081 break;
7083 data = data->next;
7085 if (not_added) {
7086 paramo = SMB_XMALLOC_P(param_opt_struct);
7087 paramo->key = SMB_STRDUP(param_key);
7088 paramo->value = SMB_STRDUP(pszParmValue);
7089 paramo->list = NULL;
7090 if (snum < 0) {
7091 DLIST_ADD(Globals.param_opt, paramo);
7092 } else {
7093 DLIST_ADD(ServicePtrs[snum]->param_opt, paramo);
7097 *sep = ':';
7098 TALLOC_FREE(frame);
7099 return (True);
7101 DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName));
7102 return (True);
7105 if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
7106 DEBUG(1, ("WARNING: The \"%s\" option is deprecated\n",
7107 pszParmName));
7110 def_ptr = parm_table[parmnum].ptr;
7112 /* we might point at a service, the default service or a global */
7113 if (snum < 0) {
7114 parm_ptr = def_ptr;
7115 } else {
7116 if (parm_table[parmnum].p_class == P_GLOBAL) {
7117 DEBUG(0,
7118 ("Global parameter %s found in service section!\n",
7119 pszParmName));
7120 return (True);
7122 parm_ptr =
7123 ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
7124 &sDefault);
7127 if (snum >= 0) {
7128 if (!ServicePtrs[snum]->copymap)
7129 init_copymap(ServicePtrs[snum]);
7131 /* this handles the aliases - set the copymap for other entries with
7132 the same data pointer */
7133 for (i = 0; parm_table[i].label; i++)
7134 if (parm_table[i].ptr == parm_table[parmnum].ptr)
7135 bitmap_clear(ServicePtrs[snum]->copymap, i);
7138 /* if it is a special case then go ahead */
7139 if (parm_table[parmnum].special) {
7140 parm_table[parmnum].special(snum, pszParmValue, (char **)parm_ptr);
7141 return (True);
7144 /* now switch on the type of variable it is */
7145 switch (parm_table[parmnum].type)
7147 case P_BOOL:
7148 *(bool *)parm_ptr = lp_bool(pszParmValue);
7149 break;
7151 case P_BOOLREV:
7152 *(bool *)parm_ptr = !lp_bool(pszParmValue);
7153 break;
7155 case P_INTEGER:
7156 *(int *)parm_ptr = lp_int(pszParmValue);
7157 break;
7159 case P_CHAR:
7160 *(char *)parm_ptr = *pszParmValue;
7161 break;
7163 case P_OCTAL:
7164 i = sscanf(pszParmValue, "%o", (int *)parm_ptr);
7165 if ( i != 1 ) {
7166 DEBUG ( 0, ("Invalid octal number %s\n", pszParmName ));
7168 break;
7170 case P_LIST:
7171 TALLOC_FREE(*((char ***)parm_ptr));
7172 *(char ***)parm_ptr = str_list_make(
7173 NULL, pszParmValue, NULL);
7174 break;
7176 case P_STRING:
7177 string_set((char **)parm_ptr, pszParmValue);
7178 break;
7180 case P_USTRING:
7181 string_set((char **)parm_ptr, pszParmValue);
7182 strupper_m(*(char **)parm_ptr);
7183 break;
7185 case P_ENUM:
7186 lp_set_enum_parm( &parm_table[parmnum], pszParmValue, (int*)parm_ptr );
7187 break;
7188 case P_SEP:
7189 break;
7192 return (True);
7195 /***************************************************************************
7196 Process a parameter.
7197 ***************************************************************************/
7199 static bool do_parameter(const char *pszParmName, const char *pszParmValue,
7200 void *userdata)
7202 if (!bInGlobalSection && bGlobalOnly)
7203 return (True);
7205 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
7207 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
7208 pszParmName, pszParmValue));
7211 /***************************************************************************
7212 Print a parameter of the specified type.
7213 ***************************************************************************/
7215 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
7217 int i;
7218 switch (p->type)
7220 case P_ENUM:
7221 for (i = 0; p->enum_list[i].name; i++) {
7222 if (*(int *)ptr == p->enum_list[i].value) {
7223 fprintf(f, "%s",
7224 p->enum_list[i].name);
7225 break;
7228 break;
7230 case P_BOOL:
7231 fprintf(f, "%s", BOOLSTR(*(bool *)ptr));
7232 break;
7234 case P_BOOLREV:
7235 fprintf(f, "%s", BOOLSTR(!*(bool *)ptr));
7236 break;
7238 case P_INTEGER:
7239 fprintf(f, "%d", *(int *)ptr);
7240 break;
7242 case P_CHAR:
7243 fprintf(f, "%c", *(char *)ptr);
7244 break;
7246 case P_OCTAL: {
7247 char *o = octal_string(*(int *)ptr);
7248 fprintf(f, "%s", o);
7249 TALLOC_FREE(o);
7250 break;
7253 case P_LIST:
7254 if ((char ***)ptr && *(char ***)ptr) {
7255 char **list = *(char ***)ptr;
7256 for (; *list; list++) {
7257 /* surround strings with whitespace in double quotes */
7258 if ( strchr_m( *list, ' ' ) )
7259 fprintf(f, "\"%s\"%s", *list, ((*(list+1))?", ":""));
7260 else
7261 fprintf(f, "%s%s", *list, ((*(list+1))?", ":""));
7264 break;
7266 case P_STRING:
7267 case P_USTRING:
7268 if (*(char **)ptr) {
7269 fprintf(f, "%s", *(char **)ptr);
7271 break;
7272 case P_SEP:
7273 break;
7277 /***************************************************************************
7278 Check if two parameters are equal.
7279 ***************************************************************************/
7281 static bool equal_parameter(parm_type type, void *ptr1, void *ptr2)
7283 switch (type) {
7284 case P_BOOL:
7285 case P_BOOLREV:
7286 return (*((bool *)ptr1) == *((bool *)ptr2));
7288 case P_INTEGER:
7289 case P_ENUM:
7290 case P_OCTAL:
7291 return (*((int *)ptr1) == *((int *)ptr2));
7293 case P_CHAR:
7294 return (*((char *)ptr1) == *((char *)ptr2));
7296 case P_LIST:
7297 return str_list_compare(*(char ***)ptr1, *(char ***)ptr2);
7299 case P_STRING:
7300 case P_USTRING:
7302 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
7303 if (p1 && !*p1)
7304 p1 = NULL;
7305 if (p2 && !*p2)
7306 p2 = NULL;
7307 return (p1 == p2 || strequal(p1, p2));
7309 case P_SEP:
7310 break;
7312 return (False);
7315 /***************************************************************************
7316 Initialize any local varients in the sDefault table.
7317 ***************************************************************************/
7319 void init_locals(void)
7321 /* None as yet. */
7324 /***************************************************************************
7325 Process a new section (service). At this stage all sections are services.
7326 Later we'll have special sections that permit server parameters to be set.
7327 Returns True on success, False on failure.
7328 ***************************************************************************/
7330 static bool do_section(const char *pszSectionName, void *userdata)
7332 bool bRetval;
7333 bool isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
7334 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
7335 bRetval = False;
7337 /* if we were in a global section then do the local inits */
7338 if (bInGlobalSection && !isglobal)
7339 init_locals();
7341 /* if we've just struck a global section, note the fact. */
7342 bInGlobalSection = isglobal;
7344 /* check for multiple global sections */
7345 if (bInGlobalSection) {
7346 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
7347 return (True);
7350 if (!bInGlobalSection && bGlobalOnly)
7351 return (True);
7353 /* if we have a current service, tidy it up before moving on */
7354 bRetval = True;
7356 if (iServiceIndex >= 0)
7357 bRetval = service_ok(iServiceIndex);
7359 /* if all is still well, move to the next record in the services array */
7360 if (bRetval) {
7361 /* We put this here to avoid an odd message order if messages are */
7362 /* issued by the post-processing of a previous section. */
7363 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
7365 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
7366 < 0) {
7367 DEBUG(0, ("Failed to add a new service\n"));
7368 return (False);
7372 return (bRetval);
7376 /***************************************************************************
7377 Determine if a partcular base parameter is currentl set to the default value.
7378 ***************************************************************************/
7380 static bool is_default(int i)
7382 if (!defaults_saved)
7383 return False;
7384 switch (parm_table[i].type) {
7385 case P_LIST:
7386 return str_list_compare (parm_table[i].def.lvalue,
7387 *(char ***)parm_table[i].ptr);
7388 case P_STRING:
7389 case P_USTRING:
7390 return strequal(parm_table[i].def.svalue,
7391 *(char **)parm_table[i].ptr);
7392 case P_BOOL:
7393 case P_BOOLREV:
7394 return parm_table[i].def.bvalue ==
7395 *(bool *)parm_table[i].ptr;
7396 case P_CHAR:
7397 return parm_table[i].def.cvalue ==
7398 *(char *)parm_table[i].ptr;
7399 case P_INTEGER:
7400 case P_OCTAL:
7401 case P_ENUM:
7402 return parm_table[i].def.ivalue ==
7403 *(int *)parm_table[i].ptr;
7404 case P_SEP:
7405 break;
7407 return False;
7410 /***************************************************************************
7411 Display the contents of the global structure.
7412 ***************************************************************************/
7414 static void dump_globals(FILE *f)
7416 int i;
7417 param_opt_struct *data;
7419 fprintf(f, "[global]\n");
7421 for (i = 0; parm_table[i].label; i++)
7422 if (parm_table[i].p_class == P_GLOBAL &&
7423 parm_table[i].ptr &&
7424 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
7425 if (defaults_saved && is_default(i))
7426 continue;
7427 fprintf(f, "\t%s = ", parm_table[i].label);
7428 print_parameter(&parm_table[i], parm_table[i].ptr, f);
7429 fprintf(f, "\n");
7431 if (Globals.param_opt != NULL) {
7432 data = Globals.param_opt;
7433 while(data) {
7434 fprintf(f, "\t%s = %s\n", data->key, data->value);
7435 data = data->next;
7441 /***************************************************************************
7442 Return True if a local parameter is currently set to the global default.
7443 ***************************************************************************/
7445 bool lp_is_default(int snum, struct parm_struct *parm)
7447 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
7449 return equal_parameter(parm->type,
7450 ((char *)ServicePtrs[snum]) + pdiff,
7451 ((char *)&sDefault) + pdiff);
7454 /***************************************************************************
7455 Display the contents of a single services record.
7456 ***************************************************************************/
7458 static void dump_a_service(struct service *pService, FILE * f)
7460 int i;
7461 param_opt_struct *data;
7463 if (pService != &sDefault)
7464 fprintf(f, "[%s]\n", pService->szService);
7466 for (i = 0; parm_table[i].label; i++) {
7468 if (parm_table[i].p_class == P_LOCAL &&
7469 parm_table[i].ptr &&
7470 (*parm_table[i].label != '-') &&
7471 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
7474 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
7476 if (pService == &sDefault) {
7477 if (defaults_saved && is_default(i))
7478 continue;
7479 } else {
7480 if (equal_parameter(parm_table[i].type,
7481 ((char *)pService) +
7482 pdiff,
7483 ((char *)&sDefault) +
7484 pdiff))
7485 continue;
7488 fprintf(f, "\t%s = ", parm_table[i].label);
7489 print_parameter(&parm_table[i],
7490 ((char *)pService) + pdiff, f);
7491 fprintf(f, "\n");
7495 if (pService->param_opt != NULL) {
7496 data = pService->param_opt;
7497 while(data) {
7498 fprintf(f, "\t%s = %s\n", data->key, data->value);
7499 data = data->next;
7504 /***************************************************************************
7505 Display the contents of a parameter of a single services record.
7506 ***************************************************************************/
7508 bool dump_a_parameter(int snum, char *parm_name, FILE * f, bool isGlobal)
7510 int i;
7511 bool result = False;
7512 parm_class p_class;
7513 unsigned flag = 0;
7514 fstring local_parm_name;
7515 char *parm_opt;
7516 const char *parm_opt_value;
7518 /* check for parametrical option */
7519 fstrcpy( local_parm_name, parm_name);
7520 parm_opt = strchr( local_parm_name, ':');
7522 if (parm_opt) {
7523 *parm_opt = '\0';
7524 parm_opt++;
7525 if (strlen(parm_opt)) {
7526 parm_opt_value = lp_parm_const_string( snum,
7527 local_parm_name, parm_opt, NULL);
7528 if (parm_opt_value) {
7529 printf( "%s\n", parm_opt_value);
7530 result = True;
7533 return result;
7536 /* check for a key and print the value */
7537 if (isGlobal) {
7538 p_class = P_GLOBAL;
7539 flag = FLAG_GLOBAL;
7540 } else
7541 p_class = P_LOCAL;
7543 for (i = 0; parm_table[i].label; i++) {
7544 if (strwicmp(parm_table[i].label, parm_name) == 0 &&
7545 (parm_table[i].p_class == p_class || parm_table[i].flags & flag) &&
7546 parm_table[i].ptr &&
7547 (*parm_table[i].label != '-') &&
7548 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
7550 void *ptr;
7552 if (isGlobal) {
7553 ptr = parm_table[i].ptr;
7554 } else {
7555 struct service *pService = ServicePtrs[snum];
7556 ptr = ((char *)pService) +
7557 PTR_DIFF(parm_table[i].ptr, &sDefault);
7560 print_parameter(&parm_table[i],
7561 ptr, f);
7562 fprintf(f, "\n");
7563 result = True;
7564 break;
7568 return result;
7571 /***************************************************************************
7572 Return info about the requested parameter (given as a string).
7573 Return NULL when the string is not a valid parameter name.
7574 ***************************************************************************/
7576 struct parm_struct *lp_get_parameter(const char *param_name)
7578 int num = map_parameter(param_name);
7580 if (num < 0) {
7581 return NULL;
7584 return &parm_table[num];
7587 /***************************************************************************
7588 Return info about the next parameter in a service.
7589 snum==GLOBAL_SECTION_SNUM gives the globals.
7590 Return NULL when out of parameters.
7591 ***************************************************************************/
7593 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
7595 if (snum < 0) {
7596 /* do the globals */
7597 for (; parm_table[*i].label; (*i)++) {
7598 if (parm_table[*i].p_class == P_SEPARATOR)
7599 return &parm_table[(*i)++];
7601 if (!parm_table[*i].ptr
7602 || (*parm_table[*i].label == '-'))
7603 continue;
7605 if ((*i) > 0
7606 && (parm_table[*i].ptr ==
7607 parm_table[(*i) - 1].ptr))
7608 continue;
7610 if (is_default(*i) && !allparameters)
7611 continue;
7613 return &parm_table[(*i)++];
7615 } else {
7616 struct service *pService = ServicePtrs[snum];
7618 for (; parm_table[*i].label; (*i)++) {
7619 if (parm_table[*i].p_class == P_SEPARATOR)
7620 return &parm_table[(*i)++];
7622 if (parm_table[*i].p_class == P_LOCAL &&
7623 parm_table[*i].ptr &&
7624 (*parm_table[*i].label != '-') &&
7625 ((*i) == 0 ||
7626 (parm_table[*i].ptr !=
7627 parm_table[(*i) - 1].ptr)))
7629 int pdiff =
7630 PTR_DIFF(parm_table[*i].ptr,
7631 &sDefault);
7633 if (allparameters ||
7634 !equal_parameter(parm_table[*i].type,
7635 ((char *)pService) +
7636 pdiff,
7637 ((char *)&sDefault) +
7638 pdiff))
7640 return &parm_table[(*i)++];
7646 return NULL;
7650 #if 0
7651 /***************************************************************************
7652 Display the contents of a single copy structure.
7653 ***************************************************************************/
7654 static void dump_copy_map(bool *pcopymap)
7656 int i;
7657 if (!pcopymap)
7658 return;
7660 printf("\n\tNon-Copied parameters:\n");
7662 for (i = 0; parm_table[i].label; i++)
7663 if (parm_table[i].p_class == P_LOCAL &&
7664 parm_table[i].ptr && !pcopymap[i] &&
7665 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
7667 printf("\t\t%s\n", parm_table[i].label);
7670 #endif
7672 /***************************************************************************
7673 Return TRUE if the passed service number is within range.
7674 ***************************************************************************/
7676 bool lp_snum_ok(int iService)
7678 return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
7681 /***************************************************************************
7682 Auto-load some home services.
7683 ***************************************************************************/
7685 static void lp_add_auto_services(char *str)
7687 char *s;
7688 char *p;
7689 int homes;
7690 char *saveptr;
7692 if (!str)
7693 return;
7695 s = SMB_STRDUP(str);
7696 if (!s)
7697 return;
7699 homes = lp_servicenumber(HOMES_NAME);
7701 for (p = strtok_r(s, LIST_SEP, &saveptr); p;
7702 p = strtok_r(NULL, LIST_SEP, &saveptr)) {
7703 char *home;
7705 if (lp_servicenumber(p) >= 0)
7706 continue;
7708 home = get_user_home_dir(talloc_tos(), p);
7710 if (home && homes >= 0)
7711 lp_add_home(p, homes, p, home);
7713 TALLOC_FREE(home);
7715 SAFE_FREE(s);
7718 /***************************************************************************
7719 Auto-load one printer.
7720 ***************************************************************************/
7722 void lp_add_one_printer(char *name, char *comment)
7724 int printers = lp_servicenumber(PRINTERS_NAME);
7725 int i;
7727 if (lp_servicenumber(name) < 0) {
7728 lp_add_printer(name, printers);
7729 if ((i = lp_servicenumber(name)) >= 0) {
7730 string_set(&ServicePtrs[i]->comment, comment);
7731 ServicePtrs[i]->autoloaded = True;
7736 /***************************************************************************
7737 Have we loaded a services file yet?
7738 ***************************************************************************/
7740 bool lp_loaded(void)
7742 return (bLoaded);
7745 /***************************************************************************
7746 Unload unused services.
7747 ***************************************************************************/
7749 void lp_killunused(bool (*snumused) (int))
7751 int i;
7752 for (i = 0; i < iNumServices; i++) {
7753 if (!VALID(i))
7754 continue;
7756 /* don't kill autoloaded or usershare services */
7757 if ( ServicePtrs[i]->autoloaded ||
7758 ServicePtrs[i]->usershare == USERSHARE_VALID) {
7759 continue;
7762 if (!snumused || !snumused(i)) {
7763 free_service_byindex(i);
7769 * Kill all except autoloaded and usershare services - convenience wrapper
7771 void lp_kill_all_services(void)
7773 lp_killunused(NULL);
7776 /***************************************************************************
7777 Unload a service.
7778 ***************************************************************************/
7780 void lp_killservice(int iServiceIn)
7782 if (VALID(iServiceIn)) {
7783 free_service_byindex(iServiceIn);
7787 /***************************************************************************
7788 Save the curent values of all global and sDefault parameters into the
7789 defaults union. This allows swat and testparm to show only the
7790 changed (ie. non-default) parameters.
7791 ***************************************************************************/
7793 static void lp_save_defaults(void)
7795 int i;
7796 for (i = 0; parm_table[i].label; i++) {
7797 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
7798 continue;
7799 switch (parm_table[i].type) {
7800 case P_LIST:
7801 str_list_copy(
7802 NULL, &(parm_table[i].def.lvalue),
7803 *(const char ***)parm_table[i].ptr);
7804 break;
7805 case P_STRING:
7806 case P_USTRING:
7807 if (parm_table[i].ptr) {
7808 parm_table[i].def.svalue = SMB_STRDUP(*(char **)parm_table[i].ptr);
7809 } else {
7810 parm_table[i].def.svalue = NULL;
7812 break;
7813 case P_BOOL:
7814 case P_BOOLREV:
7815 parm_table[i].def.bvalue =
7816 *(bool *)parm_table[i].ptr;
7817 break;
7818 case P_CHAR:
7819 parm_table[i].def.cvalue =
7820 *(char *)parm_table[i].ptr;
7821 break;
7822 case P_INTEGER:
7823 case P_OCTAL:
7824 case P_ENUM:
7825 parm_table[i].def.ivalue =
7826 *(int *)parm_table[i].ptr;
7827 break;
7828 case P_SEP:
7829 break;
7832 defaults_saved = True;
7835 /*******************************************************************
7836 Set the server type we will announce as via nmbd.
7837 ********************************************************************/
7839 static const struct srv_role_tab {
7840 uint32 role;
7841 const char *role_str;
7842 } srv_role_tab [] = {
7843 { ROLE_STANDALONE, "ROLE_STANDALONE" },
7844 { ROLE_DOMAIN_MEMBER, "ROLE_DOMAIN_MEMBER" },
7845 { ROLE_DOMAIN_BDC, "ROLE_DOMAIN_BDC" },
7846 { ROLE_DOMAIN_PDC, "ROLE_DOMAIN_PDC" },
7847 { 0, NULL }
7850 const char* server_role_str(uint32 role)
7852 int i = 0;
7853 for (i=0; srv_role_tab[i].role_str; i++) {
7854 if (role == srv_role_tab[i].role) {
7855 return srv_role_tab[i].role_str;
7858 return NULL;
7861 static void set_server_role(void)
7863 server_role = ROLE_STANDALONE;
7865 switch (lp_security()) {
7866 case SEC_SHARE:
7867 if (lp_domain_logons())
7868 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
7869 break;
7870 case SEC_SERVER:
7871 if (lp_domain_logons())
7872 DEBUG(0, ("Server's Role (logon server) conflicts with server-level security\n"));
7873 /* this used to be considered ROLE_DOMAIN_MEMBER but that's just wrong */
7874 server_role = ROLE_STANDALONE;
7875 break;
7876 case SEC_DOMAIN:
7877 if (lp_domain_logons()) {
7878 DEBUG(1, ("Server's Role (logon server) NOT ADVISED with domain-level security\n"));
7879 server_role = ROLE_DOMAIN_BDC;
7880 break;
7882 server_role = ROLE_DOMAIN_MEMBER;
7883 break;
7884 case SEC_ADS:
7885 if (lp_domain_logons()) {
7886 server_role = ROLE_DOMAIN_PDC;
7887 break;
7889 server_role = ROLE_DOMAIN_MEMBER;
7890 break;
7891 case SEC_USER:
7892 if (lp_domain_logons()) {
7894 if (Globals.iDomainMaster) /* auto or yes */
7895 server_role = ROLE_DOMAIN_PDC;
7896 else
7897 server_role = ROLE_DOMAIN_BDC;
7899 break;
7900 default:
7901 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
7902 break;
7905 DEBUG(10, ("set_server_role: role = %s\n", server_role_str(server_role)));
7908 /***********************************************************
7909 If we should send plaintext/LANMAN passwords in the clinet
7910 ************************************************************/
7912 static void set_allowed_client_auth(void)
7914 if (Globals.bClientNTLMv2Auth) {
7915 Globals.bClientLanManAuth = False;
7917 if (!Globals.bClientLanManAuth) {
7918 Globals.bClientPlaintextAuth = False;
7922 /***************************************************************************
7923 JRA.
7924 The following code allows smbd to read a user defined share file.
7925 Yes, this is my intent. Yes, I'm comfortable with that...
7927 THE FOLLOWING IS SECURITY CRITICAL CODE.
7929 It washes your clothes, it cleans your house, it guards you while you sleep...
7930 Do not f%^k with it....
7931 ***************************************************************************/
7933 #define MAX_USERSHARE_FILE_SIZE (10*1024)
7935 /***************************************************************************
7936 Check allowed stat state of a usershare file.
7937 Ensure we print out who is dicking with us so the admin can
7938 get their sorry ass fired.
7939 ***************************************************************************/
7941 static bool check_usershare_stat(const char *fname, SMB_STRUCT_STAT *psbuf)
7943 if (!S_ISREG(psbuf->st_mode)) {
7944 DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
7945 "not a regular file\n",
7946 fname, (unsigned int)psbuf->st_uid ));
7947 return False;
7950 /* Ensure this doesn't have the other write bit set. */
7951 if (psbuf->st_mode & S_IWOTH) {
7952 DEBUG(0,("check_usershare_stat: file %s owned by uid %u allows "
7953 "public write. Refusing to allow as a usershare file.\n",
7954 fname, (unsigned int)psbuf->st_uid ));
7955 return False;
7958 /* Should be 10k or less. */
7959 if (psbuf->st_size > MAX_USERSHARE_FILE_SIZE) {
7960 DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
7961 "too large (%u) to be a user share file.\n",
7962 fname, (unsigned int)psbuf->st_uid,
7963 (unsigned int)psbuf->st_size ));
7964 return False;
7967 return True;
7970 /***************************************************************************
7971 Parse the contents of a usershare file.
7972 ***************************************************************************/
7974 enum usershare_err parse_usershare_file(TALLOC_CTX *ctx,
7975 SMB_STRUCT_STAT *psbuf,
7976 const char *servicename,
7977 int snum,
7978 char **lines,
7979 int numlines,
7980 char **pp_sharepath,
7981 char **pp_comment,
7982 SEC_DESC **ppsd,
7983 bool *pallow_guest)
7985 const char **prefixallowlist = lp_usershare_prefix_allow_list();
7986 const char **prefixdenylist = lp_usershare_prefix_deny_list();
7987 int us_vers;
7988 SMB_STRUCT_DIR *dp;
7989 SMB_STRUCT_STAT sbuf;
7990 char *sharepath = NULL;
7991 char *comment = NULL;
7993 *pp_sharepath = NULL;
7994 *pp_comment = NULL;
7996 *pallow_guest = False;
7998 if (numlines < 4) {
7999 return USERSHARE_MALFORMED_FILE;
8002 if (strcmp(lines[0], "#VERSION 1") == 0) {
8003 us_vers = 1;
8004 } else if (strcmp(lines[0], "#VERSION 2") == 0) {
8005 us_vers = 2;
8006 if (numlines < 5) {
8007 return USERSHARE_MALFORMED_FILE;
8009 } else {
8010 return USERSHARE_BAD_VERSION;
8013 if (strncmp(lines[1], "path=", 5) != 0) {
8014 return USERSHARE_MALFORMED_PATH;
8017 sharepath = talloc_strdup(ctx, &lines[1][5]);
8018 if (!sharepath) {
8019 return USERSHARE_POSIX_ERR;
8021 trim_string(sharepath, " ", " ");
8023 if (strncmp(lines[2], "comment=", 8) != 0) {
8024 return USERSHARE_MALFORMED_COMMENT_DEF;
8027 comment = talloc_strdup(ctx, &lines[2][8]);
8028 if (!comment) {
8029 return USERSHARE_POSIX_ERR;
8031 trim_string(comment, " ", " ");
8032 trim_char(comment, '"', '"');
8034 if (strncmp(lines[3], "usershare_acl=", 14) != 0) {
8035 return USERSHARE_MALFORMED_ACL_DEF;
8038 if (!parse_usershare_acl(ctx, &lines[3][14], ppsd)) {
8039 return USERSHARE_ACL_ERR;
8042 if (us_vers == 2) {
8043 if (strncmp(lines[4], "guest_ok=", 9) != 0) {
8044 return USERSHARE_MALFORMED_ACL_DEF;
8046 if (lines[4][9] == 'y') {
8047 *pallow_guest = True;
8051 if (snum != -1 && (strcmp(sharepath, ServicePtrs[snum]->szPath) == 0)) {
8052 /* Path didn't change, no checks needed. */
8053 *pp_sharepath = sharepath;
8054 *pp_comment = comment;
8055 return USERSHARE_OK;
8058 /* The path *must* be absolute. */
8059 if (sharepath[0] != '/') {
8060 DEBUG(2,("parse_usershare_file: share %s: path %s is not an absolute path.\n",
8061 servicename, sharepath));
8062 return USERSHARE_PATH_NOT_ABSOLUTE;
8065 /* If there is a usershare prefix deny list ensure one of these paths
8066 doesn't match the start of the user given path. */
8067 if (prefixdenylist) {
8068 int i;
8069 for ( i=0; prefixdenylist[i]; i++ ) {
8070 DEBUG(10,("parse_usershare_file: share %s : checking prefixdenylist[%d]='%s' against %s\n",
8071 servicename, i, prefixdenylist[i], sharepath ));
8072 if (memcmp( sharepath, prefixdenylist[i], strlen(prefixdenylist[i])) == 0) {
8073 DEBUG(2,("parse_usershare_file: share %s path %s starts with one of the "
8074 "usershare prefix deny list entries.\n",
8075 servicename, sharepath));
8076 return USERSHARE_PATH_IS_DENIED;
8081 /* If there is a usershare prefix allow list ensure one of these paths
8082 does match the start of the user given path. */
8084 if (prefixallowlist) {
8085 int i;
8086 for ( i=0; prefixallowlist[i]; i++ ) {
8087 DEBUG(10,("parse_usershare_file: share %s checking prefixallowlist[%d]='%s' against %s\n",
8088 servicename, i, prefixallowlist[i], sharepath ));
8089 if (memcmp( sharepath, prefixallowlist[i], strlen(prefixallowlist[i])) == 0) {
8090 break;
8093 if (prefixallowlist[i] == NULL) {
8094 DEBUG(2,("parse_usershare_file: share %s path %s doesn't start with one of the "
8095 "usershare prefix allow list entries.\n",
8096 servicename, sharepath));
8097 return USERSHARE_PATH_NOT_ALLOWED;
8101 /* Ensure this is pointing to a directory. */
8102 dp = sys_opendir(sharepath);
8104 if (!dp) {
8105 DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
8106 servicename, sharepath));
8107 return USERSHARE_PATH_NOT_DIRECTORY;
8110 /* Ensure the owner of the usershare file has permission to share
8111 this directory. */
8113 if (sys_stat(sharepath, &sbuf) == -1) {
8114 DEBUG(2,("parse_usershare_file: share %s : stat failed on path %s. %s\n",
8115 servicename, sharepath, strerror(errno) ));
8116 sys_closedir(dp);
8117 return USERSHARE_POSIX_ERR;
8120 sys_closedir(dp);
8122 if (!S_ISDIR(sbuf.st_mode)) {
8123 DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
8124 servicename, sharepath ));
8125 return USERSHARE_PATH_NOT_DIRECTORY;
8128 /* Check if sharing is restricted to owner-only. */
8129 /* psbuf is the stat of the usershare definition file,
8130 sbuf is the stat of the target directory to be shared. */
8132 if (lp_usershare_owner_only()) {
8133 /* root can share anything. */
8134 if ((psbuf->st_uid != 0) && (sbuf.st_uid != psbuf->st_uid)) {
8135 return USERSHARE_PATH_NOT_ALLOWED;
8139 *pp_sharepath = sharepath;
8140 *pp_comment = comment;
8141 return USERSHARE_OK;
8144 /***************************************************************************
8145 Deal with a usershare file.
8146 Returns:
8147 >= 0 - snum
8148 -1 - Bad name, invalid contents.
8149 - service name already existed and not a usershare, problem
8150 with permissions to share directory etc.
8151 ***************************************************************************/
8153 static int process_usershare_file(const char *dir_name, const char *file_name, int snum_template)
8155 SMB_STRUCT_STAT sbuf;
8156 SMB_STRUCT_STAT lsbuf;
8157 char *fname = NULL;
8158 char *sharepath = NULL;
8159 char *comment = NULL;
8160 fstring service_name;
8161 char **lines = NULL;
8162 int numlines = 0;
8163 int fd = -1;
8164 int iService = -1;
8165 TALLOC_CTX *ctx = NULL;
8166 SEC_DESC *psd = NULL;
8167 bool guest_ok = False;
8169 /* Ensure share name doesn't contain invalid characters. */
8170 if (!validate_net_name(file_name, INVALID_SHARENAME_CHARS, strlen(file_name))) {
8171 DEBUG(0,("process_usershare_file: share name %s contains "
8172 "invalid characters (any of %s)\n",
8173 file_name, INVALID_SHARENAME_CHARS ));
8174 return -1;
8177 fstrcpy(service_name, file_name);
8179 if (asprintf(&fname, "%s/%s", dir_name, file_name) < 0) {
8182 /* Minimize the race condition by doing an lstat before we
8183 open and fstat. Ensure this isn't a symlink link. */
8185 if (sys_lstat(fname, &lsbuf) != 0) {
8186 DEBUG(0,("process_usershare_file: stat of %s failed. %s\n",
8187 fname, strerror(errno) ));
8188 SAFE_FREE(fname);
8189 return -1;
8192 /* This must be a regular file, not a symlink, directory or
8193 other strange filetype. */
8194 if (!check_usershare_stat(fname, &lsbuf)) {
8195 SAFE_FREE(fname);
8196 return -1;
8200 char *canon_name = canonicalize_servicename(service_name);
8201 TDB_DATA data = dbwrap_fetch_bystring(
8202 ServiceHash, canon_name, canon_name);
8204 iService = -1;
8206 if ((data.dptr != NULL) && (data.dsize == sizeof(iService))) {
8207 iService = *(int *)data.dptr;
8209 TALLOC_FREE(canon_name);
8212 if (iService != -1 && ServicePtrs[iService]->usershare_last_mod == lsbuf.st_mtime) {
8213 /* Nothing changed - Mark valid and return. */
8214 DEBUG(10,("process_usershare_file: service %s not changed.\n",
8215 service_name ));
8216 ServicePtrs[iService]->usershare = USERSHARE_VALID;
8217 SAFE_FREE(fname);
8218 return iService;
8221 /* Try and open the file read only - no symlinks allowed. */
8222 #ifdef O_NOFOLLOW
8223 fd = sys_open(fname, O_RDONLY|O_NOFOLLOW, 0);
8224 #else
8225 fd = sys_open(fname, O_RDONLY, 0);
8226 #endif
8228 if (fd == -1) {
8229 DEBUG(0,("process_usershare_file: unable to open %s. %s\n",
8230 fname, strerror(errno) ));
8231 SAFE_FREE(fname);
8232 return -1;
8235 /* Now fstat to be *SURE* it's a regular file. */
8236 if (sys_fstat(fd, &sbuf) != 0) {
8237 close(fd);
8238 DEBUG(0,("process_usershare_file: fstat of %s failed. %s\n",
8239 fname, strerror(errno) ));
8240 SAFE_FREE(fname);
8241 return -1;
8244 /* Is it the same dev/inode as was lstated ? */
8245 if (lsbuf.st_dev != sbuf.st_dev || lsbuf.st_ino != sbuf.st_ino) {
8246 close(fd);
8247 DEBUG(0,("process_usershare_file: fstat of %s is a different file from lstat. "
8248 "Symlink spoofing going on ?\n", fname ));
8249 SAFE_FREE(fname);
8250 return -1;
8253 /* This must be a regular file, not a symlink, directory or
8254 other strange filetype. */
8255 if (!check_usershare_stat(fname, &sbuf)) {
8256 SAFE_FREE(fname);
8257 return -1;
8260 lines = fd_lines_load(fd, &numlines, MAX_USERSHARE_FILE_SIZE);
8262 close(fd);
8263 if (lines == NULL) {
8264 DEBUG(0,("process_usershare_file: loading file %s owned by %u failed.\n",
8265 fname, (unsigned int)sbuf.st_uid ));
8266 SAFE_FREE(fname);
8267 return -1;
8270 SAFE_FREE(fname);
8272 /* Should we allow printers to be shared... ? */
8273 ctx = talloc_init("usershare_sd_xctx");
8274 if (!ctx) {
8275 file_lines_free(lines);
8276 return 1;
8279 if (parse_usershare_file(ctx, &sbuf, service_name,
8280 iService, lines, numlines, &sharepath,
8281 &comment, &psd, &guest_ok) != USERSHARE_OK) {
8282 talloc_destroy(ctx);
8283 file_lines_free(lines);
8284 return -1;
8287 file_lines_free(lines);
8289 /* Everything ok - add the service possibly using a template. */
8290 if (iService < 0) {
8291 const struct service *sp = &sDefault;
8292 if (snum_template != -1) {
8293 sp = ServicePtrs[snum_template];
8296 if ((iService = add_a_service(sp, service_name)) < 0) {
8297 DEBUG(0, ("process_usershare_file: Failed to add "
8298 "new service %s\n", service_name));
8299 talloc_destroy(ctx);
8300 return -1;
8303 /* Read only is controlled by usershare ACL below. */
8304 ServicePtrs[iService]->bRead_only = False;
8307 /* Write the ACL of the new/modified share. */
8308 if (!set_share_security(service_name, psd)) {
8309 DEBUG(0, ("process_usershare_file: Failed to set share "
8310 "security for user share %s\n",
8311 service_name ));
8312 lp_remove_service(iService);
8313 talloc_destroy(ctx);
8314 return -1;
8317 /* If from a template it may be marked invalid. */
8318 ServicePtrs[iService]->valid = True;
8320 /* Set the service as a valid usershare. */
8321 ServicePtrs[iService]->usershare = USERSHARE_VALID;
8323 /* Set guest access. */
8324 if (lp_usershare_allow_guests()) {
8325 ServicePtrs[iService]->bGuest_ok = guest_ok;
8328 /* And note when it was loaded. */
8329 ServicePtrs[iService]->usershare_last_mod = sbuf.st_mtime;
8330 string_set(&ServicePtrs[iService]->szPath, sharepath);
8331 string_set(&ServicePtrs[iService]->comment, comment);
8333 talloc_destroy(ctx);
8335 return iService;
8338 /***************************************************************************
8339 Checks if a usershare entry has been modified since last load.
8340 ***************************************************************************/
8342 static bool usershare_exists(int iService, time_t *last_mod)
8344 SMB_STRUCT_STAT lsbuf;
8345 const char *usersharepath = Globals.szUsersharePath;
8346 char *fname;
8348 if (asprintf(&fname, "%s/%s",
8349 usersharepath,
8350 ServicePtrs[iService]->szService) < 0) {
8351 return false;
8354 if (sys_lstat(fname, &lsbuf) != 0) {
8355 SAFE_FREE(fname);
8356 return false;
8359 if (!S_ISREG(lsbuf.st_mode)) {
8360 SAFE_FREE(fname);
8361 return false;
8364 SAFE_FREE(fname);
8365 *last_mod = lsbuf.st_mtime;
8366 return true;
8369 /***************************************************************************
8370 Load a usershare service by name. Returns a valid servicenumber or -1.
8371 ***************************************************************************/
8373 int load_usershare_service(const char *servicename)
8375 SMB_STRUCT_STAT sbuf;
8376 const char *usersharepath = Globals.szUsersharePath;
8377 int max_user_shares = Globals.iUsershareMaxShares;
8378 int snum_template = -1;
8380 if (*usersharepath == 0 || max_user_shares == 0) {
8381 return -1;
8384 if (sys_stat(usersharepath, &sbuf) != 0) {
8385 DEBUG(0,("load_usershare_service: stat of %s failed. %s\n",
8386 usersharepath, strerror(errno) ));
8387 return -1;
8390 if (!S_ISDIR(sbuf.st_mode)) {
8391 DEBUG(0,("load_usershare_service: %s is not a directory.\n",
8392 usersharepath ));
8393 return -1;
8397 * This directory must be owned by root, and have the 't' bit set.
8398 * It also must not be writable by "other".
8401 #ifdef S_ISVTX
8402 if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
8403 #else
8404 if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
8405 #endif
8406 DEBUG(0,("load_usershare_service: directory %s is not owned by root "
8407 "or does not have the sticky bit 't' set or is writable by anyone.\n",
8408 usersharepath ));
8409 return -1;
8412 /* Ensure the template share exists if it's set. */
8413 if (Globals.szUsershareTemplateShare[0]) {
8414 /* We can't use lp_servicenumber here as we are recommending that
8415 template shares have -valid=False set. */
8416 for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
8417 if (ServicePtrs[snum_template]->szService &&
8418 strequal(ServicePtrs[snum_template]->szService,
8419 Globals.szUsershareTemplateShare)) {
8420 break;
8424 if (snum_template == -1) {
8425 DEBUG(0,("load_usershare_service: usershare template share %s "
8426 "does not exist.\n",
8427 Globals.szUsershareTemplateShare ));
8428 return -1;
8432 return process_usershare_file(usersharepath, servicename, snum_template);
8435 /***************************************************************************
8436 Load all user defined shares from the user share directory.
8437 We only do this if we're enumerating the share list.
8438 This is the function that can delete usershares that have
8439 been removed.
8440 ***************************************************************************/
8442 int load_usershare_shares(void)
8444 SMB_STRUCT_DIR *dp;
8445 SMB_STRUCT_STAT sbuf;
8446 SMB_STRUCT_DIRENT *de;
8447 int num_usershares = 0;
8448 int max_user_shares = Globals.iUsershareMaxShares;
8449 unsigned int num_dir_entries, num_bad_dir_entries, num_tmp_dir_entries;
8450 unsigned int allowed_bad_entries = ((2*max_user_shares)/10);
8451 unsigned int allowed_tmp_entries = ((2*max_user_shares)/10);
8452 int iService;
8453 int snum_template = -1;
8454 const char *usersharepath = Globals.szUsersharePath;
8455 int ret = lp_numservices();
8457 if (max_user_shares == 0 || *usersharepath == '\0') {
8458 return lp_numservices();
8461 if (sys_stat(usersharepath, &sbuf) != 0) {
8462 DEBUG(0,("load_usershare_shares: stat of %s failed. %s\n",
8463 usersharepath, strerror(errno) ));
8464 return ret;
8468 * This directory must be owned by root, and have the 't' bit set.
8469 * It also must not be writable by "other".
8472 #ifdef S_ISVTX
8473 if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
8474 #else
8475 if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
8476 #endif
8477 DEBUG(0,("load_usershare_shares: directory %s is not owned by root "
8478 "or does not have the sticky bit 't' set or is writable by anyone.\n",
8479 usersharepath ));
8480 return ret;
8483 /* Ensure the template share exists if it's set. */
8484 if (Globals.szUsershareTemplateShare[0]) {
8485 /* We can't use lp_servicenumber here as we are recommending that
8486 template shares have -valid=False set. */
8487 for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
8488 if (ServicePtrs[snum_template]->szService &&
8489 strequal(ServicePtrs[snum_template]->szService,
8490 Globals.szUsershareTemplateShare)) {
8491 break;
8495 if (snum_template == -1) {
8496 DEBUG(0,("load_usershare_shares: usershare template share %s "
8497 "does not exist.\n",
8498 Globals.szUsershareTemplateShare ));
8499 return ret;
8503 /* Mark all existing usershares as pending delete. */
8504 for (iService = iNumServices - 1; iService >= 0; iService--) {
8505 if (VALID(iService) && ServicePtrs[iService]->usershare) {
8506 ServicePtrs[iService]->usershare = USERSHARE_PENDING_DELETE;
8510 dp = sys_opendir(usersharepath);
8511 if (!dp) {
8512 DEBUG(0,("load_usershare_shares:: failed to open directory %s. %s\n",
8513 usersharepath, strerror(errno) ));
8514 return ret;
8517 for (num_dir_entries = 0, num_bad_dir_entries = 0, num_tmp_dir_entries = 0;
8518 (de = sys_readdir(dp));
8519 num_dir_entries++ ) {
8520 int r;
8521 const char *n = de->d_name;
8523 /* Ignore . and .. */
8524 if (*n == '.') {
8525 if ((n[1] == '\0') || (n[1] == '.' && n[2] == '\0')) {
8526 continue;
8530 if (n[0] == ':') {
8531 /* Temporary file used when creating a share. */
8532 num_tmp_dir_entries++;
8535 /* Allow 20% tmp entries. */
8536 if (num_tmp_dir_entries > allowed_tmp_entries) {
8537 DEBUG(0,("load_usershare_shares: too many temp entries (%u) "
8538 "in directory %s\n",
8539 num_tmp_dir_entries, usersharepath));
8540 break;
8543 r = process_usershare_file(usersharepath, n, snum_template);
8544 if (r == 0) {
8545 /* Update the services count. */
8546 num_usershares++;
8547 if (num_usershares >= max_user_shares) {
8548 DEBUG(0,("load_usershare_shares: max user shares reached "
8549 "on file %s in directory %s\n",
8550 n, usersharepath ));
8551 break;
8553 } else if (r == -1) {
8554 num_bad_dir_entries++;
8557 /* Allow 20% bad entries. */
8558 if (num_bad_dir_entries > allowed_bad_entries) {
8559 DEBUG(0,("load_usershare_shares: too many bad entries (%u) "
8560 "in directory %s\n",
8561 num_bad_dir_entries, usersharepath));
8562 break;
8565 /* Allow 20% bad entries. */
8566 if (num_dir_entries > max_user_shares + allowed_bad_entries) {
8567 DEBUG(0,("load_usershare_shares: too many total entries (%u) "
8568 "in directory %s\n",
8569 num_dir_entries, usersharepath));
8570 break;
8574 sys_closedir(dp);
8576 /* Sweep through and delete any non-refreshed usershares that are
8577 not currently in use. */
8578 for (iService = iNumServices - 1; iService >= 0; iService--) {
8579 if (VALID(iService) && (ServicePtrs[iService]->usershare == USERSHARE_PENDING_DELETE)) {
8580 if (conn_snum_used(iService)) {
8581 continue;
8583 /* Remove from the share ACL db. */
8584 DEBUG(10,("load_usershare_shares: Removing deleted usershare %s\n",
8585 lp_servicename(iService) ));
8586 delete_share_security(lp_servicename(iService));
8587 free_service_byindex(iService);
8591 return lp_numservices();
8594 /********************************************************
8595 Destroy global resources allocated in this file
8596 ********************************************************/
8598 void gfree_loadparm(void)
8600 struct file_lists *f;
8601 struct file_lists *next;
8602 int i;
8604 /* Free the file lists */
8606 f = file_lists;
8607 while( f ) {
8608 next = f->next;
8609 SAFE_FREE( f->name );
8610 SAFE_FREE( f->subfname );
8611 SAFE_FREE( f );
8612 f = next;
8615 /* Free resources allocated to services */
8617 for ( i = 0; i < iNumServices; i++ ) {
8618 if ( VALID(i) ) {
8619 free_service_byindex(i);
8623 SAFE_FREE( ServicePtrs );
8624 iNumServices = 0;
8626 /* Now release all resources allocated to global
8627 parameters and the default service */
8629 for (i = 0; parm_table[i].label; i++)
8631 if ( parm_table[i].type == P_STRING
8632 || parm_table[i].type == P_USTRING )
8634 string_free( (char**)parm_table[i].ptr );
8636 else if (parm_table[i].type == P_LIST) {
8637 TALLOC_FREE( *((char***)parm_table[i].ptr) );
8643 /***************************************************************************
8644 Allow client apps to specify that they are a client
8645 ***************************************************************************/
8646 void lp_set_in_client(bool b)
8648 in_client = b;
8652 /***************************************************************************
8653 Determine if we're running in a client app
8654 ***************************************************************************/
8655 bool lp_is_in_client(void)
8657 return in_client;
8663 /***************************************************************************
8664 Load the services array from the services file. Return True on success,
8665 False on failure.
8666 ***************************************************************************/
8668 bool lp_load_ex(const char *pszFname,
8669 bool global_only,
8670 bool save_defaults,
8671 bool add_ipc,
8672 bool initialize_globals,
8673 bool allow_include_registry)
8675 char *n2 = NULL;
8676 bool bRetval;
8677 param_opt_struct *data, *pdata;
8679 bRetval = False;
8681 DEBUG(3, ("lp_load_ex: refreshing parameters\n"));
8683 bInGlobalSection = True;
8684 bGlobalOnly = global_only;
8685 bAllowIncludeRegistry = allow_include_registry;
8687 init_globals(! initialize_globals);
8688 debug_init();
8690 if (save_defaults) {
8691 init_locals();
8692 lp_save_defaults();
8695 if (Globals.param_opt != NULL) {
8696 data = Globals.param_opt;
8697 while (data) {
8698 string_free(&data->key);
8699 string_free(&data->value);
8700 TALLOC_FREE(data->list);
8701 pdata = data->next;
8702 SAFE_FREE(data);
8703 data = pdata;
8705 Globals.param_opt = NULL;
8708 if (lp_config_backend_is_file()) {
8709 n2 = alloc_sub_basic(get_current_username(),
8710 current_user_info.domain,
8711 pszFname);
8712 if (!n2) {
8713 smb_panic("lp_load_ex: out of memory");
8716 add_to_file_list(pszFname, n2);
8718 /* We get sections first, so have to start 'behind' to make up */
8719 iServiceIndex = -1;
8720 bRetval = pm_process(n2, do_section, do_parameter, NULL);
8721 SAFE_FREE(n2);
8723 /* finish up the last section */
8724 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
8725 if (bRetval) {
8726 if (iServiceIndex >= 0) {
8727 bRetval = service_ok(iServiceIndex);
8731 if (lp_config_backend_is_registry()) {
8732 /* config backend changed to registry in config file */
8734 * We need to use this extra global variable here to
8735 * survive restart: init_globals uses this as a default
8736 * for ConfigBackend. Otherwise, init_globals would
8737 * send us into an endless loop here.
8739 config_backend = CONFIG_BACKEND_REGISTRY;
8740 /* start over */
8741 DEBUG(1, ("lp_load_ex: changing to config backend "
8742 "registry\n"));
8743 init_globals(false);
8744 lp_kill_all_services();
8745 return lp_load_ex(pszFname, global_only, save_defaults,
8746 add_ipc, initialize_globals,
8747 allow_include_registry);
8749 } else if (lp_config_backend_is_registry()) {
8750 bRetval = process_registry_globals();
8751 } else {
8752 DEBUG(0, ("Illegal config backend given: %d\n",
8753 lp_config_backend()));
8754 bRetval = false;
8757 lp_add_auto_services(lp_auto_services());
8759 if (add_ipc) {
8760 /* When 'restrict anonymous = 2' guest connections to ipc$
8761 are denied */
8762 lp_add_ipc("IPC$", (lp_restrict_anonymous() < 2));
8763 if ( lp_enable_asu_support() ) {
8764 lp_add_ipc("ADMIN$", false);
8768 set_server_role();
8769 set_default_server_announce_type();
8770 set_allowed_client_auth();
8772 bLoaded = True;
8774 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
8775 /* if bWINSsupport is true and we are in the client */
8776 if (lp_is_in_client() && Globals.bWINSsupport) {
8777 lp_do_parameter(GLOBAL_SECTION_SNUM, "wins server", "127.0.0.1");
8780 init_iconv();
8782 bAllowIncludeRegistry = true;
8784 return (bRetval);
8787 bool lp_load(const char *pszFname,
8788 bool global_only,
8789 bool save_defaults,
8790 bool add_ipc,
8791 bool initialize_globals)
8793 return lp_load_ex(pszFname,
8794 global_only,
8795 save_defaults,
8796 add_ipc,
8797 initialize_globals,
8798 true);
8801 bool lp_load_initial_only(const char *pszFname)
8803 return lp_load_ex(pszFname,
8804 true,
8805 false,
8806 false,
8807 true,
8808 false);
8811 /***************************************************************************
8812 Reset the max number of services.
8813 ***************************************************************************/
8815 void lp_resetnumservices(void)
8817 iNumServices = 0;
8820 /***************************************************************************
8821 Return the max number of services.
8822 ***************************************************************************/
8824 int lp_numservices(void)
8826 return (iNumServices);
8829 /***************************************************************************
8830 Display the contents of the services array in human-readable form.
8831 ***************************************************************************/
8833 void lp_dump(FILE *f, bool show_defaults, int maxtoprint)
8835 int iService;
8837 if (show_defaults)
8838 defaults_saved = False;
8840 dump_globals(f);
8842 dump_a_service(&sDefault, f);
8844 for (iService = 0; iService < maxtoprint; iService++) {
8845 fprintf(f,"\n");
8846 lp_dump_one(f, show_defaults, iService);
8850 /***************************************************************************
8851 Display the contents of one service in human-readable form.
8852 ***************************************************************************/
8854 void lp_dump_one(FILE * f, bool show_defaults, int snum)
8856 if (VALID(snum)) {
8857 if (ServicePtrs[snum]->szService[0] == '\0')
8858 return;
8859 dump_a_service(ServicePtrs[snum], f);
8863 /***************************************************************************
8864 Return the number of the service with the given name, or -1 if it doesn't
8865 exist. Note that this is a DIFFERENT ANIMAL from the internal function
8866 getservicebyname()! This works ONLY if all services have been loaded, and
8867 does not copy the found service.
8868 ***************************************************************************/
8870 int lp_servicenumber(const char *pszServiceName)
8872 int iService;
8873 fstring serviceName;
8875 if (!pszServiceName) {
8876 return GLOBAL_SECTION_SNUM;
8879 for (iService = iNumServices - 1; iService >= 0; iService--) {
8880 if (VALID(iService) && ServicePtrs[iService]->szService) {
8882 * The substitution here is used to support %U is
8883 * service names
8885 fstrcpy(serviceName, ServicePtrs[iService]->szService);
8886 standard_sub_basic(get_current_username(),
8887 current_user_info.domain,
8888 serviceName,sizeof(serviceName));
8889 if (strequal(serviceName, pszServiceName)) {
8890 break;
8895 if (iService >= 0 && ServicePtrs[iService]->usershare == USERSHARE_VALID) {
8896 time_t last_mod;
8898 if (!usershare_exists(iService, &last_mod)) {
8899 /* Remove the share security tdb entry for it. */
8900 delete_share_security(lp_servicename(iService));
8901 /* Remove it from the array. */
8902 free_service_byindex(iService);
8903 /* Doesn't exist anymore. */
8904 return GLOBAL_SECTION_SNUM;
8907 /* Has it been modified ? If so delete and reload. */
8908 if (ServicePtrs[iService]->usershare_last_mod < last_mod) {
8909 /* Remove it from the array. */
8910 free_service_byindex(iService);
8911 /* and now reload it. */
8912 iService = load_usershare_service(pszServiceName);
8916 if (iService < 0) {
8917 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
8918 return GLOBAL_SECTION_SNUM;
8921 return (iService);
8924 bool share_defined(const char *service_name)
8926 return (lp_servicenumber(service_name) != -1);
8929 struct share_params *get_share_params(TALLOC_CTX *mem_ctx,
8930 const char *sharename)
8932 struct share_params *result;
8933 char *sname;
8934 int snum;
8936 if (!(sname = SMB_STRDUP(sharename))) {
8937 return NULL;
8940 snum = find_service(sname);
8941 SAFE_FREE(sname);
8943 if (snum < 0) {
8944 return NULL;
8947 if (!(result = TALLOC_P(mem_ctx, struct share_params))) {
8948 DEBUG(0, ("talloc failed\n"));
8949 return NULL;
8952 result->service = snum;
8953 return result;
8956 struct share_iterator *share_list_all(TALLOC_CTX *mem_ctx)
8958 struct share_iterator *result;
8960 if (!(result = TALLOC_P(mem_ctx, struct share_iterator))) {
8961 DEBUG(0, ("talloc failed\n"));
8962 return NULL;
8965 result->next_id = 0;
8966 return result;
8969 struct share_params *next_share(struct share_iterator *list)
8971 struct share_params *result;
8973 while (!lp_snum_ok(list->next_id) &&
8974 (list->next_id < lp_numservices())) {
8975 list->next_id += 1;
8978 if (list->next_id >= lp_numservices()) {
8979 return NULL;
8982 if (!(result = TALLOC_P(list, struct share_params))) {
8983 DEBUG(0, ("talloc failed\n"));
8984 return NULL;
8987 result->service = list->next_id;
8988 list->next_id += 1;
8989 return result;
8992 struct share_params *next_printer(struct share_iterator *list)
8994 struct share_params *result;
8996 while ((result = next_share(list)) != NULL) {
8997 if (lp_print_ok(result->service)) {
8998 break;
9001 return result;
9005 * This is a hack for a transition period until we transformed all code from
9006 * service numbers to struct share_params.
9009 struct share_params *snum2params_static(int snum)
9011 static struct share_params result;
9012 result.service = snum;
9013 return &result;
9016 /*******************************************************************
9017 A useful volume label function.
9018 ********************************************************************/
9020 const char *volume_label(int snum)
9022 char *ret;
9023 const char *label = lp_volume(snum);
9024 if (!*label) {
9025 label = lp_servicename(snum);
9028 /* This returns a 33 byte guarenteed null terminated string. */
9029 ret = talloc_strndup(talloc_tos(), label, 32);
9030 if (!ret) {
9031 return "";
9033 return ret;
9036 /*******************************************************************
9037 Set the server type we will announce as via nmbd.
9038 ********************************************************************/
9040 static void set_default_server_announce_type(void)
9042 default_server_announce = 0;
9043 default_server_announce |= SV_TYPE_WORKSTATION;
9044 default_server_announce |= SV_TYPE_SERVER;
9045 default_server_announce |= SV_TYPE_SERVER_UNIX;
9047 /* note that the flag should be set only if we have a
9048 printer service but nmbd doesn't actually load the
9049 services so we can't tell --jerry */
9051 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
9053 switch (lp_announce_as()) {
9054 case ANNOUNCE_AS_NT_SERVER:
9055 default_server_announce |= SV_TYPE_SERVER_NT;
9056 /* fall through... */
9057 case ANNOUNCE_AS_NT_WORKSTATION:
9058 default_server_announce |= SV_TYPE_NT;
9059 break;
9060 case ANNOUNCE_AS_WIN95:
9061 default_server_announce |= SV_TYPE_WIN95_PLUS;
9062 break;
9063 case ANNOUNCE_AS_WFW:
9064 default_server_announce |= SV_TYPE_WFW;
9065 break;
9066 default:
9067 break;
9070 switch (lp_server_role()) {
9071 case ROLE_DOMAIN_MEMBER:
9072 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
9073 break;
9074 case ROLE_DOMAIN_PDC:
9075 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
9076 break;
9077 case ROLE_DOMAIN_BDC:
9078 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
9079 break;
9080 case ROLE_STANDALONE:
9081 default:
9082 break;
9084 if (lp_time_server())
9085 default_server_announce |= SV_TYPE_TIME_SOURCE;
9087 if (lp_host_msdfs())
9088 default_server_announce |= SV_TYPE_DFS_SERVER;
9091 /***********************************************************
9092 returns role of Samba server
9093 ************************************************************/
9095 int lp_server_role(void)
9097 return server_role;
9100 /***********************************************************
9101 If we are PDC then prefer us as DMB
9102 ************************************************************/
9104 bool lp_domain_master(void)
9106 if (Globals.iDomainMaster == Auto)
9107 return (lp_server_role() == ROLE_DOMAIN_PDC);
9109 return (bool)Globals.iDomainMaster;
9112 /***********************************************************
9113 If we are DMB then prefer us as LMB
9114 ************************************************************/
9116 bool lp_preferred_master(void)
9118 if (Globals.iPreferredMaster == Auto)
9119 return (lp_local_master() && lp_domain_master());
9121 return (bool)Globals.iPreferredMaster;
9124 /*******************************************************************
9125 Remove a service.
9126 ********************************************************************/
9128 void lp_remove_service(int snum)
9130 ServicePtrs[snum]->valid = False;
9131 invalid_services[num_invalid_services++] = snum;
9134 /*******************************************************************
9135 Copy a service.
9136 ********************************************************************/
9138 void lp_copy_service(int snum, const char *new_name)
9140 do_section(new_name, NULL);
9141 if (snum >= 0) {
9142 snum = lp_servicenumber(new_name);
9143 if (snum >= 0)
9144 lp_do_parameter(snum, "copy", lp_servicename(snum));
9149 /*******************************************************************
9150 Get the default server type we will announce as via nmbd.
9151 ********************************************************************/
9153 int lp_default_server_announce(void)
9155 return default_server_announce;
9158 /*******************************************************************
9159 Split the announce version into major and minor numbers.
9160 ********************************************************************/
9162 int lp_major_announce_version(void)
9164 static bool got_major = False;
9165 static int major_version = DEFAULT_MAJOR_VERSION;
9166 char *vers;
9167 char *p;
9169 if (got_major)
9170 return major_version;
9172 got_major = True;
9173 if ((vers = lp_announce_version()) == NULL)
9174 return major_version;
9176 if ((p = strchr_m(vers, '.')) == 0)
9177 return major_version;
9179 *p = '\0';
9180 major_version = atoi(vers);
9181 return major_version;
9184 int lp_minor_announce_version(void)
9186 static bool got_minor = False;
9187 static int minor_version = DEFAULT_MINOR_VERSION;
9188 char *vers;
9189 char *p;
9191 if (got_minor)
9192 return minor_version;
9194 got_minor = True;
9195 if ((vers = lp_announce_version()) == NULL)
9196 return minor_version;
9198 if ((p = strchr_m(vers, '.')) == 0)
9199 return minor_version;
9201 p++;
9202 minor_version = atoi(p);
9203 return minor_version;
9206 /***********************************************************
9207 Set the global name resolution order (used in smbclient).
9208 ************************************************************/
9210 void lp_set_name_resolve_order(const char *new_order)
9212 string_set(&Globals.szNameResolveOrder, new_order);
9215 const char *lp_printername(int snum)
9217 const char *ret = _lp_printername(snum);
9218 if (ret == NULL || (ret != NULL && *ret == '\0'))
9219 ret = lp_const_servicename(snum);
9221 return ret;
9225 /***********************************************************
9226 Allow daemons such as winbindd to fix their logfile name.
9227 ************************************************************/
9229 void lp_set_logfile(const char *name)
9231 string_set(&Globals.szLogFile, name);
9232 debug_set_logfile(name);
9235 /*******************************************************************
9236 Return the max print jobs per queue.
9237 ********************************************************************/
9239 int lp_maxprintjobs(int snum)
9241 int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
9242 if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
9243 maxjobs = PRINT_MAX_JOBID - 1;
9245 return maxjobs;
9248 const char *lp_printcapname(void)
9250 if ((Globals.szPrintcapname != NULL) &&
9251 (Globals.szPrintcapname[0] != '\0'))
9252 return Globals.szPrintcapname;
9254 if (sDefault.iPrinting == PRINT_CUPS) {
9255 #ifdef HAVE_CUPS
9256 return "cups";
9257 #else
9258 return "lpstat";
9259 #endif
9262 if (sDefault.iPrinting == PRINT_BSD)
9263 return "/etc/printcap";
9265 return PRINTCAP_NAME;
9268 /*******************************************************************
9269 Ensure we don't use sendfile if server smb signing is active.
9270 ********************************************************************/
9272 static uint32 spoolss_state;
9274 bool lp_disable_spoolss( void )
9276 if ( spoolss_state == SVCCTL_STATE_UNKNOWN )
9277 spoolss_state = _lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
9279 return spoolss_state == SVCCTL_STOPPED ? True : False;
9282 void lp_set_spoolss_state( uint32 state )
9284 SMB_ASSERT( (state == SVCCTL_STOPPED) || (state == SVCCTL_RUNNING) );
9286 spoolss_state = state;
9289 uint32 lp_get_spoolss_state( void )
9291 return lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
9294 /*******************************************************************
9295 Ensure we don't use sendfile if server smb signing is active.
9296 ********************************************************************/
9298 bool lp_use_sendfile(int snum)
9300 /* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
9301 if (Protocol < PROTOCOL_NT1) {
9302 return False;
9304 return (_lp_use_sendfile(snum) &&
9305 (get_remote_arch() != RA_WIN95) &&
9306 !srv_is_signing_active());
9309 /*******************************************************************
9310 Turn off sendfile if we find the underlying OS doesn't support it.
9311 ********************************************************************/
9313 void set_use_sendfile(int snum, bool val)
9315 if (LP_SNUM_OK(snum))
9316 ServicePtrs[snum]->bUseSendfile = val;
9317 else
9318 sDefault.bUseSendfile = val;
9321 /*******************************************************************
9322 Turn off storing DOS attributes if this share doesn't support it.
9323 ********************************************************************/
9325 void set_store_dos_attributes(int snum, bool val)
9327 if (!LP_SNUM_OK(snum))
9328 return;
9329 ServicePtrs[(snum)]->bStoreDosAttributes = val;
9332 void lp_set_mangling_method(const char *new_method)
9334 string_set(&Globals.szManglingMethod, new_method);
9337 /*******************************************************************
9338 Global state for POSIX pathname processing.
9339 ********************************************************************/
9341 static bool posix_pathnames;
9343 bool lp_posix_pathnames(void)
9345 return posix_pathnames;
9348 /*******************************************************************
9349 Change everything needed to ensure POSIX pathname processing (currently
9350 not much).
9351 ********************************************************************/
9353 void lp_set_posix_pathnames(void)
9355 posix_pathnames = True;
9358 /*******************************************************************
9359 Global state for POSIX lock processing - CIFS unix extensions.
9360 ********************************************************************/
9362 bool posix_default_lock_was_set;
9363 static enum brl_flavour posix_cifsx_locktype; /* By default 0 == WINDOWS_LOCK */
9365 enum brl_flavour lp_posix_cifsu_locktype(files_struct *fsp)
9367 if (posix_default_lock_was_set) {
9368 return posix_cifsx_locktype;
9369 } else {
9370 return fsp->posix_open ? POSIX_LOCK : WINDOWS_LOCK;
9374 /*******************************************************************
9375 ********************************************************************/
9377 void lp_set_posix_default_cifsx_readwrite_locktype(enum brl_flavour val)
9379 posix_default_lock_was_set = True;
9380 posix_cifsx_locktype = val;
9383 int lp_min_receive_file_size(void)
9385 if (Globals.iminreceivefile < 0) {
9386 return 0;
9388 return MIN(Globals.iminreceivefile, BUFFER_SIZE);