Large commit which restructures the local password storage API.
[Samba.git] / source / param / loadparm.c
blobdc2082423b9cde09294cf4da946fb2657cdaaf28
1 /*
2 Unix SMB/Netbios implementation.
3 Version 1.9.
4 Parameter loading functions
5 Copyright (C) Karl Auer 1993-1998
7 Largely re-written by Andrew Tridgell, September 1994
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 * Load parameters.
27 * This module provides suitable callback functions for the params
28 * module. It builds the internal table of service details which is
29 * then used by the rest of the server.
31 * To add a parameter:
33 * 1) add it to the global or service structure definition
34 * 2) add it to the parm_table
35 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
36 * 4) If it's a global then initialise it in init_globals. If a local
37 * (ie. service) parameter then initialise it in the sDefault structure
40 * Notes:
41 * The configuration file is processed sequentially for speed. It is NOT
42 * accessed randomly as happens in 'real' Windows. For this reason, there
43 * is a fair bit of sequence-dependent code here - ie., code which assumes
44 * that certain things happen before others. In particular, the code which
45 * happens at the boundary between sections is delicately poised, so be
46 * careful!
50 #include "includes.h"
52 /* Set default coding system for KANJI if none specified in Makefile. */
53 /*
54 * We treat KANJI specially due to historical precedent (it was the
55 * first non-english codepage added to Samba). With the new dynamic
56 * codepage support this is not needed anymore.
58 * The define 'KANJI' is being overloaded to mean 'use kanji codepage
59 * by default' and also 'this is the filename-to-disk conversion
60 * method to use'. This really should be removed and all control
61 * over this left in the smb.conf parameters 'client codepage'
62 * and 'coding system'.
64 #ifndef KANJI
65 #define KANJI "sbcs"
66 #endif /* KANJI */
68 BOOL in_client = False; /* Not in the client by default */
69 BOOL bLoaded = False;
71 extern int DEBUGLEVEL;
72 extern pstring user_socket_options;
73 extern pstring global_myname;
74 pstring global_scope = "";
76 #ifndef GLOBAL_NAME
77 #define GLOBAL_NAME "global"
78 #endif
80 #ifndef PRINTERS_NAME
81 #define PRINTERS_NAME "printers"
82 #endif
84 #ifndef HOMES_NAME
85 #define HOMES_NAME "homes"
86 #endif
88 /* some helpful bits */
89 #define pSERVICE(i) ServicePtrs[i]
90 #define iSERVICE(i) (*pSERVICE(i))
91 #define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
92 #define VALID(i) iSERVICE(i).valid
94 int keepalive = DEFAULT_KEEPALIVE;
95 BOOL use_getwd_cache = True;
97 extern int extra_time_offset;
99 static BOOL defaults_saved = False;
102 * This structure describes global (ie., server-wide) parameters.
104 typedef struct
106 char *szPrintcapname;
107 char *szEnumPortsCommand;
108 char *szAddPrinterCommand;
109 char *szDeletePrinterCommand;
110 char *szLockDir;
111 char *szRootdir;
112 char *szDefaultService;
113 char *szDfree;
114 char *szMsgCommand;
115 char *szHostsEquiv;
116 char *szServerString;
117 char *szAutoServices;
118 char *szPasswdProgram;
119 char *szPasswdChat;
120 char *szLogFile;
121 char *szConfigFile;
122 #ifdef WITH_TDBPWD
123 char *szTDBPasswdFile;
124 #else
125 char *szSMBPasswdFile;
126 #endif
127 char *szPassdbModulePath;
128 char *szPasswordServer;
129 char *szSocketOptions;
130 char *szValidChars;
131 char *szWorkGroup;
132 char *szDomainAdminGroup;
133 char *szDomainGuestGroup;
134 char *szDomainAdminUsers;
135 char *szDomainGuestUsers;
136 char *szDomainHostsallow;
137 char *szDomainHostsdeny;
138 char *szUsernameMap;
139 #ifdef USING_GROUPNAME_MAP
140 char *szGroupnameMap;
141 #endif /* USING_GROUPNAME_MAP */
142 char *szCharacterSet;
143 char *szCodePageDir;
144 char *szLogonScript;
145 char *szLogonPath;
146 char *szLogonDrive;
147 char *szLogonHome;
148 char *szSmbrun;
149 char *szWINSserver;
150 char *szCodingSystem;
151 char *szInterfaces;
152 char *szRemoteAnnounce;
153 char *szRemoteBrowseSync;
154 char *szSocketAddress;
155 char *szNISHomeMapName;
156 char *szAnnounceVersion; /* This is initialised in init_globals */
157 char *szNetbiosAliases;
158 char *szDomainOtherSIDs;
159 char *szDomainGroups;
160 char *szNameResolveOrder;
161 char *szLdapServer;
162 char *szLdapSuffix;
163 char *szLdapFilter;
164 char *szLdapRoot;
165 char *szLdapRootPassword;
166 char *szPanicAction;
167 char *szAddUserScript;
168 char *szDelUserScript;
169 char *szWINSHook;
170 #ifdef WITH_UTMP
171 char *szUtmpDir;
172 char *szWtmpDir;
173 char *szUtmpHostname;
174 BOOL bUtmpConsolidate;
175 #endif /* WITH_UTMP */
176 char *szSourceEnv;
177 char *szWinbindUID;
178 char *szWinbindGID;
179 char *szTemplateHomedir;
180 char *szTemplateShell;
181 char *szWinbindSeparator;
182 int max_log_size;
183 int mangled_stack;
184 int max_xmit;
185 int max_mux;
186 int max_open_files;
187 int max_packet;
188 int pwordlevel;
189 int unamelevel;
190 int deadtime;
191 int maxprotocol;
192 int security;
193 int maxdisksize;
194 int lpqcachetime;
195 int syslog;
196 int os_level;
197 int max_ttl;
198 int max_wins_ttl;
199 int min_wins_ttl;
200 int ReadSize;
201 int lm_announce;
202 int lm_interval;
203 int client_code_page;
204 int announce_as; /* This is initialised in init_globals */
205 int machine_password_timeout;
206 int change_notify_timeout;
207 int stat_cache_size;
208 int map_to_guest;
209 int min_passwd_length;
210 int oplock_break_wait_time;
211 int winbind_cache_time;
212 #ifdef WITH_LDAP
213 int ldap_port;
214 #endif /* WITH_LDAP */
215 #ifdef WITH_SSL
216 int sslVersion;
217 char *sslHostsRequire;
218 char *sslHostsResign;
219 char *sslCaCertDir;
220 char *sslCaCertFile;
221 char *sslCert;
222 char *sslPrivKey;
223 char *sslClientCert;
224 char *sslClientPrivKey;
225 char *sslCiphers;
226 BOOL sslEnabled;
227 BOOL sslReqClientCert;
228 BOOL sslReqServerCert;
229 BOOL sslCompatibility;
230 #endif /* WITH_SSL */
231 BOOL bMsAddPrinterWizard;
232 BOOL bDNSproxy;
233 BOOL bWINSsupport;
234 BOOL bWINSproxy;
235 BOOL bLocalMaster;
236 BOOL bPreferredMaster;
237 BOOL bDomainMaster;
238 BOOL bDomainLogons;
239 BOOL bEncryptPasswords;
240 BOOL bUpdateEncrypt;
241 BOOL bStripDot;
242 BOOL bNullPasswords;
243 BOOL bLoadPrinters;
244 BOOL bUseRhosts;
245 BOOL bReadRaw;
246 BOOL bWriteRaw;
247 BOOL bReadPrediction;
248 BOOL bReadbmpx;
249 BOOL bSyslogOnly;
250 BOOL bBrowseList;
251 BOOL bUnixRealname;
252 BOOL bNISHomeMap;
253 BOOL bTimeServer;
254 BOOL bBindInterfacesOnly;
255 BOOL bUnixPasswdSync;
256 BOOL bPasswdChatDebug;
257 BOOL bTimestampLogs;
258 BOOL bNTSmbSupport;
259 BOOL bNTPipeSupport;
260 BOOL bNTAclSupport;
261 BOOL bStatCache;
262 BOOL bKernelOplocks;
263 BOOL bAllowTrustedDomains;
264 BOOL bRestrictAnonymous;
265 BOOL bDebugHiresTimestamp;
266 BOOL bDebugPid;
267 BOOL bDebugUid;
268 BOOL bHostMSDfs;
270 global;
272 static global Globals;
277 * This structure describes a single service.
279 typedef struct
281 BOOL valid;
282 BOOL autoloaded;
283 char *szService;
284 char *szPath;
285 char *szUsername;
286 char *szGuestaccount;
287 char *szInvalidUsers;
288 char *szValidUsers;
289 char *szAdminUsers;
290 char *szCopy;
291 char *szInclude;
292 char *szPreExec;
293 char *szPostExec;
294 char *szRootPreExec;
295 char *szRootPostExec;
296 char *szPrintcommand;
297 char *szLpqcommand;
298 char *szLprmcommand;
299 char *szLppausecommand;
300 char *szLpresumecommand;
301 char *szQueuepausecommand;
302 char *szQueueresumecommand;
303 char *szPrintername;
304 char *szPrinterDriver;
305 char *szPrinterDriverLocation;
306 char *szDriverFile;
307 char *szDontdescend;
308 char *szHostsallow;
309 char *szHostsdeny;
310 char *szMagicScript;
311 char *szMagicOutput;
312 char *szMangledMap;
313 char *szVetoFiles;
314 char *szHideFiles;
315 char *szVetoOplockFiles;
316 char *comment;
317 char *force_user;
318 char *force_group;
319 char *readlist;
320 char *writelist;
321 char *printer_admin;
322 char *volume;
323 char *fstype;
324 char *szVfsObjectFile;
325 char *szVfsOptions;
326 int iMinPrintSpace;
327 int iMaxPrintJobs;
328 int iWriteCacheSize;
329 int iCreate_mask;
330 int iCreate_force_mode;
331 int iSecurity_mask;
332 int iSecurity_force_mode;
333 int iDir_mask;
334 int iDir_force_mode;
335 int iDir_Security_mask;
336 int iDir_Security_force_mode;
337 int iMaxConnections;
338 int iDefaultCase;
339 int iPrinting;
340 int iOplockContentionLimit;
341 BOOL bAlternatePerm;
342 BOOL bPreexecClose;
343 BOOL bRootpreexecClose;
344 BOOL bCaseSensitive;
345 BOOL bCasePreserve;
346 BOOL bShortCasePreserve;
347 BOOL bCaseMangle;
348 BOOL status;
349 BOOL bHideDotFiles;
350 BOOL bBrowseable;
351 BOOL bAvailable;
352 BOOL bRead_only;
353 BOOL bNo_set_dir;
354 BOOL bGuest_only;
355 BOOL bGuest_ok;
356 BOOL bPrint_ok;
357 BOOL bPostscript;
358 BOOL bMap_system;
359 BOOL bMap_hidden;
360 BOOL bMap_archive;
361 BOOL bLocking;
362 BOOL bStrictLocking;
363 BOOL bPosixLocking;
364 #ifdef WITH_UTMP
365 BOOL bUtmp;
366 #endif
367 BOOL bShareModes;
368 BOOL bOpLocks;
369 BOOL bLevel2OpLocks;
370 BOOL bOnlyUser;
371 BOOL bMangledNames;
372 BOOL bWidelinks;
373 BOOL bSymlinks;
374 BOOL bSyncAlways;
375 BOOL bStrictSync;
376 char magic_char;
377 BOOL *copymap;
378 BOOL bDeleteReadonly;
379 BOOL bFakeOplocks;
380 BOOL bDeleteVetoFiles;
381 BOOL bDosFiletimes;
382 BOOL bDosFiletimeResolution;
383 BOOL bFakeDirCreateTimes;
384 BOOL bBlockingLocks;
385 BOOL bInheritPerms;
386 BOOL bMSDfsRoot;
388 char dummy[3]; /* for alignment */
390 service;
393 /* This is a default service used to prime a services structure */
394 static service sDefault = {
395 True, /* valid */
396 False, /* not autoloaded */
397 NULL, /* szService */
398 NULL, /* szPath */
399 NULL, /* szUsername */
400 NULL, /* szGuestAccount - this is set in init_globals() */
401 NULL, /* szInvalidUsers */
402 NULL, /* szValidUsers */
403 NULL, /* szAdminUsers */
404 NULL, /* szCopy */
405 NULL, /* szInclude */
406 NULL, /* szPreExec */
407 NULL, /* szPostExec */
408 NULL, /* szRootPreExec */
409 NULL, /* szRootPostExec */
410 NULL, /* szPrintcommand */
411 NULL, /* szLpqcommand */
412 NULL, /* szLprmcommand */
413 NULL, /* szLppausecommand */
414 NULL, /* szLpresumecommand */
415 NULL, /* szQueuepausecommand */
416 NULL, /* szQueueresumecommand */
417 NULL, /* szPrintername */
418 NULL, /* szPrinterDriver - this is set in init_globals() */
419 NULL, /* szPrinterDriverLocation */
420 NULL, /* szDriverFile */
421 NULL, /* szDontdescend */
422 NULL, /* szHostsallow */
423 NULL, /* szHostsdeny */
424 NULL, /* szMagicScript */
425 NULL, /* szMagicOutput */
426 NULL, /* szMangledMap */
427 NULL, /* szVetoFiles */
428 NULL, /* szHideFiles */
429 NULL, /* szVetoOplockFiles */
430 NULL, /* comment */
431 NULL, /* force user */
432 NULL, /* force group */
433 NULL, /* readlist */
434 NULL, /* writelist */
435 NULL, /* printer admin */
436 NULL, /* volume */
437 NULL, /* fstype */
438 NULL, /* vfs object */
439 NULL, /* vfs options */
440 0, /* iMinPrintSpace */
441 1000, /* iMaxPrintJobs */
442 0, /* iWriteCacheSize */
443 0744, /* iCreate_mask */
444 0000, /* iCreate_force_mode */
445 -1, /* iSecurity_mask */
446 -1, /* iSecurity_force_mode */
447 0755, /* iDir_mask */
448 0000, /* iDir_force_mode */
449 -1, /* iDir_Security_mask */
450 -1, /* iDir_Security_force_mode */
451 0, /* iMaxConnections */
452 CASE_LOWER, /* iDefaultCase */
453 DEFAULT_PRINTING, /* iPrinting */
454 2, /* iOplockContentionLimit */
455 False, /* bAlternatePerm */
456 False, /* bPreexecClose */
457 False, /* bRootpreexecClose */
458 False, /* case sensitive */
459 True, /* case preserve */
460 True, /* short case preserve */
461 False, /* case mangle */
462 True, /* status */
463 True, /* bHideDotFiles */
464 True, /* bBrowseable */
465 True, /* bAvailable */
466 True, /* bRead_only */
467 True, /* bNo_set_dir */
468 False, /* bGuest_only */
469 False, /* bGuest_ok */
470 False, /* bPrint_ok */
471 False, /* bPostscript */
472 False, /* bMap_system */
473 False, /* bMap_hidden */
474 True, /* bMap_archive */
475 True, /* bLocking */
476 False, /* bStrictLocking */
477 True, /* bPosixLocking */
478 #ifdef WITH_UTMP
479 False, /* bUtmp */
480 #endif
481 True, /* bShareModes */
482 True, /* bOpLocks */
483 True, /* bLevel2OpLocks */
484 False, /* bOnlyUser */
485 True, /* bMangledNames */
486 True, /* bWidelinks */
487 True, /* bSymlinks */
488 False, /* bSyncAlways */
489 False, /* bStrictSync */
490 '~', /* magic char */
491 NULL, /* copymap */
492 False, /* bDeleteReadonly */
493 False, /* bFakeOplocks */
494 False, /* bDeleteVetoFiles */
495 False, /* bDosFiletimes */
496 False, /* bDosFiletimeResolution */
497 False, /* bFakeDirCreateTimes */
498 True, /* bBlockingLocks */
499 False, /* bInheritPerms */
500 False, /* bMSDfsRoot */
502 "" /* dummy */
507 /* local variables */
508 static service **ServicePtrs = NULL;
509 static int iNumServices = 0;
510 static int iServiceIndex = 0;
511 static BOOL bInGlobalSection = True;
512 static BOOL bGlobalOnly = False;
513 static int server_role;
514 static int default_server_announce;
516 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
518 /* prototypes for the special type handlers */
519 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
520 static BOOL handle_include(char *pszParmValue, char **ptr);
521 static BOOL handle_copy(char *pszParmValue, char **ptr);
522 static BOOL handle_character_set(char *pszParmValue, char **ptr);
523 static BOOL handle_coding_system(char *pszParmValue, char **ptr);
524 static BOOL handle_client_code_page(char *pszParmValue, char **ptr);
525 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
526 static BOOL handle_source_env(char *pszParmValue, char **ptr);
527 static BOOL handle_netbios_name(char *pszParmValue, char **ptr);
528 static BOOL handle_winbind_id(char *pszParmValue, char **ptr);
529 static BOOL handle_wins_server_list(char *pszParmValue, char **ptr);
531 static void set_server_role(void);
532 static void set_default_server_announce_type(void);
534 static struct enum_list enum_protocol[] = {
535 {PROTOCOL_NT1, "NT1"},
536 {PROTOCOL_LANMAN2, "LANMAN2"},
537 {PROTOCOL_LANMAN1, "LANMAN1"},
538 {PROTOCOL_CORE, "CORE"},
539 {PROTOCOL_COREPLUS, "COREPLUS"},
540 {PROTOCOL_COREPLUS, "CORE+"},
541 {-1, NULL}
544 static struct enum_list enum_security[] = {
545 {SEC_SHARE, "SHARE"},
546 {SEC_USER, "USER"},
547 {SEC_SERVER, "SERVER"},
548 {SEC_DOMAIN, "DOMAIN"},
549 {-1, NULL}
552 static struct enum_list enum_printing[] = {
553 {PRINT_SYSV, "sysv"},
554 {PRINT_AIX, "aix"},
555 {PRINT_HPUX, "hpux"},
556 {PRINT_BSD, "bsd"},
557 {PRINT_QNX, "qnx"},
558 {PRINT_PLP, "plp"},
559 {PRINT_LPRNG, "lprng"},
560 {PRINT_SOFTQ, "softq"},
561 {PRINT_CUPS, "cups"},
562 {PRINT_LPRNT, "nt"},
563 {PRINT_LPROS2, "os2"},
564 {-1, NULL}
567 /* Types of machine we can announce as. */
568 #define ANNOUNCE_AS_NT_SERVER 1
569 #define ANNOUNCE_AS_WIN95 2
570 #define ANNOUNCE_AS_WFW 3
571 #define ANNOUNCE_AS_NT_WORKSTATION 4
573 static struct enum_list enum_announce_as[] = {
574 {ANNOUNCE_AS_NT_SERVER, "NT"},
575 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
576 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
577 {ANNOUNCE_AS_WIN95, "win95"},
578 {ANNOUNCE_AS_WFW, "WfW"},
579 {-1, NULL}
582 static struct enum_list enum_case[] = {
583 {CASE_LOWER, "lower"},
584 {CASE_UPPER, "upper"},
585 {-1, NULL}
588 static struct enum_list enum_bool_auto[] = {
589 {False, "False"},
590 {False, "No"},
591 {False, "0"},
592 {True, "True"},
593 {True, "Yes"},
594 {True, "1"},
595 {Auto, "Auto"},
596 {-1, NULL}
600 Do you want session setups at user level security with a invalid
601 password to be rejected or allowed in as guest? WinNT rejects them
602 but it can be a pain as it means "net view" needs to use a password
604 You have 3 choices in the setting of map_to_guest:
606 "Never" means session setups with an invalid password
607 are rejected. This is the default.
609 "Bad User" means session setups with an invalid password
610 are rejected, unless the username does not exist, in which case it
611 is treated as a guest login
613 "Bad Password" means session setups with an invalid password
614 are treated as a guest login
616 Note that map_to_guest only has an effect in user or server
617 level security.
620 static struct enum_list enum_map_to_guest[] = {
621 {NEVER_MAP_TO_GUEST, "Never"},
622 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
623 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
624 {-1, NULL}
627 #ifdef WITH_SSL
628 static struct enum_list enum_ssl_version[] = {
629 {SMB_SSL_V2, "ssl2"},
630 {SMB_SSL_V3, "ssl3"},
631 {SMB_SSL_V23, "ssl2or3"},
632 {SMB_SSL_TLS1, "tls1"},
633 {-1, NULL}
635 #endif
637 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
638 static struct parm_struct parm_table[] = {
639 {"Base Options", P_SEP, P_SEPARATOR},
641 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
642 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, handle_client_code_page, NULL, 0},
643 {"code page directory", P_STRING, P_GLOBAL, &Globals.szCodePageDir, NULL, NULL, 0},
644 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
645 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
646 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING},
647 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
648 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC | FLAG_DOS_STRING},
649 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING},
650 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, FLAG_DOS_STRING},
651 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
652 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC},
653 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, 0},
655 {"Security Options", P_SEP, P_SEPARATOR},
657 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC},
658 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC},
659 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
660 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, 0},
661 {"alternate permissions", P_BOOL, P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL | FLAG_DEPRECATED},
662 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
663 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
664 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
665 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
666 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
667 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
668 /* #ifdef WITH_TDBPWD
669 {"tdb passwd file", P_STRING, P_GLOBAL, &Globals.szTDBPasswdFile, NULL, NULL, 0},
670 #else */
671 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
672 /* #endif */
673 {"passdb module path", P_STRING, P_GLOBAL, &Globals.szPassdbModulePath, NULL, NULL, 0},
674 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
675 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
676 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
678 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
679 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
680 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
681 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
682 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
683 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
684 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
685 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0},
686 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
688 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
689 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
690 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
692 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
693 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
694 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
695 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
696 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
697 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
698 {"printer admin", P_STRING, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
699 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
700 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
701 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
703 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE},
704 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
705 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
706 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
708 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
709 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
710 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
711 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
712 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
713 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
714 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
715 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
716 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
717 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
718 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
719 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
720 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
722 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
723 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
725 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
726 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
727 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
728 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
729 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
731 #ifdef WITH_SSL
732 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
733 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0},
735 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0},
736 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
737 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0},
738 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0},
739 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0},
740 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0},
741 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0},
742 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0},
743 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0},
744 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0},
745 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0},
746 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
747 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0},
748 #endif /* WITH_SSL */
750 {"Logging Options", P_SEP, P_SEPARATOR},
751 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_BASIC},
752 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, 0},
753 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
754 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
755 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
757 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
758 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
759 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
760 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
761 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
762 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
764 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT},
766 {"Protocol Options", P_SEP, P_SEPARATOR},
768 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
769 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
770 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
771 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
773 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
774 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
775 {"nt acl support", P_BOOL, P_GLOBAL, &Globals.bNTAclSupport, NULL, NULL, 0},
776 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
777 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
778 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
779 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
781 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
782 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
783 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
784 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
785 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
786 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
787 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
789 {"Tuning Options", P_SEP, P_SEPARATOR},
791 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
792 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
793 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
794 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
796 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
797 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
798 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
799 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
800 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
801 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
803 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
804 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
805 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
806 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
807 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
809 {"Printing Options", P_SEP, P_SEPARATOR},
811 {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_PRINT},
812 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
813 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
814 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
815 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
816 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
817 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
818 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
819 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
820 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
821 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
822 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
823 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
824 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
825 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
827 {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, 0},
828 {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, 0},
829 {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, 0},
830 {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, 0},
832 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
833 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, 0},
834 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT},
835 {"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT},
836 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
838 {"Filename Handling", P_SEP, P_SEPARATOR},
839 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
841 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
842 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
843 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
844 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
845 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
846 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
847 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
848 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
849 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
850 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
851 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
852 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
853 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
854 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
855 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
856 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
857 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
858 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
859 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
860 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
862 {"Domain Options", P_SEP, P_SEPARATOR},
864 {"domain groups", P_STRING, P_GLOBAL, &Globals.szDomainGroups, NULL, NULL, 0},
865 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
866 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
867 {"domain admin users", P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL, NULL, 0},
868 {"domain guest users", P_STRING, P_GLOBAL, &Globals.szDomainGuestUsers, NULL, NULL, 0},
869 #ifdef USING_GROUPNAME_MAP
871 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
872 #endif /* USING_GROUPNAME_MAP */
874 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
876 {"Logon Options", P_SEP, P_SEPARATOR},
878 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
879 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
880 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
881 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
882 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
883 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
884 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
886 {"Browse Options", P_SEP, P_SEPARATOR},
888 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
889 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, 0},
890 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
891 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
892 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
893 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
894 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
895 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
896 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
897 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
899 {"WINS Options", P_SEP, P_SEPARATOR},
900 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
901 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
903 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, handle_wins_server_list, NULL, FLAG_BASIC},
904 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
905 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
907 {"Locking Options", P_SEP, P_SEPARATOR},
909 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
910 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
911 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
912 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
913 #ifdef WITH_UTMP
914 {"utmp", P_BOOL, P_LOCAL, &sDefault.bUtmp, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
915 #endif
917 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
918 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
919 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
920 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
921 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
922 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
923 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
925 #ifdef WITH_LDAP
926 {"Ldap Options", P_SEP, P_SEPARATOR},
928 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
929 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
930 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
931 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0},
932 {"ldap root", P_STRING, P_GLOBAL, &Globals.szLdapRoot, NULL, NULL, 0},
933 {"ldap root passwd", P_STRING, P_GLOBAL, &Globals.szLdapRootPassword, NULL, NULL, 0},
934 #endif /* WITH_LDAP */
936 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
937 {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
939 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
940 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
941 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
942 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
943 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
944 #ifdef WITH_UTMP
945 {"utmp dir", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
946 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
947 {"wtmp dir", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
948 {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
949 {"utmp hostname", P_STRING, P_GLOBAL, &Globals.szUtmpHostname, NULL, NULL, 0},
950 {"utmp consolidate", P_BOOL, P_GLOBAL, &Globals.bUtmpConsolidate, NULL, NULL, 0},
951 #endif /* WITH_UTMP */
953 {"default service", P_STRING, P_GLOBAL,
954 &Globals.szDefaultService, NULL, NULL, 0},
955 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
956 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
957 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
958 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
959 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
960 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0},
961 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
962 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
963 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
964 {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0},
965 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
966 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
968 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
969 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
970 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
971 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
973 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
974 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
975 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
976 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
977 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
978 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
979 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE},
980 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
981 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
982 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0},
983 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
984 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
985 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
986 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
987 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
988 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
989 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
990 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
992 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
993 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
995 {"VFS options", P_SEP, P_SEPARATOR},
997 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, 0},
998 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, 0},
1001 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
1002 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_GLOBAL},
1004 {"Winbind options", P_SEP, P_SEPARATOR},
1006 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_id, NULL, 0},
1007 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_id, NULL, 0},
1008 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, 0},
1009 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, 0},
1010 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, 0},
1011 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
1013 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
1017 /***************************************************************************
1018 Initialise the sDefault parameter structure for the printer values.
1019 ***************************************************************************/
1020 static void init_printer_values(void)
1022 string_set(&sDefault.szPrinterDriver, "");
1023 string_set(&sDefault.szDriverFile, DRIVERFILE);
1025 /* choose defaults depending on the type of printing */
1026 switch (sDefault.iPrinting)
1028 case PRINT_BSD:
1029 case PRINT_AIX:
1030 case PRINT_LPRNT:
1031 case PRINT_LPROS2:
1032 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1033 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1034 string_set(&sDefault.szPrintcommand,
1035 "lpr -r -P%p %s");
1036 break;
1038 case PRINT_LPRNG:
1039 case PRINT_PLP:
1040 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1041 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1042 string_set(&sDefault.szPrintcommand,
1043 "lpr -r -P%p %s");
1044 string_set(&sDefault.szQueuepausecommand,
1045 "lpc stop %p");
1046 string_set(&sDefault.szQueueresumecommand,
1047 "lpc start %p");
1048 string_set(&sDefault.szLppausecommand,
1049 "lpc hold %p %j");
1050 string_set(&sDefault.szLpresumecommand,
1051 "lpc release %p %j");
1052 break;
1054 case PRINT_CUPS:
1055 string_set(&sDefault.szLpqcommand,
1056 "/usr/bin/lpstat -o%p");
1057 string_set(&sDefault.szLprmcommand,
1058 "/usr/bin/cancel %p-%j");
1059 string_set(&sDefault.szPrintcommand,
1060 "/usr/bin/lp -d%p -oraw %s; rm %s");
1061 string_set(&sDefault.szQueuepausecommand,
1062 "/usr/bin/disable %p");
1063 string_set(&sDefault.szQueueresumecommand,
1064 "/usr/bin/enable %p");
1065 break;
1067 case PRINT_SYSV:
1068 case PRINT_HPUX:
1069 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1070 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1071 string_set(&sDefault.szPrintcommand,
1072 "lp -c -d%p %s; rm %s");
1073 string_set(&sDefault.szQueuepausecommand,
1074 "disable %p");
1075 string_set(&sDefault.szQueueresumecommand,
1076 "enable %p");
1077 #ifndef HPUX
1078 string_set(&sDefault.szLppausecommand,
1079 "lp -i %p-%j -H hold");
1080 string_set(&sDefault.szLpresumecommand,
1081 "lp -i %p-%j -H resume");
1082 #endif /* SYSV */
1083 break;
1085 case PRINT_QNX:
1086 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1087 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1088 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1089 break;
1091 case PRINT_SOFTQ:
1092 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1093 string_set(&sDefault.szLprmcommand,
1094 "qstat -s -j%j -c");
1095 string_set(&sDefault.szPrintcommand,
1096 "lp -d%p -s %s; rm %s");
1097 string_set(&sDefault.szLppausecommand,
1098 "qstat -s -j%j -h");
1099 string_set(&sDefault.szLpresumecommand,
1100 "qstat -s -j%j -r");
1101 break;
1106 /***************************************************************************
1107 Initialise the global parameter structure.
1108 ***************************************************************************/
1109 static void init_globals(void)
1111 static BOOL done_init = False;
1112 pstring s;
1114 if (!done_init)
1116 int i;
1117 memset((void *)&Globals, '\0', sizeof(Globals));
1119 for (i = 0; parm_table[i].label; i++)
1120 if ((parm_table[i].type == P_STRING ||
1121 parm_table[i].type == P_USTRING) &&
1122 parm_table[i].ptr)
1123 string_set(parm_table[i].ptr, "");
1125 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
1126 string_set(&sDefault.fstype, FSTYPE_STRING);
1128 init_printer_values();
1130 done_init = True;
1134 DEBUG(3, ("Initialising global parameters\n"));
1136 #ifdef WITH_TDBPWD
1137 string_set(&Globals.szTDBPasswdFile, TDB_PASSWD_FILE);
1138 #else
1139 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
1140 #endif
1141 string_set(&Globals.szPassdbModulePath, "");
1144 * Allow the default PASSWD_CHAT to be overridden in local.h.
1146 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1147 string_set(&Globals.szWorkGroup, WORKGROUP);
1148 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1149 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1150 string_set(&Globals.szLockDir, LOCKDIR);
1151 #ifdef WITH_UTMP
1152 string_set(&Globals.szUtmpDir, "");
1153 string_set(&Globals.szWtmpDir, "");
1154 string_set(&Globals.szUtmpHostname, "%m");
1155 Globals.bUtmpConsolidate = False;
1156 #endif /* WITH_UTMP */
1157 string_set(&Globals.szSmbrun, SMBRUN);
1158 string_set(&Globals.szSocketAddress, "0.0.0.0");
1159 pstrcpy(s, "Samba ");
1160 pstrcat(s, VERSION);
1161 string_set(&Globals.szServerString, s);
1162 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1163 DEFAULT_MINOR_VERSION);
1164 string_set(&Globals.szAnnounceVersion, s);
1166 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1168 string_set(&Globals.szLogonDrive, "");
1169 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1170 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1171 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1173 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1174 string_set(&Globals.szCodePageDir, CODEPAGEDIR);
1176 Globals.bLoadPrinters = True;
1177 Globals.bUseRhosts = False;
1178 Globals.max_packet = 65535;
1179 Globals.mangled_stack = 50;
1180 Globals.max_xmit = 65535;
1181 Globals.max_mux = 50; /* This is *needed* for profile support. */
1182 Globals.lpqcachetime = 10;
1183 Globals.pwordlevel = 0;
1184 Globals.unamelevel = 0;
1185 Globals.deadtime = 0;
1186 Globals.max_log_size = 5000;
1187 Globals.max_open_files = MAX_OPEN_FILES;
1188 Globals.maxprotocol = PROTOCOL_NT1;
1189 Globals.security = SEC_USER;
1190 Globals.bEncryptPasswords = False;
1191 Globals.bUpdateEncrypt = False;
1192 Globals.bReadRaw = True;
1193 Globals.bWriteRaw = True;
1194 Globals.bReadPrediction = False;
1195 Globals.bReadbmpx = False;
1196 Globals.bNullPasswords = False;
1197 Globals.bStripDot = False;
1198 Globals.syslog = 1;
1199 Globals.bSyslogOnly = False;
1200 Globals.bTimestampLogs = False;
1201 Globals.bDebugHiresTimestamp = False;
1202 Globals.bDebugPid = False;
1203 Globals.bDebugUid = False;
1204 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1205 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1206 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1207 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1208 Globals.change_notify_timeout = 60; /* 1 minute default. */
1209 Globals.ReadSize = 16 * 1024;
1210 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1211 Globals.lm_interval = 60;
1212 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1213 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1214 Globals.bUnixRealname = True;
1215 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1216 Globals.bNISHomeMap = False;
1217 #ifdef WITH_NISPLUS_HOME
1218 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1219 #else
1220 string_set(&Globals.szNISHomeMapName, "auto.home");
1221 #endif
1222 #endif
1223 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1224 Globals.bTimeServer = False;
1225 Globals.bBindInterfacesOnly = False;
1226 Globals.bUnixPasswdSync = False;
1227 Globals.bPasswdChatDebug = False;
1228 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
1229 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1230 Globals.bNTAclSupport = True; /* Use NT ACLs by default. */
1231 Globals.bStatCache = True; /* use stat cache by default */
1232 Globals.bRestrictAnonymous = False;
1233 Globals.map_to_guest = 0; /* By Default, "Never" */
1234 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1235 Globals.oplock_break_wait_time = 10; /* By Default, 10 msecs. */
1237 #ifdef WITH_LDAP
1238 /* default values for ldap */
1239 string_set(&Globals.szLdapServer, "localhost");
1240 Globals.ldap_port = 389;
1241 #endif /* WITH_LDAP */
1243 #ifdef WITH_SSL
1244 Globals.sslVersion = SMB_SSL_V23;
1245 string_set(&Globals.sslHostsRequire, "");
1246 string_set(&Globals.sslHostsResign, "");
1247 string_set(&Globals.sslCaCertDir, "");
1248 string_set(&Globals.sslCaCertFile, "");
1249 string_set(&Globals.sslCert, "");
1250 string_set(&Globals.sslPrivKey, "");
1251 string_set(&Globals.sslClientCert, "");
1252 string_set(&Globals.sslClientPrivKey, "");
1253 string_set(&Globals.sslCiphers, "");
1254 Globals.sslEnabled = False;
1255 Globals.sslReqClientCert = False;
1256 Globals.sslReqServerCert = False;
1257 Globals.sslCompatibility = False;
1258 #endif /* WITH_SSL */
1261 these parameters are set to defaults that are more appropriate
1262 for the increasing samba install base:
1264 as a member of the workgroup, that will possibly become a
1265 _local_ master browser (lm = True). this is opposed to a forced
1266 local master browser startup (pm = True).
1268 doesn't provide WINS server service by default (wsupp = False),
1269 and doesn't provide domain master browser services by default, either.
1272 Globals.bMsAddPrinterWizard = True;
1273 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1274 Globals.os_level = 20;
1275 Globals.bLocalMaster = True;
1276 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1277 Globals.bDomainLogons = False;
1278 Globals.bBrowseList = True;
1279 Globals.bWINSsupport = False;
1280 Globals.bWINSproxy = False;
1282 Globals.bDNSproxy = True;
1284 /* this just means to use them if they exist */
1285 Globals.bKernelOplocks = True;
1287 Globals.bAllowTrustedDomains = True;
1289 string_set(&Globals.szTemplateShell, "/bin/false");
1290 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1291 string_set(&Globals.szWinbindSeparator, "\\");
1292 Globals.winbind_cache_time = 15;
1295 * This must be done last as it checks the value in
1296 * client_code_page.
1299 interpret_coding_system(KANJI);
1302 static TALLOC_CTX *lp_talloc;
1304 /******************************************************************* a
1305 free up temporary memory - called from the main loop
1306 ********************************************************************/
1307 void lp_talloc_free(void)
1309 if (!lp_talloc)
1310 return;
1311 talloc_destroy(lp_talloc);
1312 lp_talloc = NULL;
1315 /*******************************************************************
1316 convenience routine to grab string parameters into temporary memory
1317 and run standard_sub_basic on them. The buffers can be written to by
1318 callers without affecting the source string.
1319 ********************************************************************/
1320 static char *lp_string(const char *s)
1322 size_t len = s ? strlen(s) : 0;
1323 char *ret;
1325 if (!lp_talloc)
1326 lp_talloc = talloc_init();
1328 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1330 if (!ret)
1331 return NULL;
1333 if (!s)
1334 *ret = 0;
1335 else
1336 StrnCpy(ret, s, len);
1338 trim_string(ret, "\"", "\"");
1340 standard_sub_basic(ret);
1341 return (ret);
1346 In this section all the functions that are used to access the
1347 parameters from the rest of the program are defined
1350 #define FN_GLOBAL_STRING(fn_name,ptr) \
1351 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1352 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1353 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1354 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1355 char fn_name(void) {return(*(char *)(ptr));}
1356 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1357 int fn_name(void) {return(*(int *)(ptr));}
1359 #define FN_LOCAL_STRING(fn_name,val) \
1360 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1361 #define FN_LOCAL_BOOL(fn_name,val) \
1362 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1363 #define FN_LOCAL_CHAR(fn_name,val) \
1364 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1365 #define FN_LOCAL_INTEGER(fn_name,val) \
1366 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1368 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1369 FN_GLOBAL_STRING(lp_smbrun, &Globals.szSmbrun)
1370 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1371 #ifdef WITH_TDBPWD
1372 FN_GLOBAL_STRING(lp_tdb_passwd_file, &Globals.szTDBPasswdFile)
1373 #else
1374 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1375 #endif
1376 FN_GLOBAL_STRING(lp_passdb_module_path, &Globals.szPassdbModulePath)
1377 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1378 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1379 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1380 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1381 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1382 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1383 #ifdef WITH_UTMP
1384 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1385 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1386 FN_GLOBAL_STRING(lp_utmp_hostname, &Globals.szUtmpHostname)
1387 FN_GLOBAL_BOOL(lp_utmp_consolidate, &Globals.bUtmpConsolidate)
1388 #endif /* WITH_UTMP */
1389 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1390 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1391 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1392 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1393 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1394 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1395 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1396 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1397 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1398 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1399 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1400 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1401 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1402 #ifdef USING_GROUPNAME_MAP
1403 FN_GLOBAL_STRING(lp_groupname_map, &Globals.szGroupnameMap)
1404 #endif /* USING_GROUPNAME_MAP */
1405 FN_GLOBAL_STRING(lp_logon_script, &Globals.szLogonScript)
1406 FN_GLOBAL_STRING(lp_logon_path, &Globals.szLogonPath)
1407 FN_GLOBAL_STRING(lp_logon_drive, &Globals.szLogonDrive)
1408 FN_GLOBAL_STRING(lp_logon_home, &Globals.szLogonHome)
1409 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1410 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1411 FN_GLOBAL_STRING(lp_wins_server, &Globals.szWINSserver)
1412 FN_GLOBAL_STRING(lp_interfaces, &Globals.szInterfaces)
1413 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1414 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1415 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1416 FN_GLOBAL_STRING(lp_netbios_aliases, &Globals.szNetbiosAliases)
1417 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1418 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1419 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1420 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1421 FN_GLOBAL_STRING(lp_domain_groups, &Globals.szDomainGroups)
1422 FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
1423 FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
1424 FN_GLOBAL_STRING(lp_domain_admin_users, &Globals.szDomainAdminUsers)
1425 FN_GLOBAL_STRING(lp_domain_guest_users, &Globals.szDomainGuestUsers)
1426 FN_GLOBAL_STRING(lp_winbind_uid, &Globals.szWinbindUID)
1427 FN_GLOBAL_STRING(lp_winbind_gid, &Globals.szWinbindGID)
1428 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1429 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1430 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1431 FN_GLOBAL_STRING(lp_codepagedir,&Globals.szCodePageDir)
1432 #ifdef WITH_LDAP
1433 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer);
1434 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix);
1435 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter);
1436 FN_GLOBAL_STRING(lp_ldap_root, &Globals.szLdapRoot);
1437 FN_GLOBAL_STRING(lp_ldap_rootpasswd, &Globals.szLdapRootPassword);
1438 #endif /* WITH_LDAP */
1440 #ifdef WITH_SSL
1441 FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion);
1442 FN_GLOBAL_STRING(lp_ssl_hosts, &Globals.sslHostsRequire);
1443 FN_GLOBAL_STRING(lp_ssl_hosts_resign, &Globals.sslHostsResign);
1444 FN_GLOBAL_STRING(lp_ssl_cacertdir, &Globals.sslCaCertDir);
1445 FN_GLOBAL_STRING(lp_ssl_cacertfile, &Globals.sslCaCertFile);
1446 FN_GLOBAL_STRING(lp_ssl_cert, &Globals.sslCert);
1447 FN_GLOBAL_STRING(lp_ssl_privkey, &Globals.sslPrivKey);
1448 FN_GLOBAL_STRING(lp_ssl_client_cert, &Globals.sslClientCert);
1449 FN_GLOBAL_STRING(lp_ssl_client_privkey, &Globals.sslClientPrivKey);
1450 FN_GLOBAL_STRING(lp_ssl_ciphers, &Globals.sslCiphers);
1451 FN_GLOBAL_BOOL(lp_ssl_enabled, &Globals.sslEnabled);
1452 FN_GLOBAL_BOOL(lp_ssl_reqClientCert, &Globals.sslReqClientCert);
1453 FN_GLOBAL_BOOL(lp_ssl_reqServerCert, &Globals.sslReqServerCert);
1454 FN_GLOBAL_BOOL(lp_ssl_compatibility, &Globals.sslCompatibility);
1455 #endif /* WITH_SSL */
1457 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1458 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1459 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1460 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1461 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1462 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1463 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1464 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1465 FN_GLOBAL_BOOL(lp_use_rhosts, &Globals.bUseRhosts)
1466 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1467 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1468 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1469 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1470 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1471 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1472 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1473 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1474 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1475 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1476 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1477 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1478 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1479 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1480 FN_GLOBAL_BOOL(lp_unix_realname, &Globals.bUnixRealname)
1481 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1482 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1483 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1484 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1485 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1486 FN_GLOBAL_BOOL(lp_nt_smb_support, &Globals.bNTSmbSupport)
1487 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1488 FN_GLOBAL_BOOL(lp_nt_acl_support, &Globals.bNTAclSupport)
1489 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1490 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1491 FN_GLOBAL_BOOL(lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1492 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1493 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1494 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1495 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1496 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1497 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.max_wins_ttl)
1498 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1499 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1500 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1501 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1502 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1503 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1504 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1505 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1506 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1507 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1508 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1509 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1510 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1511 FN_GLOBAL_INTEGER(lp_client_code_page, &Globals.client_code_page)
1512 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1513 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1514 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1515 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1516 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1517 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1518 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1519 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1520 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1521 #ifdef WITH_LDAP
1522 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1523 #endif /* WITH_LDAP */
1524 FN_LOCAL_STRING(lp_preexec, szPreExec)
1525 FN_LOCAL_STRING(lp_postexec, szPostExec)
1526 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1527 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1528 FN_LOCAL_STRING(lp_servicename, szService)
1529 FN_LOCAL_STRING(lp_pathname, szPath)
1530 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1531 FN_LOCAL_STRING(lp_username, szUsername)
1532 FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
1533 FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
1534 FN_LOCAL_STRING(lp_valid_users, szValidUsers)
1535 FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
1536 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1537 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1538 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1539 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1540 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1541 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1542 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1543 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1544 FN_LOCAL_STRING(lp_driverfile, szDriverFile)
1545 FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)
1546 FN_LOCAL_STRING(lp_hostsallow, szHostsallow)
1547 FN_LOCAL_STRING(lp_hostsdeny, szHostsdeny)
1548 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1549 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1550 FN_LOCAL_STRING(lp_comment, comment)
1551 FN_LOCAL_STRING(lp_force_user, force_user)
1552 FN_LOCAL_STRING(lp_force_group, force_group)
1553 FN_LOCAL_STRING(lp_readlist, readlist)
1554 FN_LOCAL_STRING(lp_writelist, writelist)
1555 FN_LOCAL_STRING(lp_printer_admin, printer_admin)
1556 FN_LOCAL_STRING(lp_fstype, fstype)
1557 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1558 static FN_LOCAL_STRING(lp_volume, volume)
1559 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1560 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1561 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1562 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1563 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
1564 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1565 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1566 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1567 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1568 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1569 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1570 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1571 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1572 FN_LOCAL_BOOL(lp_status, status)
1573 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1574 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1575 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1576 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1577 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1578 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1579 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1580 FN_LOCAL_BOOL(lp_postscript, bPostscript)
1581 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1582 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1583 FN_LOCAL_BOOL(lp_locking, bLocking)
1584 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1585 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1586 #ifdef WITH_UTMP
1587 FN_LOCAL_BOOL(lp_utmp, bUtmp)
1588 #endif
1589 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1590 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1591 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1592 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1593 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1594 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1595 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1596 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1597 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1598 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1599 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1600 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1601 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1602 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1603 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1604 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1605 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1606 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1607 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1608 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1609 FN_LOCAL_INTEGER(_lp_security_mask, iSecurity_mask)
1610 FN_LOCAL_INTEGER(_lp_force_security_mode, iSecurity_force_mode)
1611 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1612 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1613 FN_LOCAL_INTEGER(_lp_dir_security_mask, iDir_Security_mask)
1614 FN_LOCAL_INTEGER(_lp_force_dir_security_mode, iDir_Security_force_mode)
1615 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1616 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1617 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1618 FN_LOCAL_INTEGER(lp_maxprintjobs, iMaxPrintJobs)
1619 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1620 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1621 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1622 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1623 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1624 /* local prototypes */
1625 static int map_parameter(char *pszParmName);
1626 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1627 static int getservicebyname(char *pszServiceName,
1628 service * pserviceDest);
1629 static void copy_service(service * pserviceDest,
1630 service * pserviceSource, BOOL *pcopymapDest);
1631 static BOOL service_ok(int iService);
1632 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1633 static BOOL do_section(char *pszSectionName);
1634 static void init_copymap(service * pservice);
1637 /***************************************************************************
1638 initialise a service to the defaults
1639 ***************************************************************************/
1640 static void init_service(service * pservice)
1642 memset((char *)pservice, '\0', sizeof(service));
1643 copy_service(pservice, &sDefault, NULL);
1647 /***************************************************************************
1648 free the dynamically allocated parts of a service struct
1649 ***************************************************************************/
1650 static void free_service(service * pservice)
1652 int i;
1653 if (!pservice)
1654 return;
1656 if (pservice->szService)
1657 DEBUG(5,
1658 ("free_service: Freeing service %s\n",
1659 pservice->szService));
1661 string_free(&pservice->szService);
1662 if (pservice->copymap)
1664 free(pservice->copymap);
1665 pservice->copymap = NULL;
1668 for (i = 0; parm_table[i].label; i++)
1669 if ((parm_table[i].type == P_STRING ||
1670 parm_table[i].type == P_USTRING) &&
1671 parm_table[i].class == P_LOCAL)
1672 string_free((char **)
1673 (((char *)pservice) +
1674 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1677 /***************************************************************************
1678 add a new service to the services array initialising it with the given
1679 service
1680 ***************************************************************************/
1681 static int add_a_service(service * pservice, char *name)
1683 int i;
1684 service tservice;
1685 int num_to_alloc = iNumServices + 1;
1687 tservice = *pservice;
1689 /* it might already exist */
1690 if (name)
1692 i = getservicebyname(name, NULL);
1693 if (i >= 0)
1694 return (i);
1697 /* find an invalid one */
1698 for (i = 0; i < iNumServices; i++)
1699 if (!pSERVICE(i)->valid)
1700 break;
1702 /* if not, then create one */
1703 if (i == iNumServices)
1705 ServicePtrs =
1706 (service **) Realloc(ServicePtrs,
1707 sizeof(service *) *
1708 num_to_alloc);
1709 if (ServicePtrs)
1710 pSERVICE(iNumServices) =
1711 (service *) malloc(sizeof(service));
1713 if (!ServicePtrs || !pSERVICE(iNumServices))
1714 return (-1);
1716 iNumServices++;
1718 else
1719 free_service(pSERVICE(i));
1721 pSERVICE(i)->valid = True;
1723 init_service(pSERVICE(i));
1724 copy_service(pSERVICE(i), &tservice, NULL);
1725 if (name)
1727 string_set(&iSERVICE(i).szService, name);
1728 unix_to_dos(iSERVICE(i).szService, True);
1730 return (i);
1733 /***************************************************************************
1734 add a new home service, with the specified home directory, defaults coming
1735 from service ifrom
1736 ***************************************************************************/
1737 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1739 int i = add_a_service(pSERVICE(iDefaultService), pszHomename);
1741 if (i < 0)
1742 return (False);
1744 if (!(*(iSERVICE(i).szPath))
1745 || strequal(iSERVICE(i).szPath, lp_pathname(-1)))
1746 string_set(&iSERVICE(i).szPath, pszHomedir);
1747 if (!(*(iSERVICE(i).comment)))
1749 pstring comment;
1750 slprintf(comment, sizeof(comment) - 1,
1751 "Home directory of %s", pszHomename);
1752 string_set(&iSERVICE(i).comment, comment);
1754 iSERVICE(i).bAvailable = sDefault.bAvailable;
1755 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1757 DEBUG(3,
1758 ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1760 return (True);
1763 /***************************************************************************
1764 add a new service, based on an old one
1765 ***************************************************************************/
1766 int lp_add_service(char *pszService, int iDefaultService)
1768 return (add_a_service(pSERVICE(iDefaultService), pszService));
1772 /***************************************************************************
1773 add the IPC service
1774 ***************************************************************************/
1775 static BOOL lp_add_ipc(void)
1777 pstring comment;
1778 int i = add_a_service(&sDefault, "IPC$");
1780 if (i < 0)
1781 return (False);
1783 slprintf(comment, sizeof(comment) - 1,
1784 "IPC Service (%s)", Globals.szServerString);
1786 string_set(&iSERVICE(i).szPath, tmpdir());
1787 string_set(&iSERVICE(i).szUsername, "");
1788 string_set(&iSERVICE(i).comment, comment);
1789 string_set(&iSERVICE(i).fstype, "IPC");
1790 iSERVICE(i).status = False;
1791 iSERVICE(i).iMaxConnections = 0;
1792 iSERVICE(i).bAvailable = True;
1793 iSERVICE(i).bRead_only = True;
1794 iSERVICE(i).bGuest_only = False;
1795 iSERVICE(i).bGuest_ok = True;
1796 iSERVICE(i).bPrint_ok = False;
1797 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1799 DEBUG(3, ("adding IPC service\n"));
1801 return (True);
1805 /***************************************************************************
1806 add a new printer service, with defaults coming from service iFrom
1807 ***************************************************************************/
1808 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
1810 char *comment = "From Printcap";
1811 int i = add_a_service(pSERVICE(iDefaultService), pszPrintername);
1813 if (i < 0)
1814 return (False);
1816 /* note that we do NOT default the availability flag to True - */
1817 /* we take it from the default service passed. This allows all */
1818 /* dynamic printers to be disabled by disabling the [printers] */
1819 /* entry (if/when the 'available' keyword is implemented!). */
1821 /* the printer name is set to the service name. */
1822 string_set(&iSERVICE(i).szPrintername, pszPrintername);
1823 string_set(&iSERVICE(i).comment, comment);
1824 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1825 /* Printers cannot be read_only. */
1826 iSERVICE(i).bRead_only = False;
1827 /* No share modes on printer services. */
1828 iSERVICE(i).bShareModes = False;
1829 /* No oplocks on printer services. */
1830 iSERVICE(i).bOpLocks = False;
1831 /* Printer services must be printable. */
1832 iSERVICE(i).bPrint_ok = True;
1834 DEBUG(3, ("adding printer service %s\n", pszPrintername));
1836 return (True);
1839 /***************************************************************************
1840 Map a parameter's string representation to something we can use.
1841 Returns False if the parameter string is not recognised, else TRUE.
1842 ***************************************************************************/
1843 static int map_parameter(char *pszParmName)
1845 int iIndex;
1847 if (*pszParmName == '-')
1848 return (-1);
1850 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1851 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1852 return (iIndex);
1854 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
1855 return (-1);
1859 /***************************************************************************
1860 Set a boolean variable from the text value stored in the passed string.
1861 Returns True in success, False if the passed string does not correctly
1862 represent a boolean.
1863 ***************************************************************************/
1864 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
1866 BOOL bRetval;
1868 bRetval = True;
1869 if (strwicmp(pszParmValue, "yes") == 0 ||
1870 strwicmp(pszParmValue, "true") == 0 ||
1871 strwicmp(pszParmValue, "1") == 0)
1872 *pb = True;
1873 else
1874 if (strwicmp(pszParmValue, "no") == 0 ||
1875 strwicmp(pszParmValue, "False") == 0 ||
1876 strwicmp(pszParmValue, "0") == 0)
1877 *pb = False;
1878 else
1880 DEBUG(0,
1881 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1882 pszParmValue));
1883 bRetval = False;
1885 return (bRetval);
1888 /***************************************************************************
1889 Find a service by name. Otherwise works like get_service.
1890 ***************************************************************************/
1891 static int getservicebyname(char *pszServiceName, service * pserviceDest)
1893 int iService;
1895 for (iService = iNumServices - 1; iService >= 0; iService--)
1896 if (VALID(iService) &&
1897 strwicmp(iSERVICE(iService).szService,
1898 pszServiceName) == 0)
1900 if (pserviceDest != NULL)
1901 copy_service(pserviceDest, pSERVICE(iService),
1902 NULL);
1903 break;
1906 return (iService);
1911 /***************************************************************************
1912 Copy a service structure to another
1914 If pcopymapDest is NULL then copy all fields
1915 ***************************************************************************/
1916 static void copy_service(service * pserviceDest,
1917 service * pserviceSource, BOOL *pcopymapDest)
1919 int i;
1920 BOOL bcopyall = (pcopymapDest == NULL);
1922 for (i = 0; parm_table[i].label; i++)
1923 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
1924 (bcopyall || pcopymapDest[i]))
1926 void *def_ptr = parm_table[i].ptr;
1927 void *src_ptr =
1928 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
1929 &sDefault);
1930 void *dest_ptr =
1931 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
1932 &sDefault);
1934 switch (parm_table[i].type)
1936 case P_BOOL:
1937 case P_BOOLREV:
1938 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
1939 break;
1941 case P_INTEGER:
1942 case P_ENUM:
1943 case P_OCTAL:
1944 *(int *)dest_ptr = *(int *)src_ptr;
1945 break;
1947 case P_CHAR:
1948 *(char *)dest_ptr = *(char *)src_ptr;
1949 break;
1951 case P_STRING:
1952 string_set(dest_ptr,
1953 *(char **)src_ptr);
1954 break;
1956 case P_USTRING:
1957 string_set(dest_ptr,
1958 *(char **)src_ptr);
1959 strupper(*(char **)dest_ptr);
1960 break;
1961 default:
1962 break;
1966 if (bcopyall)
1968 init_copymap(pserviceDest);
1969 if (pserviceSource->copymap)
1970 memcpy((void *)pserviceDest->copymap,
1971 (void *)pserviceSource->copymap,
1972 sizeof(BOOL) * NUMPARAMETERS);
1976 /***************************************************************************
1977 Check a service for consistency. Return False if the service is in any way
1978 incomplete or faulty, else True.
1979 ***************************************************************************/
1980 static BOOL service_ok(int iService)
1982 BOOL bRetval;
1984 bRetval = True;
1985 if (iSERVICE(iService).szService[0] == '\0')
1987 DEBUG(0,
1988 ("The following message indicates an internal error:\n"));
1989 DEBUG(0, ("No service name in service entry.\n"));
1990 bRetval = False;
1993 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
1994 /* I can't see why you'd want a non-printable printer service... */
1995 if (strwicmp(iSERVICE(iService).szService, PRINTERS_NAME) == 0) {
1996 if (!iSERVICE(iService).bPrint_ok) {
1997 DEBUG(0,
1998 ("WARNING: [%s] service MUST be printable!\n",
1999 iSERVICE(iService).szService));
2000 iSERVICE(iService).bPrint_ok = True;
2002 /* [printers] service must also be non-browsable. */
2003 if (iSERVICE(iService).bBrowseable)
2004 iSERVICE(iService).bBrowseable = False;
2007 if (iSERVICE(iService).szPath[0] == '\0' &&
2008 strwicmp(iSERVICE(iService).szService, HOMES_NAME) != 0)
2010 DEBUG(0,
2011 ("No path in service %s - using %s\n",
2012 iSERVICE(iService).szService, tmpdir()));
2013 string_set(&iSERVICE(iService).szPath, tmpdir());
2016 /* If a service is flagged unavailable, log the fact at level 0. */
2017 if (!iSERVICE(iService).bAvailable)
2018 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2019 iSERVICE(iService).szService));
2021 return (bRetval);
2024 static struct file_lists
2026 struct file_lists *next;
2027 char *name;
2028 time_t modtime;
2030 *file_lists = NULL;
2032 /*******************************************************************
2033 keep a linked list of all config files so we know when one has changed
2034 it's date and needs to be reloaded
2035 ********************************************************************/
2036 static void add_to_file_list(char *fname)
2038 struct file_lists *f = file_lists;
2040 while (f)
2042 if (f->name && !strcmp(f->name, fname))
2043 break;
2044 f = f->next;
2047 if (!f)
2049 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2050 if (!f)
2051 return;
2052 f->next = file_lists;
2053 f->name = strdup(fname);
2054 if (!f->name)
2056 free(f);
2057 return;
2059 file_lists = f;
2063 pstring n2;
2064 pstrcpy(n2, fname);
2065 standard_sub_basic(n2);
2066 f->modtime = file_modtime(n2);
2071 /*******************************************************************
2072 check if a config file has changed date
2073 ********************************************************************/
2074 BOOL lp_file_list_changed(void)
2076 struct file_lists *f = file_lists;
2077 DEBUG(6, ("lp_file_list_changed()\n"));
2079 while (f)
2081 pstring n2;
2082 time_t mod_time;
2084 pstrcpy(n2, f->name);
2085 standard_sub_basic(n2);
2087 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2088 f->name, n2, ctime(&f->modtime)));
2090 mod_time = file_modtime(n2);
2092 if (f->modtime != mod_time)
2094 DEBUGADD(6,
2095 ("file %s modified: %s\n", n2,
2096 ctime(&mod_time)));
2097 f->modtime = mod_time;
2098 return (True);
2100 f = f->next;
2102 return (False);
2105 /***************************************************************************
2106 Run standard_sub_basic on netbios name... needed because global_myname
2107 is not accessed through any lp_ macro.
2108 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2109 ***************************************************************************/
2111 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2113 pstring netbios_name;
2115 pstrcpy(netbios_name, pszParmValue);
2117 standard_sub_basic(netbios_name);
2118 strupper(netbios_name);
2121 * Convert from UNIX to DOS string - the UNIX to DOS converter
2122 * isn't called on the special handlers.
2124 unix_to_dos(netbios_name, True);
2125 pstrcpy(global_myname, netbios_name);
2127 DEBUG(4,
2128 ("handle_netbios_name: set global_myname to: %s\n",
2129 global_myname));
2131 return (True);
2134 /***************************************************************************
2135 Do the work of sourcing in environment variable/value pairs.
2136 ***************************************************************************/
2138 static BOOL source_env(char **lines)
2140 char *varval;
2141 size_t len;
2142 int i;
2143 char *p;
2145 for (i = 0; lines[i]; i++)
2147 char *line = lines[i];
2149 if ((len = strlen(line)) == 0)
2150 continue;
2152 if (line[len - 1] == '\n')
2153 line[--len] = '\0';
2155 if ((varval = malloc(len + 1)) == NULL)
2157 DEBUG(0, ("source_env: Not enough memory!\n"));
2158 return (False);
2161 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2162 strncpy(varval, line, len);
2163 varval[len] = '\0';
2165 p = strchr(line, (int)'=');
2166 if (p == NULL)
2168 DEBUG(4, ("source_env: missing '=': %s\n", line));
2169 continue;
2172 if (putenv(varval))
2174 DEBUG(0,
2175 ("source_env: Failed to put environment variable %s\n",
2176 varval));
2177 continue;
2180 *p = '\0';
2181 p++;
2182 DEBUG(4,
2183 ("source_env: getting var %s = %s\n", line,
2184 getenv(line)));
2187 DEBUG(4, ("source_env: returning successfully\n"));
2188 return (True);
2191 /***************************************************************************
2192 Handle the source environment operation
2193 ***************************************************************************/
2195 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2197 pstring fname;
2198 char *p = fname;
2199 BOOL result;
2200 char **lines;
2202 pstrcpy(fname, pszParmValue);
2204 standard_sub_basic(fname);
2206 string_set(ptr, pszParmValue);
2208 DEBUG(4, ("handle_source_env: checking env type\n"));
2211 * Filename starting with '|' means popen and read from stdin.
2214 if (*p == '|')
2216 lines = file_lines_pload(p + 1, NULL);
2218 else
2220 lines = file_lines_load(fname, NULL);
2223 if (!lines)
2225 DEBUG(0,
2226 ("handle_source_env: Failed to open file %s, Error was %s\n",
2227 fname, strerror(errno)));
2228 return (False);
2231 result = source_env(lines);
2232 file_lines_free(lines);
2234 return (result);
2237 /***************************************************************************
2238 handle the interpretation of the vfs object parameter
2239 *************************************************************************/
2240 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2242 /* Set string value */
2244 string_set(ptr, pszParmValue);
2246 /* Do any other initialisation required for vfs. Note that
2247 anything done here may have linking repercussions in nmbd. */
2249 return True;
2252 /***************************************************************************
2253 handle the interpretation of the coding system parameter
2254 *************************************************************************/
2255 static BOOL handle_coding_system(char *pszParmValue, char **ptr)
2257 string_set(ptr, pszParmValue);
2258 interpret_coding_system(pszParmValue);
2259 return (True);
2262 /***************************************************************************
2263 Handle the interpretation of the character set system parameter.
2264 ***************************************************************************/
2266 static char *saved_character_set = NULL;
2268 static BOOL handle_character_set(char *pszParmValue, char **ptr)
2270 /* A dependency here is that the parameter client code page should be
2271 set before this is called.
2273 string_set(ptr, pszParmValue);
2274 strupper(*ptr);
2275 saved_character_set = strdup(*ptr);
2276 interpret_character_set(*ptr, lp_client_code_page());
2277 return (True);
2280 /***************************************************************************
2281 Handle the interpretation of the client code page parameter.
2282 We handle this separately so that we can reset the character set
2283 parameter in case this came before 'client code page' in the smb.conf.
2284 ***************************************************************************/
2286 static BOOL handle_client_code_page(char *pszParmValue, char **ptr)
2288 Globals.client_code_page = atoi(pszParmValue);
2289 if (saved_character_set != NULL)
2290 interpret_character_set(saved_character_set,
2291 lp_client_code_page());
2292 codepage_initialise(lp_client_code_page());
2293 return (True);
2296 /***************************************************************************
2297 handle the valid chars lines
2298 ***************************************************************************/
2300 static BOOL handle_valid_chars(char *pszParmValue, char **ptr)
2302 string_set(ptr, pszParmValue);
2304 /* A dependency here is that the parameter client code page must be
2305 set before this is called - as calling codepage_initialise()
2306 would overwrite the valid char lines.
2308 codepage_initialise(lp_client_code_page());
2310 add_char_string(pszParmValue);
2311 return (True);
2314 /***************************************************************************
2315 handle the include operation
2316 ***************************************************************************/
2318 static BOOL handle_include(char *pszParmValue, char **ptr)
2320 pstring fname;
2321 pstrcpy(fname, pszParmValue);
2323 add_to_file_list(fname);
2325 standard_sub_basic(fname);
2327 string_set(ptr, fname);
2329 if (file_exist(fname, NULL))
2330 return (pm_process(fname, do_section, do_parameter));
2332 DEBUG(2, ("Can't find include file %s\n", fname));
2334 return (False);
2338 /***************************************************************************
2339 handle the interpretation of the copy parameter
2340 ***************************************************************************/
2341 static BOOL handle_copy(char *pszParmValue, char **ptr)
2343 BOOL bRetval;
2344 int iTemp;
2345 service serviceTemp;
2347 string_set(ptr, pszParmValue);
2349 init_service(&serviceTemp);
2351 bRetval = False;
2353 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2355 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2357 if (iTemp == iServiceIndex)
2359 DEBUG(0,
2360 ("Can't copy service %s - unable to copy self!\n",
2361 pszParmValue));
2363 else
2365 copy_service(pSERVICE(iServiceIndex),
2366 &serviceTemp,
2367 iSERVICE(iServiceIndex).copymap);
2368 bRetval = True;
2371 else
2373 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2374 pszParmValue));
2375 bRetval = False;
2378 free_service(&serviceTemp);
2379 return (bRetval);
2382 /***************************************************************************
2383 Handle winbind uid and gid allocation parameters. The format of these
2384 parameters is:
2386 [global]
2388 winbind uid = 1000-1999
2389 winbind gid = 700-899
2391 We only do simple parsing checks here. The strings are parsed into useful
2392 structures in the winbind daemon code.
2394 ***************************************************************************/
2396 /* Do some simple checks on "winbind [ug]id" parameter value */
2398 static BOOL handle_winbind_id(char *pszParmValue, char **ptr)
2400 int low, high;
2402 if (sscanf(pszParmValue, "%d-%d", &low, &high) != 2)
2404 return False;
2407 /* Parse OK */
2409 string_set(ptr, pszParmValue);
2411 return True;
2414 /***************************************************************************
2415 Handle the WINS SERVER list
2416 ***************************************************************************/
2417 static BOOL handle_wins_server_list( char *pszParmValue, char **ptr )
2419 if( !wins_srv_load_list( pszParmValue ) )
2420 return( False ); /* Parse failed. */
2422 string_set( ptr, pszParmValue );
2423 return( True );
2427 /***************************************************************************
2428 initialise a copymap
2429 ***************************************************************************/
2430 static void init_copymap(service * pservice)
2432 int i;
2433 if (pservice->copymap)
2434 free(pservice->copymap);
2435 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2436 if (!pservice->copymap)
2437 DEBUG(0,
2438 ("Couldn't allocate copymap!! (size %d)\n",
2439 (int)NUMPARAMETERS));
2440 else
2441 for (i = 0; i < NUMPARAMETERS; i++)
2442 pservice->copymap[i] = True;
2446 /***************************************************************************
2447 return the local pointer to a parameter given the service number and the
2448 pointer into the default structure
2449 ***************************************************************************/
2450 void *lp_local_ptr(int snum, void *ptr)
2452 return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr, &sDefault));
2455 /***************************************************************************
2456 Process a parameter for a particular service number. If snum < 0
2457 then assume we are in the globals
2458 ***************************************************************************/
2459 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2461 int parmnum, i;
2462 void *parm_ptr = NULL; /* where we are going to store the result */
2463 void *def_ptr = NULL;
2465 parmnum = map_parameter(pszParmName);
2467 if (parmnum < 0)
2469 DEBUG(0,
2470 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2471 return (True);
2474 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2476 DEBUG(1, ("WARNING: The \"%s\"option is deprecated\n",
2477 pszParmName));
2480 def_ptr = parm_table[parmnum].ptr;
2482 /* we might point at a service, the default service or a global */
2483 if (snum < 0)
2485 parm_ptr = def_ptr;
2487 else
2489 if (parm_table[parmnum].class == P_GLOBAL)
2491 DEBUG(0,
2492 ("Global parameter %s found in service section!\n",
2493 pszParmName));
2494 return (True);
2496 parm_ptr =
2497 ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,
2498 &sDefault);
2501 if (snum >= 0)
2503 if (!iSERVICE(snum).copymap)
2504 init_copymap(pSERVICE(snum));
2506 /* this handles the aliases - set the copymap for other entries with
2507 the same data pointer */
2508 for (i = 0; parm_table[i].label; i++)
2509 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2510 iSERVICE(snum).copymap[i] = False;
2513 /* if it is a special case then go ahead */
2514 if (parm_table[parmnum].special)
2516 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2517 return (True);
2520 /* now switch on the type of variable it is */
2521 switch (parm_table[parmnum].type)
2523 case P_BOOL:
2524 set_boolean(parm_ptr, pszParmValue);
2525 break;
2527 case P_BOOLREV:
2528 set_boolean(parm_ptr, pszParmValue);
2529 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2530 break;
2532 case P_INTEGER:
2533 *(int *)parm_ptr = atoi(pszParmValue);
2534 break;
2536 case P_CHAR:
2537 *(char *)parm_ptr = *pszParmValue;
2538 break;
2540 case P_OCTAL:
2541 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2542 break;
2544 case P_STRING:
2545 string_set(parm_ptr, pszParmValue);
2546 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2547 unix_to_dos(*(char **)parm_ptr, True);
2548 break;
2550 case P_USTRING:
2551 string_set(parm_ptr, pszParmValue);
2552 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2553 unix_to_dos(*(char **)parm_ptr, True);
2554 strupper(*(char **)parm_ptr);
2555 break;
2557 case P_GSTRING:
2558 pstrcpy((char *)parm_ptr, pszParmValue);
2559 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2560 unix_to_dos((char *)parm_ptr, True);
2561 break;
2563 case P_UGSTRING:
2564 pstrcpy((char *)parm_ptr, pszParmValue);
2565 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2566 unix_to_dos((char *)parm_ptr, True);
2567 strupper((char *)parm_ptr);
2568 break;
2570 case P_ENUM:
2571 for (i = 0; parm_table[parmnum].enum_list[i].name;
2572 i++)
2574 if (strequal
2575 (pszParmValue,
2576 parm_table[parmnum].enum_list[i].name))
2578 *(int *)parm_ptr =
2579 parm_table[parmnum].
2580 enum_list[i].value;
2581 break;
2584 break;
2585 case P_SEP:
2586 break;
2589 return (True);
2592 /***************************************************************************
2593 Process a parameter.
2594 ***************************************************************************/
2595 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2597 if (!bInGlobalSection && bGlobalOnly)
2598 return (True);
2600 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2602 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2603 pszParmName, pszParmValue));
2607 /***************************************************************************
2608 print a parameter of the specified type
2609 ***************************************************************************/
2610 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
2612 int i;
2613 switch (p->type)
2615 case P_ENUM:
2616 for (i = 0; p->enum_list[i].name; i++)
2618 if (*(int *)ptr == p->enum_list[i].value)
2620 fprintf(f, "%s",
2621 p->enum_list[i].name);
2622 break;
2625 break;
2627 case P_BOOL:
2628 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2629 break;
2631 case P_BOOLREV:
2632 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2633 break;
2635 case P_INTEGER:
2636 fprintf(f, "%d", *(int *)ptr);
2637 break;
2639 case P_CHAR:
2640 fprintf(f, "%c", *(char *)ptr);
2641 break;
2643 case P_OCTAL:
2644 fprintf(f, "%s", octal_string(*(int *)ptr));
2645 break;
2647 case P_GSTRING:
2648 case P_UGSTRING:
2649 if ((char *)ptr)
2650 fprintf(f, "%s", (char *)ptr);
2651 break;
2653 case P_STRING:
2654 case P_USTRING:
2655 if (*(char **)ptr)
2656 fprintf(f, "%s", *(char **)ptr);
2657 break;
2658 case P_SEP:
2659 break;
2664 /***************************************************************************
2665 check if two parameters are equal
2666 ***************************************************************************/
2667 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2669 switch (type)
2671 case P_BOOL:
2672 case P_BOOLREV:
2673 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2675 case P_INTEGER:
2676 case P_ENUM:
2677 case P_OCTAL:
2678 return (*((int *)ptr1) == *((int *)ptr2));
2680 case P_CHAR:
2681 return (*((char *)ptr1) == *((char *)ptr2));
2683 case P_GSTRING:
2684 case P_UGSTRING:
2686 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2687 if (p1 && !*p1)
2688 p1 = NULL;
2689 if (p2 && !*p2)
2690 p2 = NULL;
2691 return (p1 == p2 || strequal(p1, p2));
2693 case P_STRING:
2694 case P_USTRING:
2696 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2697 if (p1 && !*p1)
2698 p1 = NULL;
2699 if (p2 && !*p2)
2700 p2 = NULL;
2701 return (p1 == p2 || strequal(p1, p2));
2703 case P_SEP:
2704 break;
2706 return (False);
2709 /***************************************************************************
2710 Initialize any local varients in the sDefault table.
2711 ***************************************************************************/
2713 void init_locals(void)
2715 /* None as yet. */
2718 /***************************************************************************
2719 Process a new section (service). At this stage all sections are services.
2720 Later we'll have special sections that permit server parameters to be set.
2721 Returns True on success, False on failure.
2722 ***************************************************************************/
2723 static BOOL do_section(char *pszSectionName)
2725 BOOL bRetval;
2726 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2727 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2728 bRetval = False;
2730 /* if we were in a global section then do the local inits */
2731 if (bInGlobalSection && !isglobal)
2732 init_locals();
2734 /* if we've just struck a global section, note the fact. */
2735 bInGlobalSection = isglobal;
2737 /* check for multiple global sections */
2738 if (bInGlobalSection)
2740 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
2741 return (True);
2744 if (!bInGlobalSection && bGlobalOnly)
2745 return (True);
2747 /* if we have a current service, tidy it up before moving on */
2748 bRetval = True;
2750 if (iServiceIndex >= 0)
2751 bRetval = service_ok(iServiceIndex);
2753 /* if all is still well, move to the next record in the services array */
2754 if (bRetval)
2756 /* We put this here to avoid an odd message order if messages are */
2757 /* issued by the post-processing of a previous section. */
2758 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
2760 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
2761 < 0)
2763 DEBUG(0, ("Failed to add a new service\n"));
2764 return (False);
2768 return (bRetval);
2772 /***************************************************************************
2773 determine if a partcular base parameter is currently set to the default value.
2774 ***************************************************************************/
2775 static BOOL is_default(int i)
2777 if (!defaults_saved)
2778 return False;
2779 switch (parm_table[i].type)
2781 case P_STRING:
2782 case P_USTRING:
2783 return strequal(parm_table[i].def.svalue,
2784 *(char **)parm_table[i].ptr);
2785 case P_GSTRING:
2786 case P_UGSTRING:
2787 return strequal(parm_table[i].def.svalue,
2788 (char *)parm_table[i].ptr);
2789 case P_BOOL:
2790 case P_BOOLREV:
2791 return parm_table[i].def.bvalue ==
2792 *(BOOL *)parm_table[i].ptr;
2793 case P_CHAR:
2794 return parm_table[i].def.cvalue ==
2795 *(char *)parm_table[i].ptr;
2796 case P_INTEGER:
2797 case P_OCTAL:
2798 case P_ENUM:
2799 return parm_table[i].def.ivalue ==
2800 *(int *)parm_table[i].ptr;
2801 case P_SEP:
2802 break;
2804 return False;
2808 /***************************************************************************
2809 Display the contents of the global structure.
2810 ***************************************************************************/
2811 static void dump_globals(FILE * f)
2813 int i;
2814 fprintf(f, "# Global parameters\n[global]\n");
2816 for (i = 0; parm_table[i].label; i++)
2817 if (parm_table[i].class == P_GLOBAL &&
2818 parm_table[i].ptr &&
2819 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2821 if (defaults_saved && is_default(i))
2822 continue;
2823 fprintf(f, "\t%s = ", parm_table[i].label);
2824 print_parameter(&parm_table[i], parm_table[i].ptr, f);
2825 fprintf(f, "\n");
2829 /***************************************************************************
2830 return True if a local parameter is currently set to the global default
2831 ***************************************************************************/
2832 BOOL lp_is_default(int snum, struct parm_struct *parm)
2834 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
2836 return equal_parameter(parm->type,
2837 ((char *)pSERVICE(snum)) + pdiff,
2838 ((char *)&sDefault) + pdiff);
2842 /***************************************************************************
2843 Display the contents of a single services record.
2844 ***************************************************************************/
2845 static void dump_a_service(service * pService, FILE * f)
2847 int i;
2848 if (pService != &sDefault)
2849 fprintf(f, "\n[%s]\n", pService->szService);
2851 for (i = 0; parm_table[i].label; i++)
2852 if (parm_table[i].class == P_LOCAL &&
2853 parm_table[i].ptr &&
2854 (*parm_table[i].label != '-') &&
2855 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2857 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
2859 if (pService == &sDefault)
2861 if (defaults_saved && is_default(i))
2862 continue;
2864 else
2866 if (equal_parameter(parm_table[i].type,
2867 ((char *)pService) +
2868 pdiff,
2869 ((char *)&sDefault) +
2870 pdiff))
2871 continue;
2874 fprintf(f, "\t%s = ", parm_table[i].label);
2875 print_parameter(&parm_table[i],
2876 ((char *)pService) + pdiff, f);
2877 fprintf(f, "\n");
2882 /***************************************************************************
2883 return info about the next service in a service. snum==-1 gives the globals
2885 return NULL when out of parameters
2886 ***************************************************************************/
2887 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
2889 if (snum == -1)
2891 /* do the globals */
2892 for (; parm_table[*i].label; (*i)++)
2894 if (parm_table[*i].class == P_SEPARATOR)
2895 return &parm_table[(*i)++];
2897 if (!parm_table[*i].ptr
2898 || (*parm_table[*i].label == '-'))
2899 continue;
2901 if ((*i) > 0
2902 && (parm_table[*i].ptr ==
2903 parm_table[(*i) - 1].ptr))
2904 continue;
2906 return &parm_table[(*i)++];
2909 else
2911 service *pService = pSERVICE(snum);
2913 for (; parm_table[*i].label; (*i)++)
2915 if (parm_table[*i].class == P_SEPARATOR)
2916 return &parm_table[(*i)++];
2918 if (parm_table[*i].class == P_LOCAL &&
2919 parm_table[*i].ptr &&
2920 (*parm_table[*i].label != '-') &&
2921 ((*i) == 0 ||
2922 (parm_table[*i].ptr !=
2923 parm_table[(*i) - 1].ptr)))
2925 int pdiff =
2926 PTR_DIFF(parm_table[*i].ptr,
2927 &sDefault);
2929 if (allparameters ||
2930 !equal_parameter(parm_table[*i].type,
2931 ((char *)pService) +
2932 pdiff,
2933 ((char *)&sDefault) +
2934 pdiff))
2936 return &parm_table[(*i)++];
2942 return NULL;
2946 #if 0
2947 /***************************************************************************
2948 Display the contents of a single copy structure.
2949 ***************************************************************************/
2950 static void dump_copy_map(BOOL *pcopymap)
2952 int i;
2953 if (!pcopymap)
2954 return;
2956 printf("\n\tNon-Copied parameters:\n");
2958 for (i = 0; parm_table[i].label; i++)
2959 if (parm_table[i].class == P_LOCAL &&
2960 parm_table[i].ptr && !pcopymap[i] &&
2961 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
2963 printf("\t\t%s\n", parm_table[i].label);
2966 #endif
2968 /***************************************************************************
2969 Return TRUE if the passed service number is within range.
2970 ***************************************************************************/
2971 BOOL lp_snum_ok(int iService)
2973 return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
2977 /***************************************************************************
2978 auto-load some home services
2979 ***************************************************************************/
2980 static void lp_add_auto_services(char *str)
2982 char *s;
2983 char *p;
2984 int homes;
2986 if (!str)
2987 return;
2989 s = strdup(str);
2990 if (!s)
2991 return;
2993 homes = lp_servicenumber(HOMES_NAME);
2995 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP))
2997 char *home = get_user_home_dir(p);
2999 if (lp_servicenumber(p) >= 0)
3000 continue;
3002 if (home && homes >= 0)
3004 lp_add_home(p, homes, home);
3007 free(s);
3010 /***************************************************************************
3011 auto-load one printer
3012 ***************************************************************************/
3013 void lp_add_one_printer(char *name, char *comment)
3015 int printers = lp_servicenumber(PRINTERS_NAME);
3016 int i;
3018 if (lp_servicenumber(name) < 0)
3020 lp_add_printer(name, printers);
3021 if ((i = lp_servicenumber(name)) >= 0)
3023 string_set(&iSERVICE(i).comment, comment);
3024 iSERVICE(i).autoloaded = True;
3029 /***************************************************************************
3030 have we loaded a services file yet?
3031 ***************************************************************************/
3032 BOOL lp_loaded(void)
3034 return (bLoaded);
3037 /***************************************************************************
3038 unload unused services
3039 ***************************************************************************/
3040 void lp_killunused(BOOL (*snumused) (int))
3042 int i;
3043 for (i = 0; i < iNumServices; i++)
3045 if (!VALID(i))
3046 continue;
3048 if (!snumused || !snumused(i))
3050 iSERVICE(i).valid = False;
3051 free_service(pSERVICE(i));
3057 /***************************************************************************
3058 unload a service
3059 ***************************************************************************/
3060 void lp_killservice(int iServiceIn)
3062 if (VALID(iServiceIn))
3064 iSERVICE(iServiceIn).valid = False;
3065 free_service(pSERVICE(iServiceIn));
3069 /***************************************************************************
3070 save the curent values of all global and sDefault parameters into the
3071 defaults union. This allows swat and testparm to show only the
3072 changed (ie. non-default) parameters.
3073 ***************************************************************************/
3074 static void lp_save_defaults(void)
3076 int i;
3077 for (i = 0; parm_table[i].label; i++)
3079 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3080 continue;
3081 switch (parm_table[i].type)
3083 case P_STRING:
3084 case P_USTRING:
3085 parm_table[i].def.svalue =
3086 strdup(*(char **)parm_table[i].ptr);
3087 break;
3088 case P_GSTRING:
3089 case P_UGSTRING:
3090 parm_table[i].def.svalue =
3091 strdup((char *)parm_table[i].ptr);
3092 break;
3093 case P_BOOL:
3094 case P_BOOLREV:
3095 parm_table[i].def.bvalue =
3096 *(BOOL *)parm_table[i].ptr;
3097 break;
3098 case P_CHAR:
3099 parm_table[i].def.cvalue =
3100 *(char *)parm_table[i].ptr;
3101 break;
3102 case P_INTEGER:
3103 case P_OCTAL:
3104 case P_ENUM:
3105 parm_table[i].def.ivalue =
3106 *(int *)parm_table[i].ptr;
3107 break;
3108 case P_SEP:
3109 break;
3112 defaults_saved = True;
3115 /*******************************************************************
3116 Set the server type we will announce as via nmbd.
3117 ********************************************************************/
3118 static void set_server_role(void)
3120 server_role = ROLE_STANDALONE;
3122 switch (lp_security())
3124 case SEC_SHARE:
3126 if (lp_domain_logons())
3128 DEBUG(0,
3129 ("Server's Role (logon server) conflicts with share-level security\n"));
3131 break;
3133 case SEC_SERVER:
3134 case SEC_DOMAIN:
3136 if (lp_domain_logons())
3138 server_role = ROLE_DOMAIN_BDC;
3139 break;
3141 server_role = ROLE_DOMAIN_MEMBER;
3142 break;
3144 case SEC_USER:
3146 if (lp_domain_logons())
3148 server_role = ROLE_DOMAIN_PDC;
3149 break;
3151 break;
3153 default:
3155 DEBUG(0,
3156 ("Server's Role undefined due to unknown security mode\n"));
3162 /***************************************************************************
3163 Load the services array from the services file. Return True on success,
3164 False on failure.
3165 ***************************************************************************/
3166 BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults,
3167 BOOL add_ipc)
3169 pstring n2;
3170 BOOL bRetval;
3172 add_to_file_list(pszFname);
3174 bRetval = False;
3176 bInGlobalSection = True;
3177 bGlobalOnly = global_only;
3179 init_globals();
3181 if (save_defaults)
3183 init_locals();
3184 lp_save_defaults();
3187 pstrcpy(n2, pszFname);
3188 standard_sub_basic(n2);
3190 /* We get sections first, so have to start 'behind' to make up */
3191 iServiceIndex = -1;
3192 bRetval = pm_process(n2, do_section, do_parameter);
3194 /* finish up the last section */
3195 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3196 if (bRetval)
3197 if (iServiceIndex >= 0)
3198 bRetval = service_ok(iServiceIndex);
3200 lp_add_auto_services(lp_auto_services());
3202 if (add_ipc)
3203 lp_add_ipc();
3205 set_server_role();
3206 set_default_server_announce_type();
3208 bLoaded = True;
3210 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3211 /* if bWINSsupport is true and we are in the client */
3213 if (in_client && Globals.bWINSsupport)
3216 string_set(&Globals.szWINSserver, "127.0.0.1");
3220 return (bRetval);
3224 /***************************************************************************
3225 reset the max number of services
3226 ***************************************************************************/
3227 void lp_resetnumservices(void)
3229 iNumServices = 0;
3232 /***************************************************************************
3233 return the max number of services
3234 ***************************************************************************/
3235 int lp_numservices(void)
3237 return (iNumServices);
3240 /***************************************************************************
3241 Display the contents of the services array in human-readable form.
3242 ***************************************************************************/
3243 void lp_dump(FILE * f, BOOL show_defaults, int maxtoprint)
3245 int iService;
3247 if (show_defaults)
3249 defaults_saved = False;
3252 dump_globals(f);
3254 dump_a_service(&sDefault, f);
3256 for (iService = 0; iService < maxtoprint; iService++)
3257 lp_dump_one(f, show_defaults, iService);
3260 /***************************************************************************
3261 Display the contents of one service in human-readable form.
3262 ***************************************************************************/
3263 void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
3265 if (VALID(snum))
3267 if (iSERVICE(snum).szService[0] == '\0')
3268 return;
3269 dump_a_service(pSERVICE(snum), f);
3274 /***************************************************************************
3275 Return the number of the service with the given name, or -1 if it doesn't
3276 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3277 getservicebyname()! This works ONLY if all services have been loaded, and
3278 does not copy the found service.
3279 ***************************************************************************/
3280 int lp_servicenumber(char *pszServiceName)
3282 int iService;
3284 for (iService = iNumServices - 1; iService >= 0; iService--)
3285 if (VALID(iService) &&
3286 strequal(lp_servicename(iService), pszServiceName))
3287 break;
3289 if (iService < 0)
3290 DEBUG(7,
3291 ("lp_servicenumber: couldn't find %s\n",
3292 pszServiceName));
3294 return (iService);
3297 /*******************************************************************
3298 a useful volume label function
3299 ******************************************************************/
3300 char *volume_label(int snum)
3302 char *ret = lp_volume(snum);
3303 if (!*ret) {
3304 /* lp_volume returns a unix charset - lp_servicename returns a
3305 dos codepage - convert so volume_label() always returns UNIX.
3307 return (dos_to_unix(lp_servicename(snum), False));
3309 return (ret);
3313 /*******************************************************************
3314 Set the server type we will announce as via nmbd.
3315 ********************************************************************/
3316 static void set_default_server_announce_type(void)
3318 default_server_announce = 0;
3319 default_server_announce |= SV_TYPE_WORKSTATION;
3320 default_server_announce |= SV_TYPE_SERVER;
3321 default_server_announce |= SV_TYPE_SERVER_UNIX;
3322 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3324 switch (lp_announce_as())
3326 case ANNOUNCE_AS_NT_SERVER:
3328 default_server_announce |= SV_TYPE_SERVER_NT;
3329 /* fall through... */
3331 case ANNOUNCE_AS_NT_WORKSTATION:
3333 default_server_announce |= SV_TYPE_NT;
3334 break;
3336 case ANNOUNCE_AS_WIN95:
3338 default_server_announce |= SV_TYPE_WIN95_PLUS;
3339 break;
3341 case ANNOUNCE_AS_WFW:
3343 default_server_announce |= SV_TYPE_WFW;
3344 break;
3346 default:
3348 break;
3352 switch (lp_server_role())
3354 case ROLE_DOMAIN_MEMBER:
3356 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3357 break;
3359 case ROLE_DOMAIN_PDC:
3361 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3362 break;
3364 case ROLE_DOMAIN_BDC:
3366 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3367 break;
3369 case ROLE_STANDALONE:
3370 default:
3372 break;
3376 if (lp_time_server())
3378 default_server_announce |= SV_TYPE_TIME_SOURCE;
3381 if (lp_host_msdfs())
3383 default_server_announce |= SV_TYPE_DFS_SERVER;
3387 /***********************************************************
3388 returns role of Samba server
3389 ************************************************************/
3391 int lp_server_role(void)
3393 return server_role;
3396 /***********************************************************
3397 If we are PDC then prefer us as DMB
3398 ************************************************************/
3400 BOOL lp_domain_master(void)
3402 if (Globals.bDomainMaster == Auto)
3404 return (lp_server_role() == ROLE_DOMAIN_PDC);
3407 return Globals.bDomainMaster;
3410 /***********************************************************
3411 If we are DMB then prefer us as LMB
3412 ************************************************************/
3414 BOOL lp_preferred_master(void)
3416 if (Globals.bPreferredMaster == Auto)
3418 return (lp_local_master() && lp_domain_master());
3421 return Globals.bPreferredMaster;
3426 /*******************************************************************
3427 remove a service
3428 ********************************************************************/
3429 void lp_remove_service(int snum)
3431 pSERVICE(snum)->valid = False;
3434 /*******************************************************************
3435 copy a service
3436 ********************************************************************/
3437 void lp_copy_service(int snum, char *new_name)
3439 char *oldname = lp_servicename(snum);
3440 do_section(new_name);
3441 if (snum >= 0)
3443 snum = lp_servicenumber(new_name);
3444 if (snum >= 0)
3445 lp_do_parameter(snum, "copy", oldname);
3450 /*******************************************************************
3451 Get the default server type we will announce as via nmbd.
3452 ********************************************************************/
3453 int lp_default_server_announce(void)
3455 return default_server_announce;
3458 /*******************************************************************
3459 Split the announce version into major and minor numbers.
3460 ********************************************************************/
3461 int lp_major_announce_version(void)
3463 static BOOL got_major = False;
3464 static int major_version = DEFAULT_MAJOR_VERSION;
3465 char *vers;
3466 char *p;
3468 if (got_major)
3469 return major_version;
3471 got_major = True;
3472 if ((vers = lp_announce_version()) == NULL)
3473 return major_version;
3475 if ((p = strchr(vers, '.')) == 0)
3476 return major_version;
3478 *p = '\0';
3479 major_version = atoi(vers);
3480 return major_version;
3483 int lp_minor_announce_version(void)
3485 static BOOL got_minor = False;
3486 static int minor_version = DEFAULT_MINOR_VERSION;
3487 char *vers;
3488 char *p;
3490 if (got_minor)
3491 return minor_version;
3493 got_minor = True;
3494 if ((vers = lp_announce_version()) == NULL)
3495 return minor_version;
3497 if ((p = strchr(vers, '.')) == 0)
3498 return minor_version;
3500 p++;
3501 minor_version = atoi(p);
3502 return minor_version;
3505 /***********************************************************
3506 Set the global name resolution order (used in smbclient).
3507 ************************************************************/
3509 void lp_set_name_resolve_order(char *new_order)
3511 Globals.szNameResolveOrder = new_order;
3514 /***********************************************************
3515 Functions to return the current security masks/modes. If
3516 set to -1 then return the create mask/mode instead.
3517 ************************************************************/
3519 int lp_security_mask(int snum)
3521 int val = _lp_security_mask(snum);
3522 if (val == -1)
3523 return lp_create_mask(snum);
3524 return val;
3527 int lp_force_security_mode(int snum)
3529 int val = _lp_force_security_mode(snum);
3530 if (val == -1)
3531 return lp_force_create_mode(snum);
3532 return val;
3535 int lp_dir_security_mask(int snum)
3537 int val = _lp_dir_security_mask(snum);
3538 if (val == -1)
3539 return lp_dir_mask(snum);
3540 return val;
3543 int lp_force_dir_security_mode(int snum)
3545 int val = _lp_force_dir_security_mode(snum);
3546 if (val == -1)
3547 return lp_force_dir_mode(snum);
3548 return val;
3551 char *lp_printername(int snum)
3553 char *ret = _lp_printername(snum);
3554 if (ret == NULL || (ret != NULL && *ret == '\0'))
3555 ret = lp_servicename(snum);
3557 return ret;