- got fed up of vuser_db spewing 150 lines of trash, made it possible
[Samba.git] / source / param / loadparm.c
blob44de275eeff598e334fba4c1fc3c6b88cd9a5afe
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 extern BOOL use_getwd_cache;
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 *szLockDir;
108 char *szRootdir;
109 char *szDefaultService;
110 char *szDfree;
111 char *szMsgCommand;
112 char *szHostsEquiv;
113 char *szServerString;
114 char *szAutoServices;
115 char *szPasswdProgram;
116 char *szPasswdChat;
117 char *szLogFile;
118 char *szConfigFile;
119 char *szSMBPasswdFile;
120 char *szSAMDirectory;
121 char *szPasswordServer;
122 char *szSocketOptions;
123 char *szValidChars;
124 char *szWorkGroup;
125 char *szTrustedDomains;
126 char *szTrustingDomains;
127 char *szUsernameMap;
128 char *szAliasnameMap;
129 char *szGroupnameMap;
130 char *szBuiltinnameMap;
131 char *szBuiltinRidFile;
132 char *szNTusernameMap;
133 char *szCharacterSet;
134 char *szLogonScript;
135 char *szLogonPath;
136 char *szLogonDrive;
137 char *szLogonHome;
138 char *szSmbrun;
139 char *szWINSserver;
140 char *szCodingSystem;
141 char *szInterfaces;
142 char *szRemoteAnnounce;
143 char *szRemoteBrowseSync;
144 char *szSocketAddress;
145 char *szNISHomeMapName;
146 char *szAnnounceVersion; /* This is initialised in init_globals */
147 char *szNetbiosAliases;
148 char *szDomainOtherSIDs;
149 char *szDriverFile;
150 char *szNameResolveOrder;
151 char *szDfsMap;
152 #if defined(WITH_LDAP) || defined(WITH_NT5LDAP)
153 char *szLdapServer;
154 char *szLdapBindAs;
155 char *szLdapPasswdFile;
156 char *szLdapSuffix;
157 #endif /* WITH_LDAP */
158 #ifdef WITH_NT5LDAP
159 char *szLdapUrl;
160 char *szLdapRealm;
161 char *szLdapComputersSubcontext;
162 char *szLdapUsersSubcontext;
163 char *szLdapBuiltinSubcontext;
164 #endif /* WITH_NT5LDAP */
165 char *szPanicAction;
166 char *szAddUserScript;
167 char *szDelUserScript;
168 char *szWINSHook;
169 char *szNtForms;
170 char *szNtDriverFile;
171 #ifdef WITH_UTMP
172 char *szUtmpDir;
173 #endif /* WITH_UTMP */
174 char *szSourceEnv;
175 char *szWinbindUID;
176 char *szWinbindGID;
177 int max_log_size;
178 int mangled_stack;
179 int max_xmit;
180 int max_mux;
181 int max_open_files;
182 int max_packet;
183 int pwordlevel;
184 int unamelevel;
185 int deadtime;
186 int maxprotocol;
187 int security;
188 int maxdisksize;
189 int lpqcachetime;
190 int syslog;
191 int os_level;
192 int max_ttl;
193 int max_wins_ttl;
194 int min_wins_ttl;
195 int ReadSize;
196 int lm_announce;
197 int lm_interval;
198 int shmem_size;
199 int client_code_page;
200 int announce_as; /* This is initialised in init_globals */
201 int machine_password_timeout;
202 int change_notify_timeout;
203 int stat_cache_size;
204 int map_to_guest;
205 int min_passwd_length;
206 int oplock_break_wait_time;
207 #if defined(WITH_LDAP) || defined(WITH_NT5LDAP)
208 int ldap_port;
209 int ldap_protocol_version;
210 #endif /* WITH_LDAP */
211 #ifdef WITH_SSL
212 int sslVersion;
213 char *sslHostsRequire;
214 char *sslHostsResign;
215 char *sslCaCertDir;
216 char *sslCaCertFile;
217 char *sslCert;
218 char *sslPrivKey;
219 char *sslClientCert;
220 char *sslClientPrivKey;
221 char *sslCiphers;
222 BOOL sslEnabled;
223 BOOL sslReqClientCert;
224 BOOL sslReqServerCert;
225 BOOL sslCompatibility;
226 #endif /* WITH_SSL */
227 BOOL bDNSproxy;
228 BOOL bWINSsupport;
229 BOOL bWINSproxy;
230 BOOL bLocalMaster;
231 BOOL bPreferredMaster;
232 BOOL bDomainMaster;
233 BOOL bDomainLogons;
234 BOOL bEncryptPasswords;
235 BOOL bUpdateEncrypt;
236 BOOL bServerSChannel;
237 BOOL bClientSChannel;
238 BOOL bServerNTLMv2;
239 BOOL bClientNTLMv2;
240 BOOL bStripDot;
241 BOOL bNullPasswords;
242 BOOL bLoadPrinters;
243 BOOL bUseRhosts;
244 BOOL bReadRaw;
245 BOOL bWriteRaw;
246 BOOL bReadPrediction;
247 BOOL bReadbmpx;
248 BOOL bSyslogOnly;
249 BOOL bBrowseList;
250 BOOL bUnixRealname;
251 BOOL bNISHomeMap;
252 BOOL bTimeServer;
253 BOOL bBindInterfacesOnly;
254 BOOL bUnixPasswdSync;
255 BOOL bPasswdChatDebug;
256 BOOL bTimestampLogs;
257 BOOL bNTSmbSupport;
258 BOOL bNTPipeSupport;
259 BOOL bNTAclSupport;
260 BOOL bStatCache;
261 BOOL bKernelOplocks;
262 #if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
263 char *sMysqlDatabase;
264 char *sMysqlTable;
265 char *sMysqlUser;
266 char *sMysqlHost;
267 char *sMysqlPassFile;
268 #endif
269 BOOL bDebugHiresTimestamp;
270 BOOL bDebugPid;
271 BOOL bDebugUid;
272 BOOL bHostMSDfs;
273 } global;
275 static global Globals;
280 * This structure describes a single service.
282 typedef struct
284 BOOL valid;
285 char *szService;
286 char *szPath;
287 char *szUsername;
288 char *szGuestaccount;
289 char *szInvalidUsers;
290 char *szValidUsers;
291 char *szAdminUsers;
292 char *szCopy;
293 char *szInclude;
294 char *szPreExec;
295 char *szPostExec;
296 char *szRootPreExec;
297 char *szRootPostExec;
298 char *szPrintcommand;
299 char *szLpqcommand;
300 char *szLprmcommand;
301 char *szLppausecommand;
302 char *szLpresumecommand;
303 char *szQueuepausecommand;
304 char *szQueueresumecommand;
305 char *szPrintername;
306 char *szPrinterDriver;
307 char *szPrinterDriverLocation;
308 char *szDontdescend;
309 char *szHostsallow;
310 char *szHostsdeny;
311 char *szMagicScript;
312 char *szMagicOutput;
313 char *szMangledMap;
314 char *szVetoFiles;
315 char *szHideFiles;
316 char *szVetoOplockFiles;
317 char *comment;
318 char *force_user;
319 char *force_group;
320 char *readlist;
321 char *writelist;
322 char *volume;
323 char *fstype;
324 char *szVfsObjectFile;
325 char *szVfsOptions;
326 int iMinPrintSpace;
327 int iWriteCacheSize;
328 int iCreate_mask;
329 int iCreate_force_mode;
330 int iSecurity_mask;
331 int iSecurity_force_mode;
332 int iDir_mask;
333 int iDir_force_mode;
334 int iDir_Security_mask;
335 int iDir_Security_force_mode;
336 int iMaxConnections;
337 int iDefaultCase;
338 int iPrinting;
339 int iOplockContentionLimit;
340 BOOL bAlternatePerm;
341 BOOL bPreexecClose;
342 BOOL bRootpreexecClose;
343 BOOL bRevalidate;
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 #ifdef MS_DFS
387 char *szDfsMap;
388 BOOL bDfsMapLoaded;
389 #endif
390 char dummy[3]; /* for alignment */
391 } service;
394 /* This is a default service used to prime a services structure */
395 static service sDefault =
397 True, /* valid */
398 NULL, /* szService */
399 NULL, /* szPath */
400 NULL, /* szUsername */
401 NULL, /* szGuestAccount - this is set in init_globals() */
402 NULL, /* szInvalidUsers */
403 NULL, /* szValidUsers */
404 NULL, /* szAdminUsers */
405 NULL, /* szCopy */
406 NULL, /* szInclude */
407 NULL, /* szPreExec */
408 NULL, /* szPostExec */
409 NULL, /* szRootPreExec */
410 NULL, /* szRootPostExec */
411 NULL, /* szPrintcommand */
412 NULL, /* szLpqcommand */
413 NULL, /* szLprmcommand */
414 NULL, /* szLppausecommand */
415 NULL, /* szLpresumecommand */
416 NULL, /* szQueuepausecommand */
417 NULL, /* szQueueresumecommand */
418 NULL, /* szPrintername */
419 NULL, /* szPrinterDriver - this is set in init_globals() */
420 NULL, /* szPrinterDriverLocation */
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, /* volume */
436 NULL, /* fstype */
437 NULL, /* vfs object */
438 NULL, /* vfs options */
439 0, /* iMinPrintSpace */
440 0, /* iWriteCacheSize */
441 0744, /* iCreate_mask */
442 0000, /* iCreate_force_mode */
443 -1, /* iSecurity_mask */
444 -1, /* iSecurity_force_mode */
445 0755, /* iDir_mask */
446 0000, /* iDir_force_mode */
447 -1, /* iDir_Security_mask */
448 -1, /* iDir_Security_force_mode */
449 0, /* iMaxConnections */
450 CASE_LOWER, /* iDefaultCase */
451 DEFAULT_PRINTING, /* iPrinting */
452 2, /* iOplockContentionLimit */
453 False, /* bAlternatePerm */
454 False, /* bPreexecClose */
455 False, /* bRootpreexecClose */
456 False, /* revalidate */
457 False, /* case sensitive */
458 True, /* case preserve */
459 True, /* short case preserve */
460 False, /* case mangle */
461 True, /* status */
462 True, /* bHideDotFiles */
463 True, /* bBrowseable */
464 True, /* bAvailable */
465 True, /* bRead_only */
466 True, /* bNo_set_dir */
467 False, /* bGuest_only */
468 False, /* bGuest_ok */
469 False, /* bPrint_ok */
470 False, /* bPostscript */
471 False, /* bMap_system */
472 False, /* bMap_hidden */
473 True, /* bMap_archive */
474 True, /* bLocking */
475 False, /* bStrictLocking */
476 True, /* bPosixLocking */
477 #ifdef WITH_UTMP
478 False, /* bUtmp */
479 #endif
480 True, /* bShareModes */
481 True, /* bOpLocks */
482 True, /* bLevel2OpLocks */
483 False, /* bOnlyUser */
484 True, /* bMangledNames */
485 True, /* bWidelinks */
486 True, /* bSymlinks */
487 False, /* bSyncAlways */
488 False, /* bStrictSync */
489 '~', /* magic char */
490 NULL, /* copymap */
491 False, /* bDeleteReadonly */
492 False, /* bFakeOplocks */
493 False, /* bDeleteVetoFiles */
494 False, /* bDosFiletimes */
495 False, /* bDosFiletimeResolution */
496 False, /* bFakeDirCreateTimes */
497 True, /* bBlockingLocks */
498 False, /* bInheritPerms */
499 #ifdef MS_DFS
500 NULL, /* MS Dfs map path */
501 False, /* bDfsMapLoaded */
502 #endif
503 "" /* dummy */
508 /* Local variables */
509 static service **ServicePtrs = NULL;
510 static int iNumServices = 0;
511 static int iServiceIndex = 0;
512 static BOOL bInGlobalSection = True;
513 static BOOL bGlobalOnly = False;
514 static int server_role;
515 static int default_server_announce;
517 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
519 /* prototypes for the special type handlers */
520 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
521 static BOOL handle_include(char *pszParmValue, char **ptr);
522 static BOOL handle_copy(char *pszParmValue, char **ptr);
523 static BOOL handle_character_set(char *pszParmValue,char **ptr);
524 static BOOL handle_coding_system(char *pszParmValue,char **ptr);
525 static BOOL handle_client_code_page(char *pszParmValue,char **ptr);
526 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
527 static BOOL handle_source_env(char *pszParmValue,char **ptr);
528 static BOOL handle_netbios_name(char *pszParmValue,char **ptr);
529 static BOOL handle_winbind_id(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[] = {{PROTOCOL_NT1, "NT1"}, {PROTOCOL_LANMAN2, "LANMAN2"},
535 {PROTOCOL_LANMAN1, "LANMAN1"}, {PROTOCOL_CORE,"CORE"},
536 {PROTOCOL_COREPLUS, "COREPLUS"},
537 {PROTOCOL_COREPLUS, "CORE+"}, {-1, NULL}};
539 static struct enum_list enum_security[] = {{SEC_SHARE, "SHARE"}, {SEC_USER, "USER"},
540 {SEC_SERVER, "SERVER"}, {SEC_DOMAIN, "DOMAIN"},
541 {-1, NULL}};
543 static struct enum_list enum_printing[] = {{PRINT_SYSV, "sysv"}, {PRINT_AIX, "aix"},
544 {PRINT_HPUX, "hpux"}, {PRINT_BSD, "bsd"},
545 {PRINT_QNX, "qnx"}, {PRINT_PLP, "plp"},
546 {PRINT_LPRNG, "lprng"}, {PRINT_SOFTQ, "softq"},
547 {PRINT_CUPS, "cups"}, {-1, NULL}};
549 static struct enum_list enum_bool_auto[] = {{True, "True"},
550 {False, "False"},
551 {True, "Yes"},
552 {False, "No"},
553 {Auto, "Auto"},
554 {-1, NULL}};
556 /* Types of machine we can announce as. */
557 #define ANNOUNCE_AS_NT_SERVER 1
558 #define ANNOUNCE_AS_WIN95 2
559 #define ANNOUNCE_AS_WFW 3
560 #define ANNOUNCE_AS_NT_WORKSTATION 4
562 static struct enum_list enum_announce_as[] = {{ANNOUNCE_AS_NT_SERVER, "NT"}, {ANNOUNCE_AS_NT_SERVER, "NT Server"}, {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"}, {ANNOUNCE_AS_WIN95, "win95"}, {ANNOUNCE_AS_WFW, "WfW"}, {-1, NULL}};
564 static struct enum_list enum_case[] = {{CASE_LOWER, "lower"}, {CASE_UPPER, "upper"}, {-1, NULL}};
566 static struct enum_list enum_lm_announce[] = {{0, "False"}, {1, "True"}, {2, "Auto"}, {-1, NULL}};
569 Do you want session setups at user level security with a invalid
570 password to be rejected or allowed in as guest? WinNT rejects them
571 but it can be a pain as it means "net view" needs to use a password
573 You have 3 choices in the setting of map_to_guest:
575 "Never" means session setups with an invalid password
576 are rejected. This is the default.
578 "Bad User" means session setups with an invalid password
579 are rejected, unless the username does not exist, in which case it
580 is treated as a guest login
582 "Bad Password" means session setups with an invalid password
583 are treated as a guest login
585 Note that map_to_guest only has an effect in user or server
586 level security.
589 static struct enum_list enum_map_to_guest[] = {{NEVER_MAP_TO_GUEST, "Never"}, {MAP_TO_GUEST_ON_BAD_USER, "Bad User"}, {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"}, {-1, NULL}};
591 #ifdef WITH_SSL
592 static struct enum_list enum_ssl_version[] = {{SMB_SSL_V2, "ssl2"}, {SMB_SSL_V3, "ssl3"},
593 {SMB_SSL_V23, "ssl2or3"}, {SMB_SSL_TLS1, "tls1"}, {-1, NULL}};
594 #endif
596 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
597 static struct parm_struct parm_table[] =
599 {"Base Options", P_SEP, P_SEPARATOR},
600 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
601 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, handle_client_code_page, NULL, 0},
602 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC|FLAG_SHARE|FLAG_PRINT|FLAG_DOS_STRING},
603 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC|FLAG_SHARE|FLAG_PRINT|FLAG_DOS_STRING},
604 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING},
605 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC|FLAG_DOS_STRING},
606 {"netbios name", P_UGSTRING,P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC|FLAG_DOS_STRING},
607 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING},
608 {"netbios scope", P_UGSTRING,P_GLOBAL, global_scope, NULL, NULL, FLAG_DOS_STRING},
609 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC|FLAG_DOS_STRING},
610 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC},
611 {"bind interfaces only", P_BOOL,P_GLOBAL, &Globals.bBindInterfacesOnly,NULL, NULL, 0},
613 {"Security Options", P_SEP, P_SEPARATOR},
615 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC},
616 {"encrypt passwords",P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC},
617 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
618 {"server schannel", P_ENUM, P_GLOBAL, &Globals.bServerSChannel, NULL, enum_bool_auto, FLAG_BASIC},
619 {"client schannel", P_ENUM, P_GLOBAL, &Globals.bClientSChannel, NULL, enum_bool_auto, FLAG_BASIC},
620 {"server ntlmv2", P_ENUM, P_GLOBAL, &Globals.bServerNTLMv2, NULL, enum_bool_auto, FLAG_BASIC},
621 {"client ntlmv2", P_ENUM, P_GLOBAL, &Globals.bClientNTLMv2, NULL, enum_bool_auto, FLAG_BASIC},
622 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
623 {"alternate permissions",P_BOOL,P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL|FLAG_DEPRECATED},
624 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
625 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
626 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
627 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
628 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
629 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
630 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
631 {"sam directory", P_STRING, P_GLOBAL, &Globals.szSAMDirectory, NULL, NULL, 0},
632 #if USE_SMBFILE_DB
633 {"smb passgrp file", P_STRING, P_GLOBAL, &Globals.szSMBPassGroupFile, NULL, NULL, 0},
634 #endif
635 #if USE_SMBGROUP_DB
636 {"smb group file", P_STRING, P_GLOBAL, &Globals.szSMBGroupFile, NULL, NULL, 0},
637 {"smb alias file", P_STRING, P_GLOBAL, &Globals.szSMBAliasFile, NULL, NULL, 0},
638 #endif
639 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
640 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
641 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
642 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
643 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
644 {"passwd chat debug",P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
645 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
646 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
647 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
648 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
649 {"revalidate", P_BOOL, P_LOCAL, &sDefault.bRevalidate, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
650 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
651 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
652 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
653 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
654 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC|FLAG_SHARE|FLAG_PRINT|FLAG_GLOBAL},
655 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
656 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
657 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
658 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
659 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
660 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
661 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
662 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
663 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC|FLAG_SHARE},
664 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
665 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
666 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
667 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
668 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
669 {"force create mode",P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
670 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
671 {"force security mode",P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode,NULL,NULL, FLAG_GLOBAL|FLAG_SHARE},
672 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
673 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
674 {"force directory mode", P_OCTAL,P_LOCAL,&sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
675 {"directory security mask",P_OCTAL,P_LOCAL,&sDefault.iDir_Security_mask,NULL, NULL, FLAG_GLOBAL|FLAG_SHARE},
676 {"force directory security mode",P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode,NULL,NULL,FLAG_GLOBAL|FLAG_SHARE},
677 {"inherit permissions",P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
678 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
679 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
680 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC|FLAG_SHARE|FLAG_PRINT},
681 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
682 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
683 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL|FLAG_BASIC|FLAG_SHARE|FLAG_PRINT},
684 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
685 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL|FLAG_BASIC|FLAG_SHARE|FLAG_PRINT},
686 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
688 #ifdef WITH_SSL
689 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
691 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0 },
692 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0 },
693 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0} ,
694 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0 },
695 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0 },
696 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0 },
697 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0 },
698 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0 },
699 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0 },
700 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL , 0},
701 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL , 0},
702 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0 },
703 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
704 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0 },
705 #endif /* WITH_SSL */
707 {"Logging Options", P_SEP, P_SEPARATOR},
709 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_BASIC},
710 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, 0},
711 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
712 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
713 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
714 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
715 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
716 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
717 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
718 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
719 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
720 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL|FLAG_SHARE|FLAG_PRINT},
722 {"Protocol Options", P_SEP, P_SEPARATOR},
724 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
725 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
726 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
727 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
728 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
729 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
730 {"nt acl support", P_BOOL, P_GLOBAL, &Globals.bNTAclSupport, NULL, NULL, 0},
731 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
732 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
733 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
734 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
735 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
736 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
737 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
738 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
739 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
740 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
741 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
743 {"Tuning Options", P_SEP, P_SEPARATOR},
745 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
746 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
747 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
748 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
749 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
750 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
751 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
752 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
753 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
754 {"read prediction", P_BOOL, P_GLOBAL, &Globals.bReadPrediction, NULL, NULL, 0},
755 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
756 {"shared mem size", P_INTEGER, P_GLOBAL, &Globals.shmem_size, NULL, NULL, 0},
757 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
758 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
759 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
760 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
761 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
763 {"Printing Options", P_SEP, P_SEPARATOR},
764 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
765 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
766 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
767 {"printer driver file", P_STRING, P_GLOBAL, &Globals.szDriverFile, NULL, NULL, FLAG_PRINT},
768 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
769 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
770 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
771 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT|FLAG_GLOBAL},
772 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
773 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
774 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
775 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
776 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand,NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
777 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
778 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
780 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
781 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, 0},
782 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT},
783 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
784 {"nt forms file", P_STRING, P_GLOBAL, &Globals.szNtForms, NULL, NULL, FLAG_GLOBAL},
785 {"nt printer driver",P_STRING, P_GLOBAL, &Globals.szNtDriverFile, NULL, NULL, FLAG_GLOBAL},
787 {"Filename Handling", P_SEP, P_SEPARATOR},
788 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
789 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
790 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
791 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
792 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
793 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
794 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
795 {"short preserve case",P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve,NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
796 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
797 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
798 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
799 {"delete veto files",P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
800 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL|FLAG_DOS_STRING},
801 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL|FLAG_DOS_STRING},
802 {"veto oplock files",P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles,NULL, NULL, FLAG_SHARE|FLAG_GLOBAL|FLAG_DOS_STRING},
803 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
804 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
805 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
806 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
807 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
808 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
810 {"Domain Options", P_SEP, P_SEPARATOR},
812 {"trusted domains", P_STRING, P_GLOBAL, &Globals.szTrustedDomains, NULL, NULL, 0},
813 {"trusting domains", P_STRING, P_GLOBAL, &Globals.szTrustingDomains, NULL, NULL, 0},
814 {"local group map", P_STRING, P_GLOBAL, &Globals.szAliasnameMap, NULL, NULL, 0},
815 {"domain alias map", P_STRING, P_GLOBAL, &Globals.szAliasnameMap, NULL, NULL, 0},
816 {"domain group map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
817 {"builtin group map", P_STRING, P_GLOBAL, &Globals.szBuiltinnameMap, NULL, NULL, 0},
818 {"domain builtin map", P_STRING, P_GLOBAL, &Globals.szBuiltinnameMap, NULL, NULL, 0},
819 {"builtin rid file", P_STRING, P_GLOBAL, &Globals.szBuiltinRidFile, NULL, NULL, 0},
820 {"domain user map", P_STRING, P_GLOBAL, &Globals.szNTusernameMap, NULL, NULL, 0},
821 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
823 {"Logon Options", P_SEP, P_SEPARATOR},
824 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
825 {"delete user script",P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
826 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
827 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
828 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
829 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
830 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
832 {"Browse Options", P_SEP, P_SEPARATOR},
834 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
835 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_lm_announce, 0},
836 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
837 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
838 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
839 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
840 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
841 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
842 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC|FLAG_SHARE|FLAG_PRINT},
843 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
845 {"WINS Options", P_SEP, P_SEPARATOR},
847 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
848 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
849 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL, NULL, FLAG_BASIC},
850 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
851 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
853 {"Locking Options", P_SEP, P_SEPARATOR},
854 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
855 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
856 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
857 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
858 #ifdef WITH_UTMP
859 {"utmp", P_BOOL, P_LOCAL, &sDefault.bUtmp, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
860 #endif
861 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
862 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
863 {"oplock break wait time",P_INTEGER,P_GLOBAL,&Globals.oplock_break_wait_time,NULL,NULL,FLAG_GLOBAL},
864 {"oplock contention limit",P_INTEGER,P_LOCAL,&sDefault.iOplockContentionLimit,NULL,NULL,FLAG_SHARE|FLAG_GLOBAL},
865 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
866 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
867 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
869 #if defined(WITH_LDAP) || defined(WITH_NT5LDAP)
870 {"Ldap Options", P_SEP, P_SEPARATOR},
872 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
873 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
874 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
875 {"ldap bind as", P_STRING, P_GLOBAL, &Globals.szLdapBindAs, NULL, NULL, 0},
876 {"ldap passwd file", P_STRING, P_GLOBAL, &Globals.szLdapPasswdFile, NULL, NULL, 0},
877 #endif /* WITH_LDAP */
879 #ifdef WITH_NT5LDAP
880 {"ldap realm", P_STRING, P_GLOBAL, &Globals.szLdapRealm, NULL, NULL, 0},
881 {"ldap protocol version", P_INTEGER, P_GLOBAL, &Globals.ldap_protocol_version, NULL, NULL, 0},
882 {"ldap url", P_STRING, P_GLOBAL, &Globals.szLdapUrl, NULL, NULL, 0},
883 {"ldap users subcontext", P_STRING, P_GLOBAL, &Globals.szLdapComputersSubcontext, NULL, NULL, 0},
884 {"ldap builtin subcontext", P_STRING, P_GLOBAL, &Globals.szLdapUsersSubcontext, NULL, NULL, 0},
885 {"ldap computers subcontext", P_STRING, P_GLOBAL, &Globals.szLdapBuiltinSubcontext, NULL, NULL, 0},
886 #endif /* WITH_NT5LDAP */
888 #if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
889 {"MySQL Options", P_SEP, P_SEPARATOR},
890 {"mysql host", P_STRING, P_GLOBAL, &Globals.sMysqlHost, NULL, NULL, 0},
891 {"mysql user", P_STRING, P_GLOBAL, &Globals.sMysqlUser, NULL, NULL, 0},
892 {"mysql pass file", P_STRING, P_GLOBAL, &Globals.sMysqlPassFile, NULL, NULL, 0},
893 {"mysql database", P_STRING, P_GLOBAL, &Globals.sMysqlDatabase, NULL, NULL, 0},
894 {"mysql table", P_STRING, P_GLOBAL, &Globals.sMysqlTable, NULL, NULL, 0},
895 #endif /* MYSQL */
897 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
899 {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
900 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
901 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
902 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
903 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
904 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
905 #ifdef WITH_UTMP
906 {"utmp dir", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
907 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
908 #endif /* WITH_UTMP */
909 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
910 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
911 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
912 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
913 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
914 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
915 {"remote browse sync",P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync,NULL, NULL, 0},
916 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
917 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
918 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
919 {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0},
920 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
921 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
922 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
923 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
924 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE|FLAG_PRINT},
925 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
926 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
927 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE|FLAG_PRINT},
928 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE|FLAG_PRINT},
929 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose,NULL, NULL, FLAG_SHARE},
930 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE|FLAG_PRINT},
931 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC|FLAG_SHARE|FLAG_PRINT},
932 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE},
933 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
934 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
935 {"source environment",P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env,NULL,0},
936 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
937 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
938 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
939 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
940 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
941 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
942 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
943 {"dos filetime resolution",P_BOOL,P_LOCAL,&sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
945 {"fake directory create times", P_BOOL,P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
946 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
948 {"VFS options", P_SEP, P_SEPARATOR},
950 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, 0},
951 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, 0},
953 #ifdef MS_DFS
954 {"dfs map", P_STRING, P_LOCAL, &sDefault.szDfsMap, NULL, NULL, FLAG_SHARE},
955 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_GLOBAL},
956 #endif
958 {"Winbind options", P_SEP, P_SEPARATOR},
960 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_id, NULL, 0},
961 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_id, NULL, 0},
963 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
968 /***************************************************************************
969 Initialise the global parameter structure.
970 ***************************************************************************/
971 static void init_globals(void)
973 static BOOL done_init = False;
974 pstring s;
976 if (!done_init)
978 int i;
979 memset((void *)&Globals,'\0',sizeof(Globals));
981 for (i = 0; parm_table[i].label; i++)
982 if ((parm_table[i].type == P_STRING ||
983 parm_table[i].type == P_USTRING) &&
984 parm_table[i].ptr)
985 string_set(parm_table[i].ptr,"");
987 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
988 string_set(&sDefault.szPrinterDriver, "NULL");
989 string_set(&sDefault.fstype, FSTYPE_STRING);
991 done_init = True;
995 DEBUG(3,("Initialising global parameters\n"));
997 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
998 string_set(&Globals.szSAMDirectory, SAM_DIR);
999 #if USE_SMBFILE_DB
1000 string_set(&Globals.szSMBPassGroupFile, SMB_PASSGRP_FILE);
1001 #endif
1002 #if USE_SMBGROUP_DB
1003 string_set(&Globals.szSMBGroupFile, SMB_GROUP_FILE);
1004 string_set(&Globals.szSMBAliasFile, SMB_ALIAS_FILE);
1005 #endif
1006 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1007 string_set(&Globals.szWorkGroup, WORKGROUP);
1008 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1009 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1010 string_set(&Globals.szDriverFile, DRIVERFILE);
1011 string_set(&Globals.szNtForms, FORMSFILE);
1012 string_set(&Globals.szNtDriverFile, NTDRIVERSDIR);
1013 string_set(&Globals.szLockDir, LOCKDIR);
1014 string_set(&Globals.szRootdir, "/");
1015 #ifdef WITH_UTMP
1016 string_set(&Globals.szUtmpDir, "");
1017 #endif /* WITH_UTMP */
1018 string_set(&Globals.szSmbrun, SMBRUN);
1019 string_set(&Globals.szSocketAddress, "0.0.0.0");
1020 pstrcpy(s, "Samba ");
1021 pstrcat(s, VERSION);
1022 string_set(&Globals.szServerString,s);
1023 slprintf(s,sizeof(s)-1, "%d.%d", DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION);
1024 string_set(&Globals.szAnnounceVersion,s);
1026 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1028 string_set(&Globals.szLogonDrive, "");
1029 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1030 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1031 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1033 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1035 Globals.bLoadPrinters = True;
1036 Globals.bUseRhosts = False;
1037 Globals.max_packet = 65535;
1038 Globals.mangled_stack = 50;
1039 Globals.max_xmit = 65535;
1040 Globals.max_mux = 50; /* This is *needed* for profile support. */
1041 Globals.lpqcachetime = 10;
1042 Globals.pwordlevel = 0;
1043 Globals.unamelevel = 0;
1044 Globals.deadtime = 0;
1045 Globals.max_log_size = 5000;
1046 Globals.max_open_files = MAX_OPEN_FILES;
1047 Globals.maxprotocol = PROTOCOL_NT1;
1048 Globals.security = SEC_USER;
1049 Globals.bEncryptPasswords = False;
1050 Globals.bUpdateEncrypt = False;
1051 Globals.bReadRaw = True;
1052 Globals.bWriteRaw = True;
1053 Globals.bReadPrediction = False;
1054 Globals.bReadbmpx = False;
1055 Globals.bNullPasswords = False;
1056 Globals.bStripDot = False;
1057 Globals.syslog = 1;
1058 Globals.bSyslogOnly = False;
1059 Globals.bTimestampLogs = False;
1060 Globals.bDebugHiresTimestamp = False;
1061 Globals.bDebugPid = False;
1062 Globals.bDebugUid = False;
1063 Globals.max_ttl = 60*60*24*3; /* 3 days default. */
1064 Globals.max_wins_ttl = 60*60*24*6; /* 6 days default. */
1065 Globals.min_wins_ttl = 60*60*6; /* 6 hours default. */
1066 Globals.machine_password_timeout = 60*60*24*7; /* 7 days default. */
1067 Globals.change_notify_timeout = 60; /* 1 minute default. */
1068 Globals.ReadSize = 16*1024;
1069 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1070 Globals.lm_interval = 60;
1071 Globals.shmem_size = SHMEM_SIZE;
1072 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1073 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1074 Globals.bUnixRealname = False;
1075 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1076 Globals.bNISHomeMap = False;
1077 #ifdef WITH_NISPLUS_HOME
1078 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1079 #else
1080 string_set(&Globals.szNISHomeMapName, "auto.home");
1081 #endif
1082 #endif
1083 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1084 Globals.bTimeServer = False;
1085 Globals.bBindInterfacesOnly = False;
1086 Globals.bUnixPasswdSync = False;
1087 Globals.bPasswdChatDebug = False;
1088 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
1089 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1090 Globals.bNTAclSupport = True; /* Use NT ACLs by default. */
1091 Globals.bStatCache = True; /* use stat cache by default */
1092 Globals.map_to_guest = 0; /* By Default, "Never" */
1093 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1094 Globals.oplock_break_wait_time = 10; /* By Default, 10 msecs. */
1096 #if defined(WITH_LDAP) || defined(WITH_NT5LDAP)
1097 /* default values for ldap */
1098 string_set(&Globals.szLdapServer, "localhost");
1099 Globals.ldap_port=389;
1100 Globals.ldap_protocol_version=LDAP_VERSION2;
1101 #endif /* WITH_LDAP */
1103 #ifdef WITH_NT5LDAP
1104 string_set(&Globals.szLdapUrl, NULL);
1105 string_set(&Globals.szLdapRealm, NULL);
1106 string_set(&Globals.szLdapComputersSubcontext, "cn=computers,");
1107 string_set(&Globals.szLdapBuiltinSubcontext, "cn=builtin,");
1108 string_set(&Globals.szLdapUsersSubcontext, "cn=users,");
1109 #endif /* WITH_NT5LDAP */
1111 #ifdef WITH_SSL
1112 Globals.sslVersion = SMB_SSL_V23;
1113 string_set(&Globals.sslHostsRequire, "");
1114 string_set(&Globals.sslHostsResign, "");
1115 string_set(&Globals.sslCaCertDir, "");
1116 string_set(&Globals.sslCaCertFile, "");
1117 string_set(&Globals.sslCert, "");
1118 string_set(&Globals.sslPrivKey, "");
1119 string_set(&Globals.sslClientCert, "");
1120 string_set(&Globals.sslClientPrivKey, "");
1121 string_set(&Globals.sslCiphers, "");
1122 Globals.sslEnabled = False;
1123 Globals.sslReqClientCert = False;
1124 Globals.sslReqServerCert = False;
1125 Globals.sslCompatibility = False;
1126 #endif /* WITH_SSL */
1128 /* NETLOGON Secure Channel */
1130 Globals.bClientSChannel = False;
1131 Globals.bServerSChannel = False;
1133 /* NTLMv2 */
1135 Globals.bClientNTLMv2 = False;
1136 Globals.bServerNTLMv2 = Auto;
1138 /* these parameters are set to defaults that are more appropriate
1139 for the increasing samba install base:
1141 as a member of the workgroup, that will possibly become a
1142 _local_ master browser (lm = True). this is opposed to a forced
1143 local master browser startup (pm = True).
1145 doesn't provide WINS server service by default (wsupp = False),
1146 and doesn't provide domain master browser services by default, either.
1150 Globals.os_level = 32;
1151 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1152 Globals.bLocalMaster = True;
1153 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1154 Globals.bDomainLogons = False;
1155 Globals.bBrowseList = True;
1156 Globals.bWINSsupport = False;
1157 Globals.bWINSproxy = False;
1159 Globals.bDNSproxy = True;
1162 * smbd will check at runtime to see if this value
1163 * will really be used or not.
1165 Globals.bKernelOplocks = True;
1167 #if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
1168 string_set(&Globals.sMysqlHost,"localhost");
1169 string_set(&Globals.sMysqlUser,"root");
1170 string_set(&Globals.sMysqlPassFile,NULL);
1171 string_set(&Globals.sMysqlDatabase,"samba");
1172 string_set(&Globals.sMysqlTable,"smbpasswd");
1173 #endif
1176 * This must be done last as it checks the value in
1177 * client_code_page.
1180 interpret_coding_system(KANJI);
1183 /***************************************************************************
1184 Initialise the sDefault parameter structure.
1185 ***************************************************************************/
1186 static void init_locals(void)
1188 /* choose defaults depending on the type of printing */
1189 switch (sDefault.iPrinting)
1191 case PRINT_BSD:
1192 case PRINT_AIX:
1193 case PRINT_LPRNG:
1194 case PRINT_PLP:
1195 string_set(&sDefault.szLpqcommand,"lpq -P%p");
1196 string_set(&sDefault.szLprmcommand,"lprm -P%p %j");
1197 string_set(&sDefault.szPrintcommand,"lpr -r -P%p %s");
1198 break;
1200 case PRINT_CUPS:
1201 string_set(&sDefault.szLpqcommand,"/usr/bin/lpstat -o%p");
1202 string_set(&sDefault.szLprmcommand,"/usr/bin/cancel %p-%j");
1203 string_set(&sDefault.szPrintcommand,"/usr/bin/lp -d%p -oraw %s; rm %s");
1204 string_set(&sDefault.szQueuepausecommand, "/usr/bin/disable %p");
1205 string_set(&sDefault.szQueueresumecommand, "/usr/bin/enable %p");
1206 break;
1208 case PRINT_SYSV:
1209 case PRINT_HPUX:
1210 string_set(&sDefault.szLpqcommand,"lpstat -o%p");
1211 string_set(&sDefault.szLprmcommand,"cancel %p-%j");
1212 string_set(&sDefault.szPrintcommand,"lp -c -d%p %s; rm %s");
1213 string_set(&sDefault.szQueuepausecommand, "disable %p");
1214 string_set(&sDefault.szQueueresumecommand, "enable %p");
1215 #ifndef HPUX
1216 string_set(&sDefault.szLppausecommand,"lp -i %p-%j -H hold");
1217 string_set(&sDefault.szLpresumecommand,"lp -i %p-%j -H resume");
1218 #endif /* SYSV */
1219 break;
1221 case PRINT_QNX:
1222 string_set(&sDefault.szLpqcommand,"lpq -P%p");
1223 string_set(&sDefault.szLprmcommand,"lprm -P%p %j");
1224 string_set(&sDefault.szPrintcommand,"lp -r -P%p %s");
1225 break;
1227 case PRINT_SOFTQ:
1228 string_set(&sDefault.szLpqcommand,"qstat -l -d%p");
1229 string_set(&sDefault.szLprmcommand,"qstat -s -j%j -c");
1230 string_set(&sDefault.szPrintcommand,"lp -d%p -s %s; rm %s");
1231 string_set(&sDefault.szLppausecommand,"qstat -s -j%j -h");
1232 string_set(&sDefault.szLpresumecommand,"qstat -s -j%j -r");
1233 break;
1238 static TALLOC_CTX *lp_talloc;
1240 /******************************************************************* a
1241 free up temporary memory - called from the main loop
1242 ********************************************************************/
1243 void lp_talloc_free(void)
1245 if (!lp_talloc) return;
1246 talloc_destroy(lp_talloc);
1247 lp_talloc = NULL;
1250 /*******************************************************************
1251 convenience routine to grab string parameters into temporary memory
1252 and run standard_sub_basic on them. The buffers can be written to by
1253 callers without affecting the source string.
1254 ********************************************************************/
1255 static char *lp_user_string(const user_struct *vuser, const char *s)
1257 size_t len = s?strlen(s):0;
1258 char *ret;
1260 if (!lp_talloc) lp_talloc = talloc_init();
1262 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1264 if (!ret) return NULL;
1266 if (!s)
1267 *ret = 0;
1268 else
1269 StrnCpy(ret,s,len);
1271 trim_string(ret, "\"", "\"");
1273 standard_sub_vuser(vuser, ret);
1274 return(ret);
1277 /*******************************************************************
1278 convenience routine to grab string parameters into temporary memory
1279 and run standard_sub_basic on them. The buffers can be written to by
1280 callers without affecting the source string.
1281 ********************************************************************/
1282 static char *lp_string(const char *s)
1284 size_t len = s?strlen(s):0;
1285 char *ret;
1287 if (!lp_talloc) lp_talloc = talloc_init();
1289 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1291 if (!ret) return NULL;
1293 if (!s)
1294 *ret = 0;
1295 else
1296 StrnCpy(ret,s,len);
1298 trim_string(ret, "\"", "\"");
1300 standard_sub_basic(ret);
1301 return(ret);
1306 In this section all the functions that are used to access the
1307 parameters from the rest of the program are defined
1310 #define FN_GLOBAL_STRING(fn_name,ptr) \
1311 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1312 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1313 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1314 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1315 char fn_name(void) {return(*(char *)(ptr));}
1316 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1317 int fn_name(void) {return(*(int *)(ptr));}
1319 #define FN_LOCAL_STRING(fn_name,val) \
1320 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1321 #define FN_LOCAL_BOOL(fn_name,val) \
1322 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1323 #define FN_LOCAL_CHAR(fn_name,val) \
1324 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1325 #define FN_LOCAL_INTEGER(fn_name,val) \
1326 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1328 #define FN_VUSER_STRING(fn_name,ptr) \
1329 char *fn_name(const user_struct *usr) {return(lp_user_string(usr, *(char **)(ptr) ? *(char **)(ptr) : ""));}
1331 FN_GLOBAL_STRING(lp_logfile,&Globals.szLogFile)
1332 FN_GLOBAL_STRING(lp_smbrun,&Globals.szSmbrun)
1333 FN_GLOBAL_STRING(lp_configfile,&Globals.szConfigFile)
1334 FN_GLOBAL_STRING(lp_smb_passwd_file,&Globals.szSMBPasswdFile)
1335 FN_GLOBAL_STRING(lp_sam_directory,&Globals.szSAMDirectory)
1336 #if USE_SMBFILE_DB
1337 FN_GLOBAL_STRING(lp_smb_passgrp_file,&Globals.szSMBPassGroupFile)
1338 #endif
1339 #if USE_SMBGROUP_DB
1340 FN_GLOBAL_STRING(lp_smb_group_file,&Globals.szSMBGroupFile)
1341 FN_GLOBAL_STRING(lp_smb_alias_file,&Globals.szSMBAliasFile)
1342 #endif
1343 FN_GLOBAL_STRING(lp_serverstring,&Globals.szServerString)
1344 FN_GLOBAL_STRING(lp_printcapname,&Globals.szPrintcapname)
1345 FN_GLOBAL_STRING(lp_lockdir,&Globals.szLockDir)
1346 #ifdef WITH_UTMP
1347 FN_GLOBAL_STRING(lp_utmpdir,&Globals.szUtmpDir)
1348 #endif /* WITH_UTMP */
1349 FN_GLOBAL_STRING(lp_rootdir,&Globals.szRootdir)
1350 FN_GLOBAL_STRING(lp_source_environment,&Globals.szSourceEnv)
1351 FN_GLOBAL_STRING(lp_defaultservice,&Globals.szDefaultService)
1352 FN_GLOBAL_STRING(lp_msg_command,&Globals.szMsgCommand)
1353 FN_GLOBAL_STRING(lp_dfree_command,&Globals.szDfree)
1354 FN_GLOBAL_STRING(lp_hosts_equiv,&Globals.szHostsEquiv)
1355 FN_GLOBAL_STRING(lp_auto_services,&Globals.szAutoServices)
1356 FN_GLOBAL_STRING(lp_passwd_program,&Globals.szPasswdProgram)
1357 FN_GLOBAL_STRING(lp_passwd_chat,&Globals.szPasswdChat)
1358 FN_GLOBAL_STRING(lp_passwordserver,&Globals.szPasswordServer)
1359 FN_GLOBAL_STRING(lp_name_resolve_order,&Globals.szNameResolveOrder)
1360 FN_GLOBAL_STRING(lp_workgroup,&Globals.szWorkGroup)
1361 FN_GLOBAL_STRING(lp_trusted_domains,&Globals.szTrustedDomains)
1362 FN_GLOBAL_STRING(lp_trusting_domains,&Globals.szTrustingDomains)
1363 FN_GLOBAL_STRING(lp_username_map,&Globals.szUsernameMap)
1364 FN_GLOBAL_STRING(lp_aliasname_map,&Globals.szAliasnameMap)
1365 FN_GLOBAL_STRING(lp_groupname_map,&Globals.szGroupnameMap)
1366 FN_GLOBAL_STRING(lp_builtinname_map,&Globals.szBuiltinnameMap)
1367 FN_GLOBAL_STRING(lp_builtinrid_file,&Globals.szBuiltinRidFile)
1368 FN_GLOBAL_STRING(lp_ntusrname_map,&Globals.szNTusernameMap)
1369 FN_GLOBAL_STRING(lp_remote_announce,&Globals.szRemoteAnnounce)
1370 FN_GLOBAL_STRING(lp_remote_browse_sync,&Globals.szRemoteBrowseSync)
1371 FN_GLOBAL_STRING(lp_wins_server,&Globals.szWINSserver)
1372 FN_GLOBAL_STRING(lp_interfaces,&Globals.szInterfaces)
1373 FN_GLOBAL_STRING(lp_socket_address,&Globals.szSocketAddress)
1374 FN_GLOBAL_STRING(lp_nis_home_map_name,&Globals.szNISHomeMapName)
1375 static FN_GLOBAL_STRING(lp_announce_version,&Globals.szAnnounceVersion)
1376 FN_GLOBAL_STRING(lp_netbios_aliases,&Globals.szNetbiosAliases)
1377 FN_GLOBAL_STRING(lp_driverfile,&Globals.szDriverFile)
1378 FN_GLOBAL_STRING(lp_panic_action,&Globals.szPanicAction)
1379 FN_GLOBAL_STRING(lp_adduser_script,&Globals.szAddUserScript)
1380 FN_GLOBAL_STRING(lp_deluser_script,&Globals.szDelUserScript)
1381 FN_GLOBAL_STRING(lp_wins_hook,&Globals.szWINSHook)
1383 FN_GLOBAL_STRING(lp_nt_forms,&Globals.szNtForms)
1384 FN_GLOBAL_STRING(lp_nt_drivers_file,&Globals.szNtDriverFile)
1386 FN_GLOBAL_STRING(lp_winbind_uid,&Globals.szWinbindUID)
1387 FN_GLOBAL_STRING(lp_winbind_gid,&Globals.szWinbindGID)
1389 #if defined(WITH_LDAP) || defined(WITH_NT5LDAP)
1390 FN_GLOBAL_STRING(lp_ldap_server,&Globals.szLdapServer);
1391 FN_GLOBAL_STRING(lp_ldap_suffix,&Globals.szLdapSuffix);
1392 FN_GLOBAL_STRING(lp_ldap_bind_as,&Globals.szLdapBindAs);
1393 FN_GLOBAL_STRING(lp_ldap_passwd_file,&Globals.szLdapPasswdFile);
1394 #endif /* WITH_LDAP */
1396 #ifdef WITH_NT5LDAP
1397 FN_GLOBAL_STRING(lp_ldap_url,&Globals.szLdapUrl);
1398 FN_GLOBAL_STRING(lp_ldap_realm,&Globals.szLdapRealm);
1399 FN_GLOBAL_STRING(lp_ldap_computers_subcontext,&Globals.szLdapComputersSubcontext);
1400 FN_GLOBAL_STRING(lp_ldap_users_subcontext,&Globals.szLdapUsersSubcontext);
1401 FN_GLOBAL_STRING(lp_ldap_builtin_subcontext,&Globals.szLdapBuiltinSubcontext);
1402 #endif /* WITH_NT5LDAP */
1404 #ifdef WITH_SSL
1405 FN_GLOBAL_INTEGER(lp_ssl_version,&Globals.sslVersion);
1406 FN_GLOBAL_STRING(lp_ssl_hosts,&Globals.sslHostsRequire);
1407 FN_GLOBAL_STRING(lp_ssl_hosts_resign,&Globals.sslHostsResign);
1408 FN_GLOBAL_STRING(lp_ssl_cacertdir,&Globals.sslCaCertDir);
1409 FN_GLOBAL_STRING(lp_ssl_cacertfile,&Globals.sslCaCertFile);
1410 FN_GLOBAL_STRING(lp_ssl_cert,&Globals.sslCert);
1411 FN_GLOBAL_STRING(lp_ssl_privkey,&Globals.sslPrivKey);
1412 FN_GLOBAL_STRING(lp_ssl_client_cert,&Globals.sslClientCert);
1413 FN_GLOBAL_STRING(lp_ssl_client_privkey,&Globals.sslClientPrivKey);
1414 FN_GLOBAL_STRING(lp_ssl_ciphers,&Globals.sslCiphers);
1415 FN_GLOBAL_BOOL(lp_ssl_enabled,&Globals.sslEnabled);
1416 FN_GLOBAL_BOOL(lp_ssl_reqClientCert,&Globals.sslReqClientCert);
1417 FN_GLOBAL_BOOL(lp_ssl_reqServerCert,&Globals.sslReqServerCert);
1418 FN_GLOBAL_BOOL(lp_ssl_compatibility,&Globals.sslCompatibility);
1419 #endif /* WITH_SSL */
1421 FN_GLOBAL_BOOL(lp_dns_proxy,&Globals.bDNSproxy)
1422 FN_GLOBAL_BOOL(lp_wins_support,&Globals.bWINSsupport)
1423 FN_GLOBAL_BOOL(lp_we_are_a_wins_server,&Globals.bWINSsupport)
1424 FN_GLOBAL_BOOL(lp_wins_proxy,&Globals.bWINSproxy)
1425 FN_GLOBAL_BOOL(lp_local_master,&Globals.bLocalMaster)
1426 FN_GLOBAL_BOOL(lp_domain_logons,&Globals.bDomainLogons)
1427 FN_GLOBAL_BOOL(lp_load_printers,&Globals.bLoadPrinters)
1428 FN_GLOBAL_BOOL(lp_use_rhosts,&Globals.bUseRhosts)
1429 FN_GLOBAL_BOOL(lp_readprediction,&Globals.bReadPrediction)
1430 FN_GLOBAL_BOOL(lp_readbmpx,&Globals.bReadbmpx)
1431 FN_GLOBAL_BOOL(lp_readraw,&Globals.bReadRaw)
1432 FN_GLOBAL_BOOL(lp_writeraw,&Globals.bWriteRaw)
1433 FN_GLOBAL_BOOL(lp_null_passwords,&Globals.bNullPasswords)
1434 FN_GLOBAL_BOOL(lp_strip_dot,&Globals.bStripDot)
1435 FN_GLOBAL_BOOL(lp_encrypted_passwords,&Globals.bEncryptPasswords)
1436 FN_GLOBAL_BOOL(lp_update_encrypted,&Globals.bUpdateEncrypt)
1437 FN_GLOBAL_BOOL(lp_client_ntlmv2,&Globals.bClientNTLMv2)
1438 FN_GLOBAL_BOOL(lp_server_ntlmv2,&Globals.bServerNTLMv2)
1439 FN_GLOBAL_BOOL(lp_client_schannel,&Globals.bClientSChannel)
1440 FN_GLOBAL_BOOL(lp_server_schannel,&Globals.bServerSChannel)
1441 FN_GLOBAL_BOOL(lp_syslog_only,&Globals.bSyslogOnly)
1442 FN_GLOBAL_BOOL(lp_timestamp_logs,&Globals.bTimestampLogs)
1443 FN_GLOBAL_BOOL(lp_debug_hires_timestamp,&Globals.bDebugHiresTimestamp)
1444 FN_GLOBAL_BOOL(lp_debug_pid,&Globals.bDebugPid)
1445 FN_GLOBAL_BOOL(lp_debug_uid,&Globals.bDebugUid)
1446 FN_GLOBAL_BOOL(lp_browse_list,&Globals.bBrowseList)
1447 FN_GLOBAL_BOOL(lp_unix_realname,&Globals.bUnixRealname)
1448 FN_GLOBAL_BOOL(lp_nis_home_map,&Globals.bNISHomeMap)
1449 static FN_GLOBAL_BOOL(lp_time_server,&Globals.bTimeServer)
1450 FN_GLOBAL_BOOL(lp_bind_interfaces_only,&Globals.bBindInterfacesOnly)
1451 FN_GLOBAL_BOOL(lp_unix_password_sync,&Globals.bUnixPasswdSync)
1452 FN_GLOBAL_BOOL(lp_passwd_chat_debug,&Globals.bPasswdChatDebug)
1453 FN_GLOBAL_BOOL(lp_nt_smb_support,&Globals.bNTSmbSupport)
1454 FN_GLOBAL_BOOL(lp_nt_pipe_support,&Globals.bNTPipeSupport)
1455 FN_GLOBAL_BOOL(lp_nt_acl_support,&Globals.bNTAclSupport)
1456 FN_GLOBAL_BOOL(lp_stat_cache,&Globals.bStatCache)
1457 FN_GLOBAL_BOOL(lp_host_msdfs,&Globals.bHostMSDfs)
1458 FN_GLOBAL_INTEGER(lp_os_level,&Globals.os_level)
1459 FN_GLOBAL_INTEGER(lp_max_ttl,&Globals.max_ttl)
1460 FN_GLOBAL_INTEGER(lp_max_wins_ttl,&Globals.max_wins_ttl)
1461 FN_GLOBAL_INTEGER(lp_min_wins_ttl,&Globals.max_wins_ttl)
1462 FN_GLOBAL_INTEGER(lp_max_log_size,&Globals.max_log_size)
1463 FN_GLOBAL_INTEGER(lp_max_open_files,&Globals.max_open_files)
1464 FN_GLOBAL_INTEGER(lp_maxxmit,&Globals.max_xmit)
1465 FN_GLOBAL_INTEGER(lp_maxmux,&Globals.max_mux)
1466 FN_GLOBAL_INTEGER(lp_passwordlevel,&Globals.pwordlevel)
1467 FN_GLOBAL_INTEGER(lp_usernamelevel,&Globals.unamelevel)
1468 FN_GLOBAL_INTEGER(lp_readsize,&Globals.ReadSize)
1469 FN_GLOBAL_INTEGER(lp_shmem_size,&Globals.shmem_size)
1470 FN_GLOBAL_INTEGER(lp_deadtime,&Globals.deadtime)
1471 FN_GLOBAL_INTEGER(lp_maxprotocol,&Globals.maxprotocol)
1472 FN_GLOBAL_INTEGER(lp_security,&Globals.security)
1473 FN_GLOBAL_INTEGER(lp_maxdisksize,&Globals.maxdisksize)
1474 FN_GLOBAL_INTEGER(lp_lpqcachetime,&Globals.lpqcachetime)
1475 FN_GLOBAL_INTEGER(lp_syslog,&Globals.syslog)
1476 FN_GLOBAL_INTEGER(lp_client_code_page,&Globals.client_code_page)
1477 static FN_GLOBAL_INTEGER(lp_announce_as,&Globals.announce_as)
1478 FN_GLOBAL_INTEGER(lp_lm_announce,&Globals.lm_announce)
1479 FN_GLOBAL_INTEGER(lp_lm_interval,&Globals.lm_interval)
1480 FN_GLOBAL_INTEGER(lp_machine_password_timeout,&Globals.machine_password_timeout)
1481 FN_GLOBAL_INTEGER(lp_change_notify_timeout,&Globals.change_notify_timeout)
1482 FN_GLOBAL_INTEGER(lp_stat_cache_size,&Globals.stat_cache_size)
1483 FN_GLOBAL_INTEGER(lp_map_to_guest,&Globals.map_to_guest)
1484 FN_GLOBAL_INTEGER(lp_min_passwd_length,&Globals.min_passwd_length)
1485 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time,&Globals.oplock_break_wait_time)
1487 #if defined(WITH_LDAP) || defined(WITH_NT5LDAP)
1488 FN_GLOBAL_INTEGER(lp_ldap_port,&Globals.ldap_port)
1489 FN_GLOBAL_INTEGER(lp_ldap_protocol_version,&Globals.ldap_protocol_version)
1490 #endif /* WITH_LDAP */
1492 /* user-dependent parameters */
1494 FN_VUSER_STRING(lp_logon_script,&Globals.szLogonScript)
1495 FN_VUSER_STRING(lp_logon_path,&Globals.szLogonPath)
1496 FN_VUSER_STRING(lp_logon_drive,&Globals.szLogonDrive)
1497 FN_VUSER_STRING(lp_logon_home,&Globals.szLogonHome)
1499 /* local parameters */
1501 FN_LOCAL_STRING(lp_preexec,szPreExec)
1502 FN_LOCAL_STRING(lp_postexec,szPostExec)
1503 FN_LOCAL_STRING(lp_rootpreexec,szRootPreExec)
1504 FN_LOCAL_STRING(lp_rootpostexec,szRootPostExec)
1505 FN_LOCAL_STRING(lp_servicename,szService)
1506 FN_LOCAL_STRING(lp_pathname,szPath)
1507 FN_LOCAL_STRING(lp_dontdescend,szDontdescend)
1508 FN_LOCAL_STRING(lp_username,szUsername)
1509 FN_LOCAL_STRING(lp_guestaccount,szGuestaccount)
1510 FN_LOCAL_STRING(lp_invalid_users,szInvalidUsers)
1511 FN_LOCAL_STRING(lp_valid_users,szValidUsers)
1512 FN_LOCAL_STRING(lp_admin_users,szAdminUsers)
1513 FN_LOCAL_STRING(lp_printcommand,szPrintcommand)
1514 FN_LOCAL_STRING(lp_lpqcommand,szLpqcommand)
1515 FN_LOCAL_STRING(lp_lprmcommand,szLprmcommand)
1516 FN_LOCAL_STRING(lp_lppausecommand,szLppausecommand)
1517 FN_LOCAL_STRING(lp_lpresumecommand,szLpresumecommand)
1518 FN_LOCAL_STRING(lp_queuepausecommand,szQueuepausecommand)
1519 FN_LOCAL_STRING(lp_queueresumecommand,szQueueresumecommand)
1520 FN_LOCAL_STRING(lp_printername,szPrintername)
1521 FN_LOCAL_STRING(lp_printerdriver,szPrinterDriver)
1522 FN_LOCAL_STRING(lp_hostsallow,szHostsallow)
1523 FN_LOCAL_STRING(lp_hostsdeny,szHostsdeny)
1524 FN_LOCAL_STRING(lp_magicscript,szMagicScript)
1525 FN_LOCAL_STRING(lp_magicoutput,szMagicOutput)
1526 FN_LOCAL_STRING(lp_comment,comment)
1527 FN_LOCAL_STRING(lp_force_user,force_user)
1528 FN_LOCAL_STRING(lp_force_group,force_group)
1529 FN_LOCAL_STRING(lp_readlist,readlist)
1530 FN_LOCAL_STRING(lp_writelist,writelist)
1531 FN_LOCAL_STRING(lp_fstype,fstype)
1532 FN_LOCAL_STRING(lp_vfsobj,szVfsObjectFile)
1533 static FN_LOCAL_STRING(lp_volume,volume)
1534 FN_LOCAL_STRING(lp_mangled_map,szMangledMap)
1535 FN_LOCAL_STRING(lp_veto_files,szVetoFiles)
1536 FN_LOCAL_STRING(lp_hide_files,szHideFiles)
1537 FN_LOCAL_STRING(lp_veto_oplocks,szVetoOplockFiles)
1538 FN_LOCAL_STRING(lp_driverlocation,szPrinterDriverLocation)
1540 #ifdef MS_DFS
1541 FN_LOCAL_STRING(lp_dfsmap,szDfsMap)
1542 FN_LOCAL_BOOL(lp_dfsmap_loaded,bDfsMapLoaded)
1543 #endif
1545 FN_LOCAL_BOOL(lp_preexec_close,bPreexecClose)
1546 FN_LOCAL_BOOL(lp_rootpreexec_close,bRootpreexecClose)
1547 FN_LOCAL_BOOL(lp_revalidate,bRevalidate)
1548 FN_LOCAL_BOOL(lp_casesensitive,bCaseSensitive)
1549 FN_LOCAL_BOOL(lp_preservecase,bCasePreserve)
1550 FN_LOCAL_BOOL(lp_shortpreservecase,bShortCasePreserve)
1551 FN_LOCAL_BOOL(lp_casemangle,bCaseMangle)
1552 FN_LOCAL_BOOL(lp_status,status)
1553 FN_LOCAL_BOOL(lp_hide_dot_files,bHideDotFiles)
1554 FN_LOCAL_BOOL(lp_browseable,bBrowseable)
1555 FN_LOCAL_BOOL(lp_readonly,bRead_only)
1556 FN_LOCAL_BOOL(lp_no_set_dir,bNo_set_dir)
1557 FN_LOCAL_BOOL(lp_guest_ok,bGuest_ok)
1558 FN_LOCAL_BOOL(lp_guest_only,bGuest_only)
1559 FN_LOCAL_BOOL(lp_print_ok,bPrint_ok)
1560 FN_LOCAL_BOOL(lp_postscript,bPostscript)
1561 FN_LOCAL_BOOL(lp_map_hidden,bMap_hidden)
1562 FN_LOCAL_BOOL(lp_map_archive,bMap_archive)
1563 FN_LOCAL_BOOL(lp_locking,bLocking)
1564 FN_LOCAL_BOOL(lp_strict_locking,bStrictLocking)
1565 FN_LOCAL_BOOL(lp_posix_locking,bPosixLocking)
1566 #ifdef WITH_UTMP
1567 FN_LOCAL_BOOL(lp_utmp,bUtmp)
1568 #endif
1569 FN_LOCAL_BOOL(lp_share_modes,bShareModes)
1570 FN_LOCAL_BOOL(lp_oplocks,bOpLocks)
1571 FN_LOCAL_BOOL(lp_level2_oplocks,bLevel2OpLocks)
1572 FN_LOCAL_BOOL(lp_onlyuser,bOnlyUser)
1573 FN_LOCAL_BOOL(lp_manglednames,bMangledNames)
1574 FN_LOCAL_BOOL(lp_widelinks,bWidelinks)
1575 FN_LOCAL_BOOL(lp_symlinks,bSymlinks)
1576 FN_LOCAL_BOOL(lp_syncalways,bSyncAlways)
1577 FN_LOCAL_BOOL(lp_strict_sync,bStrictSync)
1578 FN_LOCAL_BOOL(lp_map_system,bMap_system)
1579 FN_LOCAL_BOOL(lp_delete_readonly,bDeleteReadonly)
1580 FN_LOCAL_BOOL(lp_fake_oplocks,bFakeOplocks)
1581 FN_LOCAL_BOOL(lp_recursive_veto_delete,bDeleteVetoFiles)
1582 FN_LOCAL_BOOL(lp_dos_filetimes,bDosFiletimes)
1583 FN_LOCAL_BOOL(lp_dos_filetime_resolution,bDosFiletimeResolution)
1584 FN_LOCAL_BOOL(lp_fake_dir_create_times,bFakeDirCreateTimes)
1585 FN_LOCAL_BOOL(lp_blocking_locks,bBlockingLocks)
1586 FN_LOCAL_BOOL(lp_inherit_perms,bInheritPerms)
1588 FN_LOCAL_INTEGER(lp_create_mask,iCreate_mask)
1589 FN_LOCAL_INTEGER(lp_force_create_mode,iCreate_force_mode)
1590 FN_LOCAL_INTEGER(_lp_security_mask,iSecurity_mask)
1591 FN_LOCAL_INTEGER(_lp_force_security_mode,iSecurity_force_mode)
1592 FN_LOCAL_INTEGER(lp_dir_mask,iDir_mask)
1593 FN_LOCAL_INTEGER(lp_force_dir_mode,iDir_force_mode)
1594 FN_LOCAL_INTEGER(_lp_dir_security_mask,iDir_Security_mask)
1595 FN_LOCAL_INTEGER(_lp_force_dir_security_mode,iDir_Security_force_mode)
1596 FN_LOCAL_INTEGER(lp_max_connections,iMaxConnections)
1597 FN_LOCAL_INTEGER(lp_defaultcase,iDefaultCase)
1598 FN_LOCAL_INTEGER(lp_minprintspace,iMinPrintSpace)
1599 FN_LOCAL_INTEGER(lp_printing,iPrinting)
1600 FN_LOCAL_INTEGER(lp_oplock_contention_limit,iOplockContentionLimit)
1601 FN_LOCAL_INTEGER(lp_write_cache_size,iWriteCacheSize)
1603 FN_LOCAL_CHAR(lp_magicchar,magic_char)
1605 #if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM)
1606 FN_GLOBAL_STRING(lp_mysql_host,&Globals.sMysqlHost)
1607 FN_GLOBAL_STRING(lp_mysql_user,&Globals.sMysqlUser)
1608 FN_GLOBAL_STRING(lp_mysql_passfile,&Globals.sMysqlPassFile)
1609 FN_GLOBAL_STRING(lp_mysql_db,&Globals.sMysqlDatabase)
1610 FN_GLOBAL_STRING(lp_mysql_table,&Globals.sMysqlTable)
1611 #endif
1614 /* local prototypes */
1615 static int strwicmp( char *psz1, char *psz2 );
1616 static int map_parameter( char *pszParmName);
1617 static BOOL set_boolean( BOOL *pb, char *pszParmValue );
1618 static int getservicebyname(char *pszServiceName, service *pserviceDest);
1619 static void copy_service( service *pserviceDest,
1620 service *pserviceSource,
1621 BOOL *pcopymapDest );
1622 static BOOL service_ok(int iService);
1623 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1624 static BOOL do_section(char *pszSectionName);
1625 static void init_copymap(service *pservice);
1628 /***************************************************************************
1629 initialise a service to the defaults
1630 ***************************************************************************/
1631 static void init_service(service *pservice)
1633 memset((char *)pservice,'\0',sizeof(service));
1634 copy_service(pservice,&sDefault,NULL);
1638 /***************************************************************************
1639 free the dynamically allocated parts of a service struct
1640 ***************************************************************************/
1641 static void free_service(service *pservice)
1643 int i;
1644 if (!pservice)
1645 return;
1647 if(pservice->szService)
1648 DEBUG(5,("free_service: Freeing service %s\n", pservice->szService));
1650 string_free(&pservice->szService);
1651 if (pservice->copymap)
1653 free(pservice->copymap);
1654 pservice->copymap = NULL;
1657 for (i=0;parm_table[i].label;i++)
1658 if ((parm_table[i].type == P_STRING ||
1659 parm_table[i].type == P_USTRING) &&
1660 parm_table[i].class == P_LOCAL)
1661 string_free((char **)(((char *)pservice) + PTR_DIFF(parm_table[i].ptr,&sDefault)));
1664 /***************************************************************************
1665 add a new service to the services array initialising it with the given
1666 service
1667 ***************************************************************************/
1668 static int add_a_service(service *pservice, char *name)
1670 int i;
1671 service tservice;
1672 int num_to_alloc = iNumServices+1;
1674 tservice = *pservice;
1676 /* it might already exist */
1677 if (name)
1679 i = getservicebyname(name,NULL);
1680 if (i >= 0)
1681 return(i);
1684 /* find an invalid one */
1685 for (i=0;i<iNumServices;i++)
1686 if (!pSERVICE(i)->valid)
1687 break;
1689 /* if not, then create one */
1690 if (i == iNumServices)
1692 ServicePtrs = (service **)Realloc(ServicePtrs,sizeof(service *)*num_to_alloc);
1693 if (ServicePtrs)
1694 pSERVICE(iNumServices) = (service *)malloc(sizeof(service));
1696 if (!ServicePtrs || !pSERVICE(iNumServices))
1697 return(-1);
1699 iNumServices++;
1701 else
1702 free_service(pSERVICE(i));
1704 pSERVICE(i)->valid = True;
1706 init_service(pSERVICE(i));
1707 copy_service(pSERVICE(i),&tservice,NULL);
1708 if (name) {
1709 string_set(&iSERVICE(i).szService,name);
1710 unix_to_dos(iSERVICE(i).szService, True);
1712 return(i);
1715 /***************************************************************************
1716 add a new home service, with the specified home directory, defaults coming
1717 from service ifrom
1718 ***************************************************************************/
1719 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1721 int i = add_a_service(pSERVICE(iDefaultService),pszHomename);
1723 if (i < 0)
1724 return(False);
1726 if (!(*(iSERVICE(i).szPath)) || strequal(iSERVICE(i).szPath,lp_pathname(-1)))
1727 string_set(&iSERVICE(i).szPath,pszHomedir);
1728 if (!(*(iSERVICE(i).comment)))
1730 pstring comment;
1731 slprintf(comment,sizeof(comment)-1,
1732 "Home directory of %s",pszHomename);
1733 string_set(&iSERVICE(i).comment,comment);
1735 iSERVICE(i).bAvailable = sDefault.bAvailable;
1736 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1738 DEBUG(3,("adding home directory %s at %s\n", pszHomename, pszHomedir));
1740 return(True);
1743 /***************************************************************************
1744 add a new service, based on an old one
1745 ***************************************************************************/
1746 int lp_add_service(char *pszService, int iDefaultService)
1748 return(add_a_service(pSERVICE(iDefaultService),pszService));
1752 /***************************************************************************
1753 add the IPC service
1754 ***************************************************************************/
1755 static BOOL lp_add_ipc(void)
1757 pstring comment;
1758 int i = add_a_service(&sDefault,"IPC$");
1760 if (i < 0)
1761 return(False);
1763 slprintf(comment,sizeof(comment)-1,
1764 "IPC Service (%s)", Globals.szServerString );
1766 string_set(&iSERVICE(i).szPath,tmpdir());
1767 string_set(&iSERVICE(i).szUsername,"");
1768 string_set(&iSERVICE(i).comment,comment);
1769 string_set(&iSERVICE(i).fstype,"IPC");
1770 iSERVICE(i).status = False;
1771 iSERVICE(i).iMaxConnections = 0;
1772 iSERVICE(i).bAvailable = True;
1773 iSERVICE(i).bRead_only = True;
1774 iSERVICE(i).bGuest_only = False;
1775 iSERVICE(i).bGuest_ok = True;
1776 iSERVICE(i).bPrint_ok = False;
1777 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1779 DEBUG(3,("adding IPC service\n"));
1781 return(True);
1785 /***************************************************************************
1786 add a new printer service, with defaults coming from service iFrom
1787 ***************************************************************************/
1788 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
1790 char *comment = "From Printcap";
1791 int i = add_a_service(pSERVICE(iDefaultService),pszPrintername);
1793 if (i < 0)
1794 return(False);
1796 /* note that we do NOT default the availability flag to True - */
1797 /* we take it from the default service passed. This allows all */
1798 /* dynamic printers to be disabled by disabling the [printers] */
1799 /* entry (if/when the 'available' keyword is implemented!). */
1801 /* the printer name is set to the service name. */
1802 string_set(&iSERVICE(i).szPrintername,pszPrintername);
1803 string_set(&iSERVICE(i).comment,comment);
1804 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1805 /* Printers cannot be read_only. */
1806 iSERVICE(i).bRead_only = False;
1807 /* No share modes on printer services. */
1808 iSERVICE(i).bShareModes = False;
1809 /* No oplocks on printer services. */
1810 iSERVICE(i).bOpLocks = False;
1811 /* Printer services must be printable. */
1812 iSERVICE(i).bPrint_ok = True;
1814 DEBUG(3,("adding printer service %s\n",pszPrintername));
1816 return(True);
1820 /***************************************************************************
1821 Do a case-insensitive, whitespace-ignoring string compare.
1822 ***************************************************************************/
1823 static int strwicmp(char *psz1, char *psz2)
1825 /* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
1826 /* appropriate value. */
1827 if (psz1 == psz2)
1828 return (0);
1829 else
1830 if (psz1 == NULL)
1831 return (-1);
1832 else
1833 if (psz2 == NULL)
1834 return (1);
1836 /* sync the strings on first non-whitespace */
1837 while (1)
1839 while (isspace(*psz1))
1840 psz1++;
1841 while (isspace(*psz2))
1842 psz2++;
1843 if (toupper(*psz1) != toupper(*psz2) || *psz1 == '\0' || *psz2 == '\0')
1844 break;
1845 psz1++;
1846 psz2++;
1848 return (*psz1 - *psz2);
1851 /***************************************************************************
1852 Map a parameter's string representation to something we can use.
1853 Returns False if the parameter string is not recognised, else TRUE.
1854 ***************************************************************************/
1855 static int map_parameter(char *pszParmName)
1857 int iIndex;
1859 if (*pszParmName == '-')
1860 return(-1);
1862 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1863 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1864 return(iIndex);
1866 DEBUG(0,( "Unknown parameter encountered: \"%s\"\n", pszParmName));
1867 return(-1);
1871 /***************************************************************************
1872 Set a boolean variable from the text value stored in the passed string.
1873 Returns True in success, False if the passed string does not correctly
1874 represent a boolean.
1875 ***************************************************************************/
1876 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
1878 BOOL bRetval;
1880 bRetval = True;
1881 if (strwicmp(pszParmValue, "yes") == 0 ||
1882 strwicmp(pszParmValue, "true") == 0 ||
1883 strwicmp(pszParmValue, "1") == 0)
1884 *pb = True;
1885 else
1886 if (strwicmp(pszParmValue, "no") == 0 ||
1887 strwicmp(pszParmValue, "False") == 0 ||
1888 strwicmp(pszParmValue, "0") == 0)
1889 *pb = False;
1890 else
1892 DEBUG(0,("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1893 pszParmValue));
1894 bRetval = False;
1896 return (bRetval);
1899 /***************************************************************************
1900 Find a service by name. Otherwise works like get_service.
1901 ***************************************************************************/
1902 static int getservicebyname(char *pszServiceName, service *pserviceDest)
1904 int iService;
1906 for (iService = iNumServices - 1; iService >= 0; iService--)
1907 if (VALID(iService) &&
1908 strwicmp(iSERVICE(iService).szService, pszServiceName) == 0)
1910 if (pserviceDest != NULL)
1911 copy_service(pserviceDest, pSERVICE(iService), NULL);
1912 break;
1915 return (iService);
1920 /***************************************************************************
1921 Copy a service structure to another
1923 If pcopymapDest is NULL then copy all fields
1924 ***************************************************************************/
1925 static void copy_service(service *pserviceDest,
1926 service *pserviceSource,
1927 BOOL *pcopymapDest)
1929 int i;
1930 BOOL bcopyall = (pcopymapDest == NULL);
1932 for (i=0;parm_table[i].label;i++)
1933 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
1934 (bcopyall || pcopymapDest[i]))
1936 void *def_ptr = parm_table[i].ptr;
1937 void *src_ptr =
1938 ((char *)pserviceSource) + PTR_DIFF(def_ptr,&sDefault);
1939 void *dest_ptr =
1940 ((char *)pserviceDest) + PTR_DIFF(def_ptr,&sDefault);
1942 switch (parm_table[i].type)
1944 case P_BOOL:
1945 case P_BOOLREV:
1946 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
1947 break;
1949 case P_INTEGER:
1950 case P_ENUM:
1951 case P_OCTAL:
1952 *(int *)dest_ptr = *(int *)src_ptr;
1953 break;
1955 case P_CHAR:
1956 *(char *)dest_ptr = *(char *)src_ptr;
1957 break;
1959 case P_STRING:
1960 string_set(dest_ptr,*(char **)src_ptr);
1961 break;
1963 case P_USTRING:
1964 string_set(dest_ptr,*(char **)src_ptr);
1965 strupper(*(char **)dest_ptr);
1966 break;
1967 default:
1968 break;
1972 if (bcopyall)
1974 init_copymap(pserviceDest);
1975 if (pserviceSource->copymap)
1976 memcpy((void *)pserviceDest->copymap,
1977 (void *)pserviceSource->copymap,sizeof(BOOL)*NUMPARAMETERS);
1981 /***************************************************************************
1982 Check a service for consistency. Return False if the service is in any way
1983 incomplete or faulty, else True.
1984 ***************************************************************************/
1985 static BOOL service_ok(int iService)
1987 BOOL bRetval;
1989 bRetval = True;
1990 if (iSERVICE(iService).szService[0] == '\0')
1992 DEBUG(0,( "The following message indicates an internal error:\n"));
1993 DEBUG(0,( "No service name in service entry.\n"));
1994 bRetval = False;
1997 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
1998 /* I can't see why you'd want a non-printable printer service... */
1999 if (strwicmp(iSERVICE(iService).szService,PRINTERS_NAME) == 0)
2000 if (!iSERVICE(iService).bPrint_ok)
2002 DEBUG(0,( "WARNING: [%s] service MUST be printable!\n",
2003 iSERVICE(iService).szService));
2004 iSERVICE(iService).bPrint_ok = True;
2007 if (iSERVICE(iService).szPath[0] == '\0' &&
2008 strwicmp(iSERVICE(iService).szService,HOMES_NAME) != 0)
2010 DEBUG(0,("No path in service %s - using %s\n",iSERVICE(iService).szService,tmpdir()));
2011 string_set(&iSERVICE(iService).szPath,tmpdir());
2014 /* If a service is flagged unavailable, log the fact at level 0. */
2015 if (!iSERVICE(iService).bAvailable)
2016 DEBUG(1,( "NOTE: Service %s is flagged unavailable.\n",
2017 iSERVICE(iService).szService));
2019 return (bRetval);
2022 static struct file_lists {
2023 struct file_lists *next;
2024 char *name;
2025 time_t modtime;
2026 } *file_lists = NULL;
2028 /*******************************************************************
2029 keep a linked list of all config files so we know when one has changed
2030 it's date and needs to be reloaded
2031 ********************************************************************/
2032 static void add_to_file_list(char *fname)
2034 struct file_lists *f=file_lists;
2036 while (f) {
2037 if (f->name && !strcmp(f->name,fname)) break;
2038 f = f->next;
2041 if (!f) {
2042 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2043 if (!f) return;
2044 f->next = file_lists;
2045 f->name = strdup(fname);
2046 if (!f->name) {
2047 free(f);
2048 return;
2050 file_lists = f;
2054 pstring n2;
2055 pstrcpy(n2,fname);
2056 standard_sub_basic(n2);
2057 f->modtime = file_modtime(n2);
2062 /*******************************************************************
2063 check if a config file has changed date
2064 ********************************************************************/
2065 BOOL lp_file_list_changed(void)
2067 struct file_lists *f = file_lists;
2068 DEBUG(6,("lp_file_list_changed()\n"));
2070 while (f)
2072 pstring n2;
2073 time_t mod_time;
2075 pstrcpy(n2,f->name);
2076 standard_sub_basic(n2);
2078 DEBUGADD( 6, ( "file %s -> %s last mod_time: %s\n",
2079 f->name, n2, ctime(&f->modtime) ) );
2081 mod_time = file_modtime(n2);
2083 if (f->modtime != mod_time) {
2084 DEBUGADD(6,("file %s modified: %s\n", n2, ctime(&mod_time)));
2085 f->modtime = mod_time;
2086 return(True);
2088 f = f->next;
2090 return(False);
2093 /***************************************************************************
2094 Run standard_sub_basic on netbios name... needed because global_myname
2095 is not accessed through any lp_ macro.
2096 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2097 ***************************************************************************/
2099 static BOOL handle_netbios_name(char *pszParmValue,char **ptr)
2101 pstring netbios_name;
2103 pstrcpy(netbios_name,pszParmValue);
2105 standard_sub_basic(netbios_name);
2106 strupper(netbios_name);
2109 * Convert from UNIX to DOS string - the UNIX to DOS converter
2110 * isn't called on the special handlers.
2112 unix_to_dos(netbios_name, True);
2113 pstrcpy(global_myname,netbios_name);
2115 DEBUG(4,("handle_netbios_name: set global_myname to: %s\n", global_myname));
2117 return(True);
2120 /***************************************************************************
2121 Do the work of sourcing in environment variable/value pairs.
2122 ***************************************************************************/
2124 static BOOL source_env(FILE *fenv)
2126 pstring line;
2127 char *varval;
2128 size_t len;
2129 char *p;
2131 while (!feof(fenv)) {
2132 if (fgets(line, sizeof(line), fenv) == NULL)
2133 break;
2135 if(feof(fenv))
2136 break;
2138 if((len = strlen(line)) == 0)
2139 continue;
2141 if (line[len - 1] == '\n')
2142 line[--len] = '\0';
2144 if ((varval=malloc(len+1)) == NULL) {
2145 DEBUG(0,("source_env: Not enough memory!\n"));
2146 return(False);
2149 DEBUG(4,("source_env: Adding to environment: %s\n", line));
2150 strncpy(varval, line, len);
2151 varval[len] = '\0';
2153 p=strchr(line, (int) '=');
2154 if (p == NULL) {
2155 DEBUG(4,("source_env: missing '=': %s\n", line));
2156 continue;
2159 if (putenv(varval)) {
2160 DEBUG(0,("source_env: Failed to put environment variable %s\n", varval ));
2161 continue;
2164 *p='\0';
2165 p++;
2166 DEBUG(4,("source_env: getting var %s = %s\n", line, getenv(line)));
2169 DEBUG(4,("source_env: returning successfully\n"));
2170 return(True);
2173 /***************************************************************************
2174 Handle the source environment operation
2175 ***************************************************************************/
2177 static BOOL handle_source_env(char *pszParmValue,char **ptr)
2179 pstring fname;
2180 char *p = fname;
2181 FILE *env;
2182 BOOL result;
2184 pstrcpy(fname,pszParmValue);
2186 standard_sub_basic(fname);
2188 string_set(ptr,pszParmValue);
2190 DEBUG(4, ("handle_source_env: checking env type\n"));
2193 * Filename starting with '|' means popen and read from stdin.
2196 if (*p == '|') {
2198 DEBUG(4, ("handle_source_env: source env from pipe\n"));
2199 p++;
2201 if ((env = sys_popen(p, "r", True)) == NULL) {
2202 DEBUG(0,("handle_source_env: Failed to popen %s. Error was %s\n", p, strerror(errno) ));
2203 return(False);
2206 DEBUG(4, ("handle_source_env: calling source_env()\n"));
2207 result = source_env(env);
2208 sys_pclose(env);
2210 } else {
2212 SMB_STRUCT_STAT st;
2214 DEBUG(4, ("handle_source_env: source env from file %s\n", fname));
2215 if ((env = sys_fopen(fname, "r")) == NULL) {
2216 DEBUG(0,("handle_source_env: Failed to open file %s, Error was %s\n", fname, strerror(errno) ));
2217 return(False);
2221 * Ensure this file is owned by root and not writable by world.
2223 if(sys_fstat(fileno(env), &st) != 0) {
2224 DEBUG(0,("handle_source_env: Failed to stat file %s, Error was %s\n", fname, strerror(errno) ));
2225 fclose(env);
2226 return False;
2229 if((st.st_uid != (uid_t)0) || (st.st_mode & S_IWOTH)) {
2230 DEBUG(0,("handle_source_env: unsafe to source env file %s. Not owned by root or world writable\n", fname ));
2231 fclose(env);
2232 return False;
2235 result=source_env(env);
2236 fclose(env);
2238 return(result);
2243 #ifdef MS_DFS
2244 void set_dfsmap_loaded(int i,BOOL b)
2246 pSERVICE(i)->bDfsMapLoaded = b;
2249 #endif
2251 /***************************************************************************
2252 handle the interpretation of the vfs object parameter
2253 *************************************************************************/
2254 static BOOL handle_vfs_object(char *pszParmValue,char **ptr)
2256 /* Set string value */
2258 string_set(ptr,pszParmValue);
2260 /* Do any other initialisation required for vfs. Note that
2261 anything done here may have linking repercussions in nmbd. */
2263 return True;
2266 /***************************************************************************
2267 handle the interpretation of the coding system parameter
2268 *************************************************************************/
2269 static BOOL handle_coding_system(char *pszParmValue,char **ptr)
2271 string_set(ptr,pszParmValue);
2272 interpret_coding_system(pszParmValue);
2273 return(True);
2276 /***************************************************************************
2277 Handle the interpretation of the character set system parameter.
2278 ***************************************************************************/
2280 static char *saved_character_set = NULL;
2282 static BOOL handle_character_set(char *pszParmValue,char **ptr)
2284 /* A dependency here is that the parameter client code page should be
2285 set before this is called.
2287 string_set(ptr,pszParmValue);
2288 strupper(*ptr);
2289 saved_character_set = strdup(*ptr);
2290 interpret_character_set(*ptr,lp_client_code_page());
2291 return(True);
2294 /***************************************************************************
2295 Handle the interpretation of the client code page parameter.
2296 We handle this separately so that we can reset the character set
2297 parameter in case this came before 'client code page' in the smb.conf.
2298 ***************************************************************************/
2300 static BOOL handle_client_code_page(char *pszParmValue,char **ptr)
2302 Globals.client_code_page = atoi(pszParmValue);
2303 if (saved_character_set != NULL)
2304 interpret_character_set(saved_character_set,lp_client_code_page());
2305 return(True);
2308 /***************************************************************************
2309 handle the valid chars lines
2310 ***************************************************************************/
2312 static BOOL handle_valid_chars(char *pszParmValue,char **ptr)
2314 string_set(ptr,pszParmValue);
2316 /* A dependency here is that the parameter client code page must be
2317 set before this is called - as calling codepage_initialise()
2318 would overwrite the valid char lines.
2320 codepage_initialise(lp_client_code_page());
2322 add_char_string(pszParmValue);
2323 return(True);
2326 /***************************************************************************
2327 handle the include operation
2328 ***************************************************************************/
2330 static BOOL handle_include(char *pszParmValue,char **ptr)
2332 pstring fname;
2333 pstrcpy(fname,pszParmValue);
2335 add_to_file_list(fname);
2337 standard_sub_basic(fname);
2339 string_set(ptr,fname);
2341 if (file_exist(fname,NULL))
2342 return(pm_process(fname, do_section, do_parameter));
2344 DEBUG(2,("Can't find include file %s\n",fname));
2346 return(False);
2350 /***************************************************************************
2351 handle the interpretation of the copy parameter
2352 ***************************************************************************/
2353 static BOOL handle_copy(char *pszParmValue,char **ptr)
2355 BOOL bRetval;
2356 int iTemp;
2357 service serviceTemp;
2359 string_set(ptr,pszParmValue);
2361 init_service(&serviceTemp);
2363 bRetval = False;
2365 DEBUG(3,("Copying service from service %s\n",pszParmValue));
2367 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2369 if (iTemp == iServiceIndex)
2371 DEBUG(0,("Can't copy service %s - unable to copy self!\n",
2372 pszParmValue));
2374 else
2376 copy_service(pSERVICE(iServiceIndex),
2377 &serviceTemp,
2378 iSERVICE(iServiceIndex).copymap);
2379 bRetval = True;
2382 else
2384 DEBUG(0,( "Unable to copy service - source not found: %s\n",
2385 pszParmValue));
2386 bRetval = False;
2389 free_service(&serviceTemp);
2390 return (bRetval);
2393 /***************************************************************************
2394 Handle winbind uid and gid allocation parameters. The format of these
2395 parameters is:
2397 [global]
2399 winbind uid = ACSYS-NTDOM:1000-1999, BUILTIN:2000-2999
2400 winbind gid = BUILTIN:600-699, ACSYS-NTDOM:700-899
2402 We only do simple parsing checks here. The strings are parsed into useful
2403 structures in the winbind daemon code.
2405 ***************************************************************************/
2407 /* Do some simple checks on "winbind [ug]id" parameter value */
2409 static BOOL handle_winbind_id(char *pszParmValue, char **ptr)
2411 fstring temp;
2412 char *p;
2414 fstrcpy(temp, pszParmValue);
2416 /* Check list values are of form DOMAIN:id1 or DOMAIN:id1-id2 */
2418 for (p = strtok(temp, LIST_SEP); p; p = strtok(NULL, LIST_SEP)) {
2419 int value;
2421 if ((sscanf(p, "%*[^/]/%d", &value) != 1) &&
2422 (sscanf(p, "%*[^/]/%*d-%d", &value) != 1)) {
2423 return False;
2427 /* Parse OK */
2429 string_set(ptr,pszParmValue);
2430 return True;
2433 /***************************************************************************
2434 initialise a copymap
2435 ***************************************************************************/
2436 static void init_copymap(service *pservice)
2438 int i;
2439 if (pservice->copymap) free(pservice->copymap);
2440 pservice->copymap = (BOOL *)malloc(sizeof(BOOL)*NUMPARAMETERS);
2441 if (!pservice->copymap)
2442 DEBUG(0,("Couldn't allocate copymap!! (size %d)\n",(int)NUMPARAMETERS));
2443 else
2444 for (i=0;i<NUMPARAMETERS;i++)
2445 pservice->copymap[i] = True;
2449 /***************************************************************************
2450 return the local pointer to a parameter given the service number and the
2451 pointer into the default structure
2452 ***************************************************************************/
2453 void *lp_local_ptr(int snum, void *ptr)
2455 return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr,&sDefault));
2458 /***************************************************************************
2459 Process a parameter for a particular service number. If snum < 0
2460 then assume we are in the globals
2461 ***************************************************************************/
2462 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2464 int parmnum, i;
2465 void *parm_ptr=NULL; /* where we are going to store the result */
2466 void *def_ptr=NULL;
2468 parmnum = map_parameter(pszParmName);
2470 if (parmnum < 0)
2472 DEBUG(0,( "Ignoring unknown parameter \"%s\"\n", pszParmName));
2473 return(True);
2476 if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
2477 DEBUG(1,("WARNING: The \"%s\"option is deprecated\n",
2478 pszParmName));
2481 def_ptr = parm_table[parmnum].ptr;
2483 /* we might point at a service, the default service or a global */
2484 if (snum < 0) {
2485 parm_ptr = def_ptr;
2486 } else {
2487 if (parm_table[parmnum].class == P_GLOBAL) {
2488 DEBUG(0,( "Global parameter %s found in service section!\n",pszParmName));
2489 return(True);
2491 parm_ptr = ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,&sDefault);
2494 if (snum >= 0) {
2495 if (!iSERVICE(snum).copymap)
2496 init_copymap(pSERVICE(snum));
2498 /* this handles the aliases - set the copymap for other entries with
2499 the same data pointer */
2500 for (i=0;parm_table[i].label;i++)
2501 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2502 iSERVICE(snum).copymap[i] = False;
2505 /* if it is a special case then go ahead */
2506 if (parm_table[parmnum].special) {
2507 parm_table[parmnum].special(pszParmValue,(char **)parm_ptr);
2508 return(True);
2511 /* now switch on the type of variable it is */
2512 switch (parm_table[parmnum].type)
2514 case P_BOOL:
2515 set_boolean(parm_ptr,pszParmValue);
2516 break;
2518 case P_BOOLREV:
2519 set_boolean(parm_ptr,pszParmValue);
2520 *(BOOL *)parm_ptr = ! *(BOOL *)parm_ptr;
2521 break;
2523 case P_INTEGER:
2524 *(int *)parm_ptr = atoi(pszParmValue);
2525 break;
2527 case P_CHAR:
2528 *(char *)parm_ptr = *pszParmValue;
2529 break;
2531 case P_OCTAL:
2532 sscanf(pszParmValue,"%o",(int *)parm_ptr);
2533 break;
2535 case P_STRING:
2536 string_set(parm_ptr,pszParmValue);
2537 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2538 unix_to_dos(*(char **)parm_ptr, True);
2539 break;
2541 case P_USTRING:
2542 string_set(parm_ptr,pszParmValue);
2543 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2544 unix_to_dos(*(char **)parm_ptr, True);
2545 strupper(*(char **)parm_ptr);
2546 break;
2548 case P_GSTRING:
2549 pstrcpy((char *)parm_ptr,pszParmValue);
2550 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2551 unix_to_dos((char *)parm_ptr, True);
2552 break;
2554 case P_UGSTRING:
2555 pstrcpy((char *)parm_ptr,pszParmValue);
2556 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2557 unix_to_dos((char *)parm_ptr, True);
2558 strupper((char *)parm_ptr);
2559 break;
2561 case P_ENUM:
2562 for (i=0;parm_table[parmnum].enum_list[i].name;i++) {
2563 if (strequal(pszParmValue, parm_table[parmnum].enum_list[i].name)) {
2564 *(int *)parm_ptr = parm_table[parmnum].enum_list[i].value;
2565 break;
2568 break;
2569 case P_SEP:
2570 break;
2573 return(True);
2576 /***************************************************************************
2577 Process a parameter.
2578 ***************************************************************************/
2579 static BOOL do_parameter( char *pszParmName, char *pszParmValue )
2581 if( !bInGlobalSection && bGlobalOnly )
2582 return(True);
2584 DEBUGADD( 3, ( "doing parameter %s = %s\n", pszParmName, pszParmValue ) );
2586 return( lp_do_parameter( bInGlobalSection ? -2 : iServiceIndex,
2587 pszParmName,
2588 pszParmValue ) );
2592 /***************************************************************************
2593 print a parameter of the specified type
2594 ***************************************************************************/
2595 static void print_parameter(struct parm_struct *p,void *ptr, FILE *f)
2597 int i;
2598 switch (p->type) {
2599 case P_ENUM:
2600 for (i=0;p->enum_list[i].name;i++) {
2601 if (*(int *)ptr == p->enum_list[i].value) {
2602 fprintf(f,"%s",p->enum_list[i].name);
2603 break;
2606 break;
2608 case P_BOOL:
2609 fprintf(f,"%s",BOOLSTR(*(BOOL *)ptr));
2610 break;
2612 case P_BOOLREV:
2613 fprintf(f,"%s",BOOLSTR(! *(BOOL *)ptr));
2614 break;
2616 case P_INTEGER:
2617 fprintf(f,"%d",*(int *)ptr);
2618 break;
2620 case P_CHAR:
2621 fprintf(f,"%c",*(char *)ptr);
2622 break;
2624 case P_OCTAL:
2625 fprintf(f,"%s",octal_string(*(int *)ptr));
2626 break;
2628 case P_GSTRING:
2629 case P_UGSTRING:
2630 if ((char *)ptr)
2631 fprintf(f,"%s",(char *)ptr);
2632 break;
2634 case P_STRING:
2635 case P_USTRING:
2636 if (*(char **)ptr)
2637 fprintf(f,"%s",*(char **)ptr);
2638 break;
2639 case P_SEP:
2640 break;
2645 /***************************************************************************
2646 check if two parameters are equal
2647 ***************************************************************************/
2648 static BOOL equal_parameter(parm_type type,void *ptr1,void *ptr2)
2650 switch (type)
2652 case P_BOOL:
2653 case P_BOOLREV:
2654 return(*((BOOL *)ptr1) == *((BOOL *)ptr2));
2656 case P_INTEGER:
2657 case P_ENUM:
2658 case P_OCTAL:
2659 return(*((int *)ptr1) == *((int *)ptr2));
2661 case P_CHAR:
2662 return(*((char *)ptr1) == *((char *)ptr2));
2664 case P_GSTRING:
2665 case P_UGSTRING:
2667 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2668 if (p1 && !*p1) p1 = NULL;
2669 if (p2 && !*p2) p2 = NULL;
2670 return(p1==p2 || strequal(p1,p2));
2672 case P_STRING:
2673 case P_USTRING:
2675 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2676 if (p1 && !*p1) p1 = NULL;
2677 if (p2 && !*p2) p2 = NULL;
2678 return(p1==p2 || strequal(p1,p2));
2680 case P_SEP:
2681 break;
2683 return(False);
2686 /***************************************************************************
2687 Process a new section (service). At this stage all sections are services.
2688 Later we'll have special sections that permit server parameters to be set.
2689 Returns True on success, False on failure.
2690 ***************************************************************************/
2691 static BOOL do_section(char *pszSectionName)
2693 BOOL bRetval;
2694 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2695 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2696 bRetval = False;
2698 /* if we were in a global section then do the local inits */
2699 if (bInGlobalSection && !isglobal)
2700 init_locals();
2702 /* if we've just struck a global section, note the fact. */
2703 bInGlobalSection = isglobal;
2705 /* check for multiple global sections */
2706 if (bInGlobalSection)
2708 DEBUG( 3, ( "Processing section \"[%s]\"\n", pszSectionName ) );
2709 return(True);
2712 if (!bInGlobalSection && bGlobalOnly) return(True);
2714 /* if we have a current service, tidy it up before moving on */
2715 bRetval = True;
2717 if (iServiceIndex >= 0)
2718 bRetval = service_ok(iServiceIndex);
2720 /* if all is still well, move to the next record in the services array */
2721 if (bRetval)
2723 /* We put this here to avoid an odd message order if messages are */
2724 /* issued by the post-processing of a previous section. */
2725 DEBUG(2,( "Processing section \"[%s]\"\n", pszSectionName));
2727 if ((iServiceIndex=add_a_service(&sDefault,pszSectionName)) < 0)
2729 DEBUG(0,("Failed to add a new service\n"));
2730 return(False);
2734 return (bRetval);
2738 /***************************************************************************
2739 determine if a partcular base parameter is currently set to the default value.
2740 ***************************************************************************/
2741 static BOOL is_default(int i)
2743 if (!defaults_saved) return False;
2744 switch (parm_table[i].type) {
2745 case P_STRING:
2746 case P_USTRING:
2747 return strequal(parm_table[i].def.svalue,*(char **)parm_table[i].ptr);
2748 case P_GSTRING:
2749 case P_UGSTRING:
2750 return strequal(parm_table[i].def.svalue,(char *)parm_table[i].ptr);
2751 case P_BOOL:
2752 case P_BOOLREV:
2753 return parm_table[i].def.bvalue == *(BOOL *)parm_table[i].ptr;
2754 case P_CHAR:
2755 return parm_table[i].def.cvalue == *(char *)parm_table[i].ptr;
2756 case P_INTEGER:
2757 case P_OCTAL:
2758 case P_ENUM:
2759 return parm_table[i].def.ivalue == *(int *)parm_table[i].ptr;
2760 case P_SEP:
2761 break;
2763 return False;
2767 /***************************************************************************
2768 Display the contents of the global structure.
2769 ***************************************************************************/
2770 static void dump_globals(FILE *f)
2772 int i;
2773 fprintf(f, "# Global parameters\n[global]\n");
2775 for (i=0;parm_table[i].label;i++)
2776 if (parm_table[i].class == P_GLOBAL &&
2777 parm_table[i].ptr &&
2778 (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr))) {
2779 if (defaults_saved && is_default(i)) continue;
2780 fprintf(f,"\t%s = ",parm_table[i].label);
2781 print_parameter(&parm_table[i],parm_table[i].ptr, f);
2782 fprintf(f,"\n");
2786 /***************************************************************************
2787 return True if a local parameter is currently set to the global default
2788 ***************************************************************************/
2789 BOOL lp_is_default(int snum, struct parm_struct *parm)
2791 int pdiff = PTR_DIFF(parm->ptr,&sDefault);
2793 return equal_parameter(parm->type,
2794 ((char *)pSERVICE(snum)) + pdiff,
2795 ((char *)&sDefault) + pdiff);
2799 /***************************************************************************
2800 Display the contents of a single services record.
2801 ***************************************************************************/
2802 static void dump_a_service(service *pService, FILE *f)
2804 int i;
2805 if (pService != &sDefault)
2806 fprintf(f,"\n[%s]\n",pService->szService);
2808 for (i=0;parm_table[i].label;i++)
2809 if (parm_table[i].class == P_LOCAL &&
2810 parm_table[i].ptr &&
2811 (*parm_table[i].label != '-') &&
2812 (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr))) {
2813 int pdiff = PTR_DIFF(parm_table[i].ptr,&sDefault);
2815 if (pService == &sDefault) {
2816 if (defaults_saved && is_default(i)) continue;
2817 } else {
2818 if (equal_parameter(parm_table[i].type,
2819 ((char *)pService) + pdiff,
2820 ((char *)&sDefault) + pdiff))
2821 continue;
2824 fprintf(f,"\t%s = ",parm_table[i].label);
2825 print_parameter(&parm_table[i],
2826 ((char *)pService) + pdiff, f);
2827 fprintf(f,"\n");
2832 /***************************************************************************
2833 return info about the next service in a service. snum==-1 gives the globals
2835 return NULL when out of parameters
2836 ***************************************************************************/
2837 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
2839 if (snum == -1) {
2840 /* do the globals */
2841 for (;parm_table[*i].label;(*i)++) {
2842 if (parm_table[*i].class == P_SEPARATOR)
2843 return &parm_table[(*i)++];
2845 if (!parm_table[*i].ptr || (*parm_table[*i].label == '-'))
2846 continue;
2848 if ((*i) > 0 && (parm_table[*i].ptr == parm_table[(*i)-1].ptr))
2849 continue;
2851 return &parm_table[(*i)++];
2853 } else {
2854 service *pService = pSERVICE(snum);
2856 for (;parm_table[*i].label;(*i)++) {
2857 if (parm_table[*i].class == P_SEPARATOR)
2858 return &parm_table[(*i)++];
2860 if (parm_table[*i].class == P_LOCAL &&
2861 parm_table[*i].ptr &&
2862 (*parm_table[*i].label != '-') &&
2863 ((*i) == 0 ||
2864 (parm_table[*i].ptr != parm_table[(*i)-1].ptr))) {
2865 int pdiff = PTR_DIFF(parm_table[*i].ptr,&sDefault);
2867 if (allparameters ||
2868 !equal_parameter(parm_table[*i].type,
2869 ((char *)pService) + pdiff,
2870 ((char *)&sDefault) + pdiff)) {
2871 return &parm_table[(*i)++];
2877 return NULL;
2881 #if 0
2882 /***************************************************************************
2883 Display the contents of a single copy structure.
2884 ***************************************************************************/
2885 static void dump_copy_map(BOOL *pcopymap)
2887 int i;
2888 if (!pcopymap) return;
2890 printf("\n\tNon-Copied parameters:\n");
2892 for (i=0;parm_table[i].label;i++)
2893 if (parm_table[i].class == P_LOCAL &&
2894 parm_table[i].ptr && !pcopymap[i] &&
2895 (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr)))
2897 printf("\t\t%s\n",parm_table[i].label);
2900 #endif
2902 /***************************************************************************
2903 Return TRUE if the passed service number is within range.
2904 ***************************************************************************/
2905 BOOL lp_snum_ok(int iService)
2907 return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
2911 /***************************************************************************
2912 auto-load some home services
2913 ***************************************************************************/
2914 static void lp_add_auto_services(char *str)
2916 char *s;
2917 char *p;
2918 int homes;
2920 if (!str) return;
2922 s = strdup(str);
2923 if (!s) return;
2925 homes = lp_servicenumber(HOMES_NAME);
2927 for (p=strtok(s,LIST_SEP);p;p=strtok(NULL,LIST_SEP)) {
2928 char *home = get_unixhome_dir(p);
2930 if (lp_servicenumber(p) >= 0) continue;
2932 if (home && homes >= 0) {
2933 lp_add_home(p,homes,home);
2936 free(s);
2939 /***************************************************************************
2940 auto-load one printer
2941 ***************************************************************************/
2942 void lp_add_one_printer(char *name,char *comment)
2944 int printers = lp_servicenumber(PRINTERS_NAME);
2945 int i;
2947 if (lp_servicenumber(name) < 0) {
2948 lp_add_printer(name,printers);
2949 if ((i=lp_servicenumber(name)) >= 0)
2950 string_set(&iSERVICE(i).comment,comment);
2954 /***************************************************************************
2955 have we loaded a services file yet?
2956 ***************************************************************************/
2957 BOOL lp_loaded(void)
2959 return(bLoaded);
2962 /***************************************************************************
2963 unload unused services
2964 ***************************************************************************/
2965 void lp_killunused(BOOL (*snumused)(int ))
2967 int i;
2968 for (i=0;i<iNumServices;i++)
2969 if (VALID(i) && (!snumused || !snumused(i)))
2971 iSERVICE(i).valid = False;
2972 free_service(pSERVICE(i));
2977 /***************************************************************************
2978 save the curent values of all global and sDefault parameters into the
2979 defaults union. This allows swat and testparm to show only the
2980 changed (ie. non-default) parameters.
2981 ***************************************************************************/
2982 static void lp_save_defaults(void)
2984 int i;
2985 for (i = 0; parm_table[i].label; i++) {
2986 if (i>0 && parm_table[i].ptr == parm_table[i-1].ptr) continue;
2987 switch (parm_table[i].type) {
2988 case P_STRING:
2989 case P_USTRING:
2990 parm_table[i].def.svalue = strdup(*(char **)parm_table[i].ptr);
2991 break;
2992 case P_GSTRING:
2993 case P_UGSTRING:
2994 parm_table[i].def.svalue = strdup((char *)parm_table[i].ptr);
2995 break;
2996 case P_BOOL:
2997 case P_BOOLREV:
2998 parm_table[i].def.bvalue = *(BOOL *)parm_table[i].ptr;
2999 break;
3000 case P_CHAR:
3001 parm_table[i].def.cvalue = *(char *)parm_table[i].ptr;
3002 break;
3003 case P_INTEGER:
3004 case P_OCTAL:
3005 case P_ENUM:
3006 parm_table[i].def.ivalue = *(int *)parm_table[i].ptr;
3007 break;
3008 case P_SEP:
3009 break;
3012 defaults_saved = True;
3015 /*******************************************************************
3016 Set the server type we will announce as via nmbd.
3017 ********************************************************************/
3018 static void set_server_role(void)
3020 server_role = ROLE_STANDALONE;
3022 switch (lp_security())
3024 case SEC_SHARE:
3026 if (lp_domain_logons())
3028 DEBUG(0,("Server's Role (logon server) conflicts with share-level security\n"));
3030 break;
3032 case SEC_SERVER:
3033 case SEC_DOMAIN:
3035 if (lp_domain_logons())
3037 server_role = ROLE_DOMAIN_BDC;
3038 break;
3040 server_role = ROLE_DOMAIN_MEMBER;
3041 break;
3043 case SEC_USER:
3045 if (lp_domain_logons())
3047 server_role = ROLE_DOMAIN_PDC;
3048 break;
3050 break;
3052 default:
3054 DEBUG(0,("Server's Role undefined due to unknown security mode\n"));
3060 /***************************************************************************
3061 Load the services array from the services file. Return True on success,
3062 False on failure.
3063 ***************************************************************************/
3064 BOOL lp_load(char *pszFname,BOOL global_only, BOOL save_defaults, BOOL add_ipc)
3066 pstring n2;
3067 BOOL bRetval;
3069 add_to_file_list(pszFname);
3071 bRetval = False;
3073 bInGlobalSection = True;
3074 bGlobalOnly = global_only;
3076 init_globals();
3078 if (save_defaults) {
3079 init_locals();
3080 lp_save_defaults();
3083 pstrcpy(n2,pszFname);
3084 standard_sub_basic(n2);
3086 /* We get sections first, so have to start 'behind' to make up */
3087 iServiceIndex = -1;
3088 bRetval = pm_process(n2, do_section, do_parameter);
3090 /* finish up the last section */
3091 DEBUG(3,("pm_process() returned %s\n", BOOLSTR(bRetval)));
3092 if (bRetval)
3093 if (iServiceIndex >= 0)
3094 bRetval = service_ok(iServiceIndex);
3096 lp_add_auto_services(lp_auto_services());
3098 if (add_ipc)
3099 lp_add_ipc();
3101 set_server_role();
3102 set_default_server_announce_type();
3104 bLoaded = True;
3106 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3107 /* if bWINSsupport is true and we are in the client */
3109 if (in_client && Globals.bWINSsupport) {
3111 string_set(&Globals.szWINSserver, "127.0.0.1");
3115 return (bRetval);
3119 /***************************************************************************
3120 reset the max number of services
3121 ***************************************************************************/
3122 void lp_resetnumservices(void)
3124 iNumServices = 0;
3127 /***************************************************************************
3128 return the max number of services
3129 ***************************************************************************/
3130 int lp_numservices(void)
3132 return(iNumServices);
3135 /***************************************************************************
3136 Display the contents of the services array in human-readable form.
3137 ***************************************************************************/
3138 void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
3140 int iService;
3142 if (show_defaults) {
3143 defaults_saved = False;
3146 dump_globals(f);
3148 dump_a_service(&sDefault, f);
3150 for (iService = 0; iService < maxtoprint; iService++)
3151 lp_dump_one(f, show_defaults, iService);
3154 /***************************************************************************
3155 Display the contents of one service in human-readable form.
3156 ***************************************************************************/
3157 void lp_dump_one(FILE *f, BOOL show_defaults, int snum)
3159 if (VALID(snum))
3161 if (iSERVICE(snum).szService[0] == '\0')
3162 return;
3163 dump_a_service(pSERVICE(snum), f);
3168 /***************************************************************************
3169 Return the number of the service with the given name, or -1 if it doesn't
3170 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3171 getservicebyname()! This works ONLY if all services have been loaded, and
3172 does not copy the found service.
3173 ***************************************************************************/
3174 int lp_servicenumber(char *pszServiceName)
3176 int iService;
3178 for (iService = iNumServices - 1; iService >= 0; iService--)
3179 if (VALID(iService) &&
3180 strequal(lp_servicename(iService), pszServiceName))
3181 break;
3183 if (iService < 0)
3184 DEBUG(7,("lp_servicenumber: couldn't find %s\n",pszServiceName));
3186 return (iService);
3189 /*******************************************************************
3190 a useful volume label function
3191 ******************************************************************/
3192 char *volume_label(int snum)
3194 char *ret = lp_volume(snum);
3195 if (!*ret) return(lp_servicename(snum));
3196 return(ret);
3200 /*******************************************************************
3201 Set the server type we will announce as via nmbd.
3202 ********************************************************************/
3203 static void set_default_server_announce_type(void)
3205 default_server_announce = 0;
3206 default_server_announce |= SV_TYPE_WORKSTATION;
3207 default_server_announce |= SV_TYPE_SERVER;
3208 default_server_announce |= SV_TYPE_SERVER_UNIX;
3209 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3211 switch (lp_announce_as())
3213 case ANNOUNCE_AS_NT:
3215 default_server_announce |= SV_TYPE_SERVER_NT;
3216 default_server_announce |= SV_TYPE_NT;
3217 break;
3219 case ANNOUNCE_AS_WIN95:
3221 default_server_announce |= SV_TYPE_WIN95_PLUS;
3222 break;
3224 case ANNOUNCE_AS_WFW:
3226 default_server_announce |= SV_TYPE_WFW;
3227 break;
3229 default:
3231 break;
3235 switch (lp_server_role())
3237 case ROLE_DOMAIN_MEMBER:
3239 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3240 break;
3242 case ROLE_DOMAIN_PDC:
3244 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3245 break;
3247 case ROLE_DOMAIN_BDC:
3249 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3250 break;
3252 case ROLE_STANDALONE:
3253 default:
3255 break;
3259 if (lp_time_server())
3261 default_server_announce |= SV_TYPE_TIME_SOURCE;
3265 /***********************************************************
3266 returns role of Samba server
3267 ************************************************************/
3269 int lp_server_role(void)
3271 return server_role;
3274 /***********************************************************
3275 If we are PDC then prefer us as DMB
3276 ************************************************************/
3278 BOOL lp_domain_master(void)
3280 if (Globals.bDomainMaster == Auto)
3282 return (lp_server_role() == ROLE_DOMAIN_PDC);
3285 return Globals.bDomainMaster;
3288 /***********************************************************
3289 If we are DMB then prefer us as LMB
3290 ************************************************************/
3292 BOOL lp_preferred_master(void)
3294 if (Globals.bPreferredMaster == Auto)
3296 return (lp_local_master() && lp_domain_master());
3299 return Globals.bPreferredMaster;
3304 /*******************************************************************
3305 remove a service
3306 ********************************************************************/
3307 void lp_remove_service(int snum)
3309 pSERVICE(snum)->valid = False;
3312 /*******************************************************************
3313 copy a service
3314 ********************************************************************/
3315 void lp_copy_service(int snum, char *new_name)
3317 char *oldname = lp_servicename(snum);
3318 do_section(new_name);
3319 if (snum >= 0) {
3320 snum = lp_servicenumber(new_name);
3321 if (snum >= 0)
3322 lp_do_parameter(snum, "copy", oldname);
3327 /*******************************************************************
3328 Get the default server type we will announce as via nmbd.
3329 ********************************************************************/
3330 int lp_default_server_announce(void)
3332 return default_server_announce;
3335 /*******************************************************************
3336 Split the announce version into major and minor numbers.
3337 ********************************************************************/
3338 int lp_major_announce_version(void)
3340 static BOOL got_major = False;
3341 static int major_version = DEFAULT_MAJOR_VERSION;
3342 char *vers;
3343 char *p;
3345 if(got_major)
3346 return major_version;
3348 got_major = True;
3349 if((vers = lp_announce_version()) == NULL)
3350 return major_version;
3352 if((p = strchr(vers, '.')) == 0)
3353 return major_version;
3355 *p = '\0';
3356 major_version = atoi(vers);
3357 return major_version;
3360 int lp_minor_announce_version(void)
3362 static BOOL got_minor = False;
3363 static int minor_version = DEFAULT_MINOR_VERSION;
3364 char *vers;
3365 char *p;
3367 if(got_minor)
3368 return minor_version;
3370 got_minor = True;
3371 if((vers = lp_announce_version()) == NULL)
3372 return minor_version;
3374 if((p = strchr(vers, '.')) == 0)
3375 return minor_version;
3377 p++;
3378 minor_version = atoi(p);
3379 return minor_version;
3382 /***********************************************************
3383 Set the global name resolution order (used in smbclient).
3384 ************************************************************/
3386 void lp_set_name_resolve_order(char *new_order)
3388 Globals.szNameResolveOrder = new_order;
3391 /***********************************************************
3392 Set the flag that says if kernel oplocks are available
3393 (called by smbd).
3394 ************************************************************/
3396 static BOOL kernel_oplocks_available = False;
3398 void lp_set_kernel_oplocks(BOOL val)
3401 * Only set this to True if kerenl
3402 * oplocks are really available and were
3403 * turned on in the smb.conf file.
3406 if(Globals.bKernelOplocks && val)
3407 kernel_oplocks_available = True;
3408 else
3409 kernel_oplocks_available = False;
3412 /***********************************************************
3413 Return True if kernel oplocks are available and were turned
3414 on in smb.conf.
3415 ************************************************************/
3417 BOOL lp_kernel_oplocks(void)
3419 return kernel_oplocks_available;
3422 /***********************************************************
3423 Functions to return the current security masks/modes. If
3424 set to -1 then return the create mask/mode instead.
3425 ************************************************************/
3427 int lp_security_mask(int snum)
3429 int val = _lp_security_mask(snum);
3430 if(val == -1)
3431 return lp_create_mask(snum);
3432 return val;
3435 int lp_force_security_mode(int snum)
3437 int val = _lp_force_security_mode(snum);
3438 if(val == -1)
3439 return lp_force_create_mode(snum);
3440 return val;
3443 int lp_dir_security_mask(int snum)
3445 int val = _lp_dir_security_mask(snum);
3446 if(val == -1)
3447 return lp_dir_mask(snum);
3448 return val;
3451 int lp_force_dir_security_mode(int snum)
3453 int val = _lp_force_dir_security_mode(snum);
3454 if(val == -1)
3455 return lp_force_dir_mode(snum);
3456 return val;