add WITH_SENDFILE profiling data (from Pierre Belanger)
[Samba.git] / source / param / loadparm.c
blobada6a27e9c801df3d78cfb3508b2ea3a2be1ffd5
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_CLASS[DBGC_LAST];
72 extern pstring user_socket_options;
73 extern pstring global_myname;
74 pstring global_scope = "";
77 #ifndef GLOBAL_NAME
78 #define GLOBAL_NAME "global"
79 #endif
81 #ifndef PRINTERS_NAME
82 #define PRINTERS_NAME "printers"
83 #endif
85 #ifndef HOMES_NAME
86 #define HOMES_NAME "homes"
87 #endif
89 /* some helpful bits */
90 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
91 #define VALID(i) ServicePtrs[i]->valid
93 int keepalive = DEFAULT_KEEPALIVE;
94 BOOL use_getwd_cache = True;
96 extern int extra_time_offset;
98 static BOOL defaults_saved = False;
101 * This structure describes global (ie., server-wide) parameters.
103 typedef struct
105 char *szPrintcapname;
106 char *szEnumPortsCommand;
107 char *szAddPrinterCommand;
108 char *szDeletePrinterCommand;
109 char *szOs2DriverMap;
110 char *szLockDir;
111 char *szPidDir;
112 char *szRootdir;
113 char *szDefaultService;
114 char *szDfree;
115 char *szMsgCommand;
116 char *szHostsEquiv;
117 char *szServerString;
118 char *szAutoServices;
119 char *szPasswdProgram;
120 char *szPasswdChat;
121 char *szLogFile;
122 char *szConfigFile;
123 #ifdef WITH_TDB_SAM
124 char *szTDBPasswdFile;
125 #else
126 char *szSMBPasswdFile;
127 #endif
128 char *szPasswordServer;
129 char *szSocketOptions;
130 char *szValidChars;
131 char *szWorkGroup;
132 char *szDomainAdminGroup;
133 char *szDomainGuestGroup;
134 char *szDomainHostsallow;
135 char *szDomainHostsdeny;
136 char *szUsernameMap;
137 #ifdef USING_GROUPNAME_MAP
138 char *szGroupnameMap;
139 #endif /* USING_GROUPNAME_MAP */
140 char *szCharacterSet;
141 char *szCodePageDir;
142 char *szLogonScript;
143 char *szLogonPath;
144 char *szLogonDrive;
145 char *szLogonHome;
146 char *szWINSserver;
147 char *szCodingSystem;
148 char *szInterfaces;
149 char *szRemoteAnnounce;
150 char *szRemoteBrowseSync;
151 char *szSocketAddress;
152 char *szNISHomeMapName;
153 char *szAnnounceVersion; /* This is initialised in init_globals */
154 char *szNetbiosAliases;
155 char *szDomainOtherSIDs;
156 char *szNameResolveOrder;
157 char *szPanicAction;
158 char *szAddUserScript;
159 char *szDelUserScript;
160 char *szWINSHook;
161 #ifdef WITH_UTMP
162 char *szUtmpDir;
163 char *szWtmpDir;
164 BOOL bUtmp;
165 #endif
166 char *szSourceEnv;
167 char *szWinbindUID;
168 char *szWinbindGID;
169 char *szTemplateHomedir;
170 char *szTemplateShell;
171 char *szWinbindSeparator;
172 BOOL bWinbindEnumUsers;
173 BOOL bWinbindEnumGroups;
174 BOOL bWinbindUseDefaultDomain;
175 char *szAddShareCommand;
176 char *szChangeShareCommand;
177 char *szDeleteShareCommand;
178 char *szManglingMethod;
179 int max_log_size;
180 int mangled_stack;
181 int max_xmit;
182 int max_mux;
183 int max_open_files;
184 int max_packet;
185 int pwordlevel;
186 int unamelevel;
187 int deadtime;
188 int maxprotocol;
189 int minprotocol;
190 int security;
191 int maxdisksize;
192 int lpqcachetime;
193 int iMaxSmbdProcesses;
194 BOOL bDisableSpoolss;
195 int iTotalPrintJobs;
196 int syslog;
197 int os_level;
198 int enhanced_browsing;
199 int max_ttl;
200 int max_wins_ttl;
201 int min_wins_ttl;
202 int ReadSize;
203 int lm_announce;
204 int lm_interval;
205 int client_code_page;
206 int announce_as; /* This is initialised in init_globals */
207 int machine_password_timeout;
208 int change_notify_timeout;
209 int stat_cache_size;
210 int map_to_guest;
211 int min_passwd_length;
212 int oplock_break_wait_time;
213 int winbind_cache_time;
214 int iLockSpinCount;
215 int iLockSpinTime;
216 #ifdef WITH_LDAP_SAM
217 int ldap_port;
218 int ldap_ssl;
219 char *szLdapServer;
220 char *szLdapSuffix;
221 char *szLdapFilter;
222 char *szLdapAdminDn;
223 #endif /* WITH_LDAP */
225 #ifdef WITH_SSL
226 int sslVersion;
227 char *sslHostsRequire;
228 char *sslHostsResign;
229 char *sslCaCertDir;
230 char *sslCaCertFile;
231 char *sslServerCert;
232 char *sslServerPrivKey;
233 char *sslClientCert;
234 char *sslClientPrivKey;
235 char *sslCiphers;
236 char *sslEgdSocket;
237 char *sslEntropyFile;
238 int sslEntropyBytes;
239 BOOL sslEnabled;
240 BOOL sslReqClientCert;
241 BOOL sslReqServerCert;
242 BOOL sslCompatibility;
243 #endif /* WITH_SSL */
244 BOOL bMsAddPrinterWizard;
245 BOOL bDNSproxy;
246 BOOL bWINSsupport;
247 BOOL bWINSproxy;
248 BOOL bLocalMaster;
249 BOOL bPreferredMaster;
250 BOOL bDomainMaster;
251 BOOL bDomainLogons;
252 BOOL bEncryptPasswords;
253 BOOL bUpdateEncrypt;
254 BOOL bStripDot;
255 BOOL bNullPasswords;
256 BOOL bObeyPamRestrictions;
257 BOOL bLoadPrinters;
258 BOOL bUseRhosts;
259 BOOL bLargeReadwrite;
260 BOOL bReadRaw;
261 BOOL bWriteRaw;
262 BOOL bReadPrediction;
263 BOOL bReadbmpx;
264 BOOL bSyslogOnly;
265 BOOL bAdminLog;
266 BOOL bBrowseList;
267 BOOL bNISHomeMap;
268 BOOL bTimeServer;
269 BOOL bBindInterfacesOnly;
270 BOOL bPamPasswordChange;
271 BOOL bUnixPasswdSync;
272 BOOL bPasswdChatDebug;
273 BOOL bTimestampLogs;
274 BOOL bNTSmbSupport;
275 BOOL bNTPipeSupport;
276 BOOL bNTStatusSupport;
277 BOOL bStatCache;
278 BOOL bKernelOplocks;
279 BOOL bAllowTrustedDomains;
280 BOOL bRestrictAnonymous;
281 BOOL bLanmanAuth;
282 BOOL bDebugHiresTimestamp;
283 BOOL bDebugPid;
284 BOOL bDebugUid;
285 BOOL bHostMSDfs;
286 BOOL bHideLocalUsers;
287 BOOL bUseMmap;
288 BOOL bUnixExtensions;
289 int name_cache_timeout;
291 global;
293 static global Globals;
298 * This structure describes a single service.
300 typedef struct
302 BOOL valid;
303 BOOL autoloaded;
304 char *szService;
305 char *szPath;
306 char *szUsername;
307 char *szGuestaccount;
308 char *szInvalidUsers;
309 char *szValidUsers;
310 char *szAdminUsers;
311 char *szCopy;
312 char *szInclude;
313 char *szPreExec;
314 char *szPostExec;
315 char *szRootPreExec;
316 char *szRootPostExec;
317 char *szPrintcommand;
318 char *szLpqcommand;
319 char *szLprmcommand;
320 char *szLppausecommand;
321 char *szLpresumecommand;
322 char *szQueuepausecommand;
323 char *szQueueresumecommand;
324 char *szPrintername;
325 char *szPrinterDriver;
326 char *szPrinterDriverLocation;
327 char *szDriverFile;
328 char *szDontdescend;
329 char *szHostsallow;
330 char *szHostsdeny;
331 char *szMagicScript;
332 char *szMagicOutput;
333 char *szMangledMap;
334 char *szVetoFiles;
335 char *szHideFiles;
336 char *szVetoOplockFiles;
337 char *comment;
338 char *force_user;
339 char *force_group;
340 char *readlist;
341 char *writelist;
342 char *printer_admin;
343 char *volume;
344 char *fstype;
345 char *szVfsObjectFile;
346 char *szVfsOptions;
347 int iMinPrintSpace;
348 int iMaxPrintJobs;
349 int iWriteCacheSize;
350 int iCreate_mask;
351 int iCreate_force_mode;
352 int iSecurity_mask;
353 int iSecurity_force_mode;
354 int iDir_mask;
355 int iDir_force_mode;
356 int iDir_Security_mask;
357 int iDir_Security_force_mode;
358 int iMaxConnections;
359 int iDefaultCase;
360 int iPrinting;
361 int iOplockContentionLimit;
362 int iCSCPolicy;
363 int iBlock_size;
364 BOOL bAlternatePerm;
365 BOOL bPreexecClose;
366 BOOL bRootpreexecClose;
367 BOOL bCaseSensitive;
368 BOOL bCasePreserve;
369 BOOL bShortCasePreserve;
370 BOOL bCaseMangle;
371 BOOL status;
372 BOOL bHideDotFiles;
373 BOOL bHideUnReadable;
374 BOOL bBrowseable;
375 BOOL bAvailable;
376 BOOL bRead_only;
377 BOOL bNo_set_dir;
378 BOOL bGuest_only;
379 BOOL bGuest_ok;
380 BOOL bPrint_ok;
381 BOOL bPostscript;
382 BOOL bMap_system;
383 BOOL bMap_hidden;
384 BOOL bMap_archive;
385 BOOL bLocking;
386 BOOL bStrictLocking;
387 BOOL bPosixLocking;
388 BOOL bShareModes;
389 BOOL bOpLocks;
390 BOOL bLevel2OpLocks;
391 BOOL bOnlyUser;
392 BOOL bMangledNames;
393 BOOL bWidelinks;
394 BOOL bSymlinks;
395 BOOL bSyncAlways;
396 BOOL bStrictAllocate;
397 BOOL bStrictSync;
398 char magic_char;
399 BOOL *copymap;
400 BOOL bDeleteReadonly;
401 BOOL bFakeOplocks;
402 BOOL bDeleteVetoFiles;
403 BOOL bDosFilemode;
404 BOOL bDosFiletimes;
405 BOOL bDosFiletimeResolution;
406 BOOL bFakeDirCreateTimes;
407 BOOL bBlockingLocks;
408 BOOL bInheritPerms;
409 BOOL bInheritACLS;
410 BOOL bMSDfsRoot;
411 BOOL bUseClientDriver;
412 BOOL bDefaultDevmode;
413 BOOL bNTAclSupport;
414 BOOL bForceUnknownAclUser;
415 #ifdef WITH_SENDFILE
416 BOOL bUseSendfile;
417 #endif
418 BOOL bProfileAcls;
420 char dummy[3]; /* for alignment */
422 service;
425 /* This is a default service used to prime a services structure */
426 static service sDefault = {
427 True, /* valid */
428 False, /* not autoloaded */
429 NULL, /* szService */
430 NULL, /* szPath */
431 NULL, /* szUsername */
432 NULL, /* szGuestAccount - this is set in init_globals() */
433 NULL, /* szInvalidUsers */
434 NULL, /* szValidUsers */
435 NULL, /* szAdminUsers */
436 NULL, /* szCopy */
437 NULL, /* szInclude */
438 NULL, /* szPreExec */
439 NULL, /* szPostExec */
440 NULL, /* szRootPreExec */
441 NULL, /* szRootPostExec */
442 NULL, /* szPrintcommand */
443 NULL, /* szLpqcommand */
444 NULL, /* szLprmcommand */
445 NULL, /* szLppausecommand */
446 NULL, /* szLpresumecommand */
447 NULL, /* szQueuepausecommand */
448 NULL, /* szQueueresumecommand */
449 NULL, /* szPrintername */
450 NULL, /* szPrinterDriver - this is set in init_globals() */
451 NULL, /* szPrinterDriverLocation */
452 NULL, /* szDriverFile */
453 NULL, /* szDontdescend */
454 NULL, /* szHostsallow */
455 NULL, /* szHostsdeny */
456 NULL, /* szMagicScript */
457 NULL, /* szMagicOutput */
458 NULL, /* szMangledMap */
459 NULL, /* szVetoFiles */
460 NULL, /* szHideFiles */
461 NULL, /* szVetoOplockFiles */
462 NULL, /* comment */
463 NULL, /* force user */
464 NULL, /* force group */
465 NULL, /* readlist */
466 NULL, /* writelist */
467 NULL, /* printer admin */
468 NULL, /* volume */
469 NULL, /* fstype */
470 NULL, /* vfs object */
471 NULL, /* vfs options */
472 0, /* iMinPrintSpace */
473 1000, /* iMaxPrintJobs */
474 0, /* iWriteCacheSize */
475 0744, /* iCreate_mask */
476 0000, /* iCreate_force_mode */
477 0777, /* iSecurity_mask */
478 0, /* iSecurity_force_mode */
479 0755, /* iDir_mask */
480 0000, /* iDir_force_mode */
481 0777, /* iDir_Security_mask */
482 0, /* iDir_Security_force_mode */
483 0, /* iMaxConnections */
484 CASE_LOWER, /* iDefaultCase */
485 DEFAULT_PRINTING, /* iPrinting */
486 2, /* iOplockContentionLimit */
487 0, /* iCSCPolicy */
488 1024, /* iBlock_size */
489 False, /* bAlternatePerm */
490 False, /* bPreexecClose */
491 False, /* bRootpreexecClose */
492 False, /* case sensitive */
493 True, /* case preserve */
494 True, /* short case preserve */
495 False, /* case mangle */
496 True, /* status */
497 True, /* bHideDotFiles */
498 False, /* bHideUnReadable */
499 True, /* bBrowseable */
500 True, /* bAvailable */
501 True, /* bRead_only */
502 True, /* bNo_set_dir */
503 False, /* bGuest_only */
504 False, /* bGuest_ok */
505 False, /* bPrint_ok */
506 False, /* bPostscript */
507 False, /* bMap_system */
508 False, /* bMap_hidden */
509 True, /* bMap_archive */
510 True, /* bLocking */
511 False, /* bStrictLocking */
512 True, /* bPosixLocking */
513 True, /* bShareModes */
514 True, /* bOpLocks */
515 True, /* bLevel2OpLocks */
516 False, /* bOnlyUser */
517 True, /* bMangledNames */
518 True, /* bWidelinks */
519 True, /* bSymlinks */
520 False, /* bSyncAlways */
521 False, /* bStrictAllocate */
522 False, /* bStrictSync */
523 '~', /* magic char */
524 NULL, /* copymap */
525 False, /* bDeleteReadonly */
526 False, /* bFakeOplocks */
527 False, /* bDeleteVetoFiles */
528 False, /* bDosFilemode */
529 False, /* bDosFiletimes */
530 False, /* bDosFiletimeResolution */
531 False, /* bFakeDirCreateTimes */
532 True, /* bBlockingLocks */
533 False, /* bInheritPerms */
534 False, /* bInheritACLS */
535 False, /* bMSDfsRoot */
536 False, /* bUseClientDriver */
537 False, /* bDefaultDevmode */
538 True, /* bNTAclSupport */
539 False, /* bForceUnknownAclUser */
540 #ifdef WITH_SENDFILE
541 False, /* bUseSendfile */
542 #endif
543 False, /* bProfileAcls */
545 "" /* dummy */
548 /* local variables */
549 static service **ServicePtrs = NULL;
550 static int iNumServices = 0;
551 static int iServiceIndex = 0;
552 static BOOL bInGlobalSection = True;
553 static BOOL bGlobalOnly = False;
554 static int server_role;
555 static int default_server_announce;
557 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
559 /* prototypes for the special type handlers */
560 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
561 static BOOL handle_include(char *pszParmValue, char **ptr);
562 static BOOL handle_copy(char *pszParmValue, char **ptr);
563 static BOOL handle_character_set(char *pszParmValue, char **ptr);
564 static BOOL handle_coding_system(char *pszParmValue, char **ptr);
565 static BOOL handle_client_code_page(char *pszParmValue, char **ptr);
566 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
567 static BOOL handle_source_env(char *pszParmValue, char **ptr);
568 static BOOL handle_netbios_name(char *pszParmValue, char **ptr);
569 static BOOL handle_winbind_uid(char *pszParmValue, char **ptr);
570 static BOOL handle_winbind_gid(char *pszParmValue, char **ptr);
571 static BOOL handle_wins_server_list(char *pszParmValue, char **ptr);
572 static BOOL handle_debug_list( char *pszParmValue, char **ptr );
574 static void set_server_role(void);
575 static void set_default_server_announce_type(void);
577 static struct enum_list enum_protocol[] = {
578 {PROTOCOL_NT1, "NT1"},
579 {PROTOCOL_LANMAN2, "LANMAN2"},
580 {PROTOCOL_LANMAN1, "LANMAN1"},
581 {PROTOCOL_CORE, "CORE"},
582 {PROTOCOL_COREPLUS, "COREPLUS"},
583 {PROTOCOL_COREPLUS, "CORE+"},
584 {-1, NULL}
587 static struct enum_list enum_security[] = {
588 {SEC_SHARE, "SHARE"},
589 {SEC_USER, "USER"},
590 {SEC_SERVER, "SERVER"},
591 {SEC_DOMAIN, "DOMAIN"},
592 {-1, NULL}
595 static struct enum_list enum_printing[] = {
596 {PRINT_SYSV, "sysv"},
597 {PRINT_AIX, "aix"},
598 {PRINT_HPUX, "hpux"},
599 {PRINT_BSD, "bsd"},
600 {PRINT_QNX, "qnx"},
601 {PRINT_PLP, "plp"},
602 {PRINT_LPRNG, "lprng"},
603 {PRINT_SOFTQ, "softq"},
604 {PRINT_CUPS, "cups"},
605 {PRINT_LPRNT, "nt"},
606 {PRINT_LPROS2, "os2"},
607 #ifdef DEVELOPER
608 {PRINT_TEST, "test"},
609 {PRINT_VLP, "vlp"},
610 #endif /* DEVELOPER */
611 {-1, NULL}
614 #ifdef WITH_LDAP_SAM
615 static struct enum_list enum_ldap_ssl[] = {
616 {LDAP_SSL_ON, "Yes"},
617 {LDAP_SSL_ON, "yes"},
618 {LDAP_SSL_ON, "on"},
619 {LDAP_SSL_ON, "On"},
620 {LDAP_SSL_OFF, "no"},
621 {LDAP_SSL_OFF, "No"},
622 {LDAP_SSL_OFF, "off"},
623 {LDAP_SSL_OFF, "Off"},
624 {LDAP_SSL_START_TLS, "start tls"},
625 {LDAP_SSL_START_TLS, "start_tls"},
626 {-1, NULL}
628 #endif
630 /* Types of machine we can announce as. */
631 #define ANNOUNCE_AS_NT_SERVER 1
632 #define ANNOUNCE_AS_WIN95 2
633 #define ANNOUNCE_AS_WFW 3
634 #define ANNOUNCE_AS_NT_WORKSTATION 4
636 static struct enum_list enum_announce_as[] = {
637 {ANNOUNCE_AS_NT_SERVER, "NT"},
638 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
639 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
640 {ANNOUNCE_AS_WIN95, "win95"},
641 {ANNOUNCE_AS_WFW, "WfW"},
642 {-1, NULL}
645 static struct enum_list enum_case[] = {
646 {CASE_LOWER, "lower"},
647 {CASE_UPPER, "upper"},
648 {-1, NULL}
651 static struct enum_list enum_bool_auto[] = {
652 {False, "No"},
653 {False, "False"},
654 {False, "0"},
655 {True, "Yes"},
656 {True, "True"},
657 {True, "1"},
658 {Auto, "Auto"},
659 {-1, NULL}
662 /* Client-side offline caching policy types */
663 #define CSC_POLICY_MANUAL 0
664 #define CSC_POLICY_DOCUMENTS 1
665 #define CSC_POLICY_PROGRAMS 2
666 #define CSC_POLICY_DISABLE 3
668 static struct enum_list enum_csc_policy[] = {
669 {CSC_POLICY_MANUAL, "manual"},
670 {CSC_POLICY_DOCUMENTS, "documents"},
671 {CSC_POLICY_PROGRAMS, "programs"},
672 {CSC_POLICY_DISABLE, "disable"},
673 {-1,NULL}
677 Do you want session setups at user level security with a invalid
678 password to be rejected or allowed in as guest? WinNT rejects them
679 but it can be a pain as it means "net view" needs to use a password
681 You have 3 choices in the setting of map_to_guest:
683 "Never" means session setups with an invalid password
684 are rejected. This is the default.
686 "Bad User" means session setups with an invalid password
687 are rejected, unless the username does not exist, in which case it
688 is treated as a guest login
690 "Bad Password" means session setups with an invalid password
691 are treated as a guest login
693 Note that map_to_guest only has an effect in user or server
694 level security.
697 static struct enum_list enum_map_to_guest[] = {
698 {NEVER_MAP_TO_GUEST, "Never"},
699 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
700 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
701 {-1, NULL}
704 #ifdef WITH_SSL
705 static struct enum_list enum_ssl_version[] = {
706 {SMB_SSL_V2, "ssl2"},
707 {SMB_SSL_V3, "ssl3"},
708 {SMB_SSL_V23, "ssl2or3"},
709 {SMB_SSL_TLS1, "tls1"},
710 {-1, NULL}
712 #endif
714 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
715 static struct parm_struct parm_table[] = {
716 {"Base Options", P_SEP, P_SEPARATOR},
718 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
719 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, handle_client_code_page, NULL, 0},
720 {"code page directory", P_STRING, P_GLOBAL, &Globals.szCodePageDir, NULL, NULL, 0},
721 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
722 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
723 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING},
724 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING | FLAG_WIZARD},
725 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC | FLAG_DOS_STRING | FLAG_WIZARD},
726 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING},
727 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, FLAG_DOS_STRING},
728 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
729 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC | FLAG_WIZARD},
730 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, FLAG_WIZARD},
732 {"Security Options", P_SEP, P_SEPARATOR},
734 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_WIZARD},
735 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_WIZARD},
736 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
737 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, 0},
738 {"alternate permissions", P_BOOL, P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL | FLAG_DEPRECATED},
739 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
740 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
741 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
742 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
743 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
744 {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, 0},
745 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_WIZARD},
746 #ifdef WITH_TDB_SAM
747 {"tdb passwd file", P_STRING, P_GLOBAL, &Globals.szTDBPasswdFile, NULL, NULL, 0},
748 #else
749 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
750 #endif
751 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
752 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
753 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
755 {"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, 0},
756 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
757 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
758 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
759 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
760 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
761 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
762 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
763 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0},
764 {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, 0},
765 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
767 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
768 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
769 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
771 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
772 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
773 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
774 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
775 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
776 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
777 {"printer admin", P_STRING, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_PRINT},
778 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
779 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
780 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
782 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE},
783 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
784 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
785 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
787 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
788 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
789 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
790 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
791 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
792 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
793 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
794 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
795 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
796 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
797 {"force unknown acl user", P_OCTAL, P_LOCAL, &sDefault.bForceUnknownAclUser, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
798 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
799 {"inherit acls", P_BOOL, P_LOCAL, &sDefault.bInheritACLS, NULL, NULL, FLAG_SHARE},
800 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
801 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
803 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
804 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
806 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
807 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
808 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
809 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
810 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
812 #ifdef WITH_SSL
813 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
814 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0},
816 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0},
817 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
818 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0},
819 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0},
820 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslServerCert, NULL, NULL, 0},
821 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslServerPrivKey, NULL, NULL, 0},
822 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0},
823 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0},
824 {"ssl egd socket", P_STRING, P_GLOBAL, &Globals.sslEgdSocket, NULL, NULL, 0},
825 {"ssl entropy file", P_STRING, P_GLOBAL, &Globals.sslEntropyFile, NULL, NULL, 0},
826 {"ssl entropy bytes", P_INTEGER, P_GLOBAL, &Globals.sslEntropyBytes, NULL, NULL, 0},
827 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0},
828 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0},
829 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0},
830 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
831 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0},
832 #endif /* WITH_SSL */
834 {"Logging Options", P_SEP, P_SEPARATOR},
836 {"admin log", P_BOOL, P_GLOBAL, &Globals.bAdminLog, NULL, NULL, 0},
837 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
838 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
839 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
840 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
841 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
843 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
844 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
845 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
846 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
847 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
848 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
850 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT | FLAG_DEPRECATED},
852 {"Protocol Options", P_SEP, P_SEPARATOR},
854 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
855 {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, 0},
856 {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
857 {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, 0},
858 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
859 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
860 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
862 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
863 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
864 {"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE },
865 {"nt status support", P_BOOL, P_GLOBAL, &Globals.bNTStatusSupport, NULL, NULL, 0 },
866 {"profile acls", P_BOOL, P_LOCAL, &sDefault.bProfileAcls, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE },
867 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
868 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
869 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
870 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
872 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
873 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
874 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
875 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
876 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
877 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
878 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
879 {"unix extensions", P_BOOL, P_GLOBAL, &Globals.bUnixExtensions, NULL, NULL, 0},
881 {"Tuning Options", P_SEP, P_SEPARATOR},
883 {"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
884 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
885 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
886 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
887 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
889 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
890 {"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, 0},
891 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
892 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
893 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
894 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
895 {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, 0},
896 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
898 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
899 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
900 {"strict allocate", P_BOOL, P_LOCAL, &sDefault.bStrictAllocate, NULL, NULL, FLAG_SHARE},
901 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
902 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
903 {"use mmap", P_BOOL, P_GLOBAL, &Globals.bUseMmap, NULL, NULL, 0},
904 #ifdef WITH_SENDFILE
905 {"use sendfile", P_BOOL, P_LOCAL, &sDefault.bUseSendfile, NULL, NULL, FLAG_SHARE},
906 #endif
907 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
909 {"Printing Options", P_SEP, P_SEPARATOR},
911 {"total print jobs", P_INTEGER, P_GLOBAL, &Globals.iTotalPrintJobs, NULL, NULL, FLAG_PRINT},
912 {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_PRINT},
913 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
914 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
915 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
916 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
917 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
918 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED},
919 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
920 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
921 {"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
922 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
923 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
924 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
925 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
926 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
927 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
929 {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, 0},
930 {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, 0},
931 {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, 0},
932 {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, 0},
933 {"os2 driver map", P_STRING, P_GLOBAL, &Globals.szOs2DriverMap, NULL, NULL, 0},
935 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT|FLAG_DOS_STRING},
936 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_DOS_STRING},
937 {"use client driver", P_BOOL, P_LOCAL, &sDefault.bUseClientDriver, NULL, NULL, FLAG_PRINT},
938 {"default devmode", P_BOOL, P_LOCAL, &sDefault.bDefaultDevmode, NULL, NULL, FLAG_PRINT},
939 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED},
940 {"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED},
941 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL | FLAG_DEPRECATED},
943 {"Filename Handling", P_SEP, P_SEPARATOR},
944 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, FLAG_DEPRECATED },
945 {"mangling method", P_STRING, P_GLOBAL, &Globals.szManglingMethod, NULL, NULL, 0},
947 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
948 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
949 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
950 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
951 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
952 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
953 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
954 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
955 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
956 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
957 {"hide unreadable", P_BOOL, P_LOCAL, &sDefault.bHideUnReadable, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
958 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
959 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
960 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
961 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
962 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
963 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
964 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
965 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
966 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
967 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
969 {"Domain Options", P_SEP, P_SEPARATOR},
971 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
972 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
973 #ifdef USING_GROUPNAME_MAP
975 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
976 #endif /* USING_GROUPNAME_MAP */
978 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
980 {"Logon Options", P_SEP, P_SEPARATOR},
982 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
983 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
984 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
985 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
986 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
987 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
988 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
990 {"Browse Options", P_SEP, P_SEPARATOR},
992 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
993 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, 0},
994 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
995 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
996 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
997 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
998 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
999 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
1000 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
1001 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
1002 {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL},
1004 {"WINS Options", P_SEP, P_SEPARATOR},
1005 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
1006 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
1008 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, handle_wins_server_list, NULL, FLAG_BASIC | FLAG_WIZARD},
1009 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_WIZARD},
1010 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
1012 {"Locking Options", P_SEP, P_SEPARATOR},
1014 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1015 {"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_SHARE | FLAG_GLOBAL},
1016 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
1017 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
1018 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1019 {"lock spin count", P_INTEGER, P_GLOBAL, &Globals.iLockSpinCount, NULL, NULL, FLAG_GLOBAL},
1020 {"lock spin time", P_INTEGER, P_GLOBAL, &Globals.iLockSpinTime, NULL, NULL, FLAG_GLOBAL},
1022 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1023 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1024 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
1025 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1026 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1027 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1028 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
1030 #ifdef WITH_LDAP_SAM
1031 {"Ldap Options", P_SEP, P_SEPARATOR},
1033 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
1034 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
1035 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
1036 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0},
1037 {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, 0},
1038 {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, 0},
1039 #endif /* WITH_LDAP_SAM */
1041 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
1042 {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, 0},
1043 {"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, 0},
1044 {"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, 0},
1046 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
1047 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
1048 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
1049 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
1050 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
1051 {"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, 0},
1052 #ifdef WITH_UTMP
1053 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
1054 {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
1055 {"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, 0},
1056 #endif
1058 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DOS_STRING},
1059 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DOS_STRING},
1060 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
1061 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
1062 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
1063 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
1064 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0},
1065 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
1066 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
1067 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
1068 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
1069 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
1071 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
1072 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
1073 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1074 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
1076 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
1077 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1078 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1079 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
1080 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1081 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
1082 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE | FLAG_DOS_STRING},
1083 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
1084 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
1085 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0},
1086 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1087 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1088 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
1089 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
1090 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
1091 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1092 {"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1093 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1094 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1096 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1097 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
1098 {"hide local users", P_BOOL, P_GLOBAL, &Globals.bHideLocalUsers, NULL,
1099 NULL, 0},
1101 {"VFS module options", P_SEP, P_SEPARATOR},
1103 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, FLAG_SHARE},
1104 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, FLAG_SHARE},
1106 #ifdef WITH_MSDFS
1107 {"MSDfs options", P_SEP, P_SEPARATOR},
1109 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
1110 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, 0},
1111 #endif
1113 {"Winbind options", P_SEP, P_SEPARATOR},
1115 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_uid, NULL, 0},
1116 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_gid, NULL, 0},
1117 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, 0},
1118 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, 0},
1119 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, 0},
1120 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
1121 {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, 0},
1122 {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, 0},
1123 {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, 0},
1125 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
1129 /***************************************************************************
1130 Initialise the sDefault parameter structure for the printer values.
1131 ***************************************************************************/
1132 static void init_printer_values(void)
1134 string_set(&sDefault.szPrinterDriver, "");
1135 string_set(&sDefault.szDriverFile, DRIVERFILE);
1137 /* choose defaults depending on the type of printing */
1138 switch (sDefault.iPrinting)
1140 case PRINT_BSD:
1141 case PRINT_AIX:
1142 case PRINT_LPRNT:
1143 case PRINT_LPROS2:
1144 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1145 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1146 string_set(&sDefault.szPrintcommand,
1147 "lpr -r -P%p %s");
1148 break;
1150 case PRINT_LPRNG:
1151 case PRINT_PLP:
1152 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1153 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1154 string_set(&sDefault.szPrintcommand,
1155 "lpr -r -P%p %s");
1156 string_set(&sDefault.szQueuepausecommand,
1157 "lpc stop %p");
1158 string_set(&sDefault.szQueueresumecommand,
1159 "lpc start %p");
1160 string_set(&sDefault.szLppausecommand,
1161 "lpc hold %p %j");
1162 string_set(&sDefault.szLpresumecommand,
1163 "lpc release %p %j");
1164 break;
1166 case PRINT_CUPS:
1167 #ifdef HAVE_CUPS
1168 string_set(&sDefault.szLpqcommand, "");
1169 string_set(&sDefault.szLprmcommand, "");
1170 string_set(&sDefault.szPrintcommand, "");
1171 string_set(&sDefault.szLppausecommand, "");
1172 string_set(&sDefault.szLpresumecommand, "");
1173 string_set(&sDefault.szQueuepausecommand, "");
1174 string_set(&sDefault.szQueueresumecommand, "");
1176 string_set(&Globals.szPrintcapname, "cups");
1177 #else
1178 string_set(&sDefault.szLpqcommand,
1179 "/usr/bin/lpstat -o %p");
1180 string_set(&sDefault.szLprmcommand,
1181 "/usr/bin/cancel %p-%j");
1182 string_set(&sDefault.szPrintcommand,
1183 "/usr/bin/lp -d %p %s; rm %s");
1184 string_set(&sDefault.szLppausecommand,
1185 "lp -i %p-%j -H hold");
1186 string_set(&sDefault.szLpresumecommand,
1187 "lp -i %p-%j -H resume");
1188 string_set(&sDefault.szQueuepausecommand,
1189 "/usr/bin/disable %p");
1190 string_set(&sDefault.szQueueresumecommand,
1191 "/usr/bin/enable %p");
1192 string_set(&Globals.szPrintcapname, "lpstat");
1193 #endif /* HAVE_CUPS */
1194 break;
1196 case PRINT_SYSV:
1197 case PRINT_HPUX:
1198 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1199 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1200 string_set(&sDefault.szPrintcommand,
1201 "lp -c -d%p %s; rm %s");
1202 string_set(&sDefault.szQueuepausecommand,
1203 "disable %p");
1204 string_set(&sDefault.szQueueresumecommand,
1205 "enable %p");
1206 #ifndef HPUX
1207 string_set(&sDefault.szLppausecommand,
1208 "lp -i %p-%j -H hold");
1209 string_set(&sDefault.szLpresumecommand,
1210 "lp -i %p-%j -H resume");
1211 #endif /* SYSV */
1212 break;
1214 case PRINT_QNX:
1215 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1216 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1217 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1218 break;
1220 case PRINT_SOFTQ:
1221 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1222 string_set(&sDefault.szLprmcommand,
1223 "qstat -s -j%j -c");
1224 string_set(&sDefault.szPrintcommand,
1225 "lp -d%p -s %s; rm %s");
1226 string_set(&sDefault.szLppausecommand,
1227 "qstat -s -j%j -h");
1228 string_set(&sDefault.szLpresumecommand,
1229 "qstat -s -j%j -r");
1230 break;
1231 #ifdef DEVELOPER
1232 case PRINT_TEST:
1233 case PRINT_VLP:
1234 string_set(&sDefault.szPrintcommand, "vlp print %p %s");
1235 string_set(&sDefault.szLpqcommand, "vlp lpq %p");
1236 string_set(&sDefault.szLprmcommand, "vlp lprm %p %j");
1237 string_set(&sDefault.szLppausecommand, "vlp lppause %p %j");
1238 string_set(&sDefault.szLpresumecommand, "vlp lpresum %p %j");
1239 string_set(&sDefault.szQueuepausecommand, "vlp queuepause %p");
1240 string_set(&sDefault.szQueueresumecommand, "vlp queueresume %p");
1241 break;
1242 #endif /* DEVELOPER */
1247 /***************************************************************************
1248 Initialise the global parameter structure.
1249 ***************************************************************************/
1250 static void init_globals(void)
1252 static BOOL done_init = False;
1253 pstring s;
1255 if (!done_init)
1257 int i;
1258 memset((void *)&Globals, '\0', sizeof(Globals));
1260 for (i = 0; parm_table[i].label; i++)
1261 if ((parm_table[i].type == P_STRING ||
1262 parm_table[i].type == P_USTRING) &&
1263 parm_table[i].ptr)
1264 string_set(parm_table[i].ptr, "");
1266 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
1267 string_set(&sDefault.fstype, FSTYPE_STRING);
1269 init_printer_values();
1271 done_init = True;
1275 DEBUG(3, ("Initialising global parameters\n"));
1277 #ifdef WITH_TDB_SAM
1278 string_set(&Globals.szTDBPasswdFile, TDB_PASSWD_FILE);
1279 #else
1280 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
1281 #endif
1283 /* use the old 'hash' method by default */
1284 string_set(&Globals.szManglingMethod, "hash");
1287 * Allow the default PASSWD_CHAT to be overridden in local.h.
1289 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1290 string_set(&Globals.szWorkGroup, WORKGROUP);
1291 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1292 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1293 string_set(&Globals.szLockDir, LOCKDIR);
1294 string_set(&Globals.szPidDir, PIDDIR);
1295 #ifdef WITH_UTMP
1296 string_set(&Globals.szUtmpDir, "");
1297 string_set(&Globals.szWtmpDir, "");
1298 Globals.bUtmp = False;
1299 #endif
1300 string_set(&Globals.szSocketAddress, "0.0.0.0");
1301 pstrcpy(s, "Samba ");
1302 pstrcat(s, VERSION);
1303 string_set(&Globals.szServerString, s);
1304 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1305 DEFAULT_MINOR_VERSION);
1306 string_set(&Globals.szAnnounceVersion, s);
1308 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1310 string_set(&Globals.szLogonDrive, "");
1311 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1312 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1313 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1315 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1316 string_set(&Globals.szCodePageDir, CODEPAGEDIR);
1318 Globals.bLoadPrinters = True;
1319 Globals.bUseRhosts = False;
1320 Globals.max_packet = 65535;
1321 Globals.mangled_stack = 50;
1322 Globals.max_xmit = 65535;
1323 Globals.max_mux = 50; /* This is *needed* for profile support. */
1324 Globals.lpqcachetime = 10;
1325 Globals.bDisableSpoolss = False;
1326 Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1327 Globals.iTotalPrintJobs = 0; /* no limit specified */
1328 Globals.pwordlevel = 0;
1329 Globals.unamelevel = 0;
1330 Globals.deadtime = 0;
1331 Globals.bLargeReadwrite = False;
1332 Globals.max_log_size = 5000;
1333 Globals.max_open_files = MAX_OPEN_FILES;
1334 Globals.maxprotocol = PROTOCOL_NT1;
1335 Globals.minprotocol = PROTOCOL_CORE;
1336 Globals.security = SEC_USER;
1337 Globals.bEncryptPasswords = False;
1338 Globals.bUpdateEncrypt = False;
1339 Globals.bReadRaw = True;
1340 Globals.bWriteRaw = True;
1341 Globals.bReadPrediction = False;
1342 Globals.bReadbmpx = False;
1343 Globals.bNullPasswords = False;
1344 Globals.bObeyPamRestrictions = False;
1345 Globals.bStripDot = False;
1346 Globals.syslog = 1;
1347 Globals.bSyslogOnly = False;
1348 Globals.bAdminLog = False;
1349 Globals.bTimestampLogs = True;
1350 Globals.bDebugHiresTimestamp = False;
1351 Globals.bDebugPid = False;
1352 Globals.bDebugUid = False;
1353 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1354 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1355 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1356 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1357 Globals.change_notify_timeout = 60; /* 1 minute default. */
1358 Globals.ReadSize = 16 * 1024;
1359 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1360 Globals.lm_interval = 60;
1361 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1362 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1363 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1364 Globals.bNISHomeMap = False;
1365 #ifdef WITH_NISPLUS_HOME
1366 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1367 #else
1368 string_set(&Globals.szNISHomeMapName, "auto.home");
1369 #endif
1370 #endif
1371 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1372 Globals.bTimeServer = False;
1373 Globals.bBindInterfacesOnly = False;
1374 Globals.bUnixPasswdSync = False;
1375 Globals.bPamPasswordChange = False;
1376 Globals.bPasswdChatDebug = False;
1377 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
1378 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1379 Globals.bStatCache = True; /* use stat cache by default */
1380 Globals.bNTStatusSupport = True; /* Use NT status by default. */
1381 Globals.bRestrictAnonymous = False;
1382 Globals.bLanmanAuth = True; /* Do use the LanMan hash if it is available */
1383 Globals.map_to_guest = 0; /* By Default, "Never" */
1384 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1385 Globals.oplock_break_wait_time = 0; /* By Default, 0 msecs. */
1386 Globals.enhanced_browsing = True;
1387 Globals.iLockSpinCount = 3; /* Try 2 times. */
1388 Globals.iLockSpinTime = 10; /* usec. */
1389 #ifdef MMAP_BLACKLIST
1390 Globals.bUseMmap = False;
1391 #else
1392 Globals.bUseMmap = True;
1393 #endif
1394 Globals.bUnixExtensions = False;
1396 #ifdef WITH_SSL
1397 Globals.sslVersion = SMB_SSL_V23;
1398 string_set(&Globals.sslHostsRequire, "");
1399 string_set(&Globals.sslHostsResign, "");
1400 string_set(&Globals.sslCaCertDir, "");
1401 string_set(&Globals.sslCaCertFile, "");
1402 string_set(&Globals.sslServerCert, "");
1403 string_set(&Globals.sslServerPrivKey, "");
1404 string_set(&Globals.sslClientCert, "");
1405 string_set(&Globals.sslClientPrivKey, "");
1406 string_set(&Globals.sslCiphers, "");
1407 string_set(&Globals.sslEgdSocket, "");
1408 string_set(&Globals.sslEntropyFile, "");
1409 Globals.sslEntropyBytes = 256;
1410 Globals.sslEnabled = False;
1411 Globals.sslReqClientCert = False;
1412 Globals.sslReqServerCert = False;
1413 Globals.sslCompatibility = False;
1414 #endif /* WITH_SSL */
1416 #ifdef WITH_LDAP_SAM
1417 string_set(&Globals.szLdapServer, "localhost");
1418 string_set(&Globals.szLdapSuffix, "");
1419 string_set(&Globals.szLdapFilter, "(&(uid=%u)(objectclass=sambaAccount))");
1420 string_set(&Globals.szLdapAdminDn, "");
1421 Globals.ldap_port = 636;
1422 Globals.ldap_ssl = LDAP_SSL_ON;
1423 #endif /* WITH_LDAP_SAM */
1424 /* these parameters are set to defaults that are more appropriate
1425 for the increasing samba install base:
1427 as a member of the workgroup, that will possibly become a
1428 _local_ master browser (lm = True). this is opposed to a forced
1429 local master browser startup (pm = True).
1431 doesn't provide WINS server service by default (wsupp = False),
1432 and doesn't provide domain master browser services by default, either.
1436 Globals.bMsAddPrinterWizard = True;
1437 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1438 Globals.os_level = 20;
1439 Globals.bLocalMaster = True;
1440 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1441 Globals.bDomainLogons = False;
1442 Globals.bBrowseList = True;
1443 Globals.bWINSsupport = False;
1444 Globals.bWINSproxy = False;
1446 Globals.bDNSproxy = True;
1448 /* this just means to use them if they exist */
1449 Globals.bKernelOplocks = True;
1451 Globals.bAllowTrustedDomains = True;
1453 string_set(&Globals.szTemplateShell, "/bin/false");
1454 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1455 string_set(&Globals.szWinbindSeparator, "\\");
1456 Globals.winbind_cache_time = 15;
1458 Globals.bWinbindEnumUsers = True;
1459 Globals.bWinbindEnumGroups = True;
1460 Globals.bWinbindUseDefaultDomain = False;
1462 Globals.bHostMSDfs = False;
1464 Globals.name_cache_timeout = 660; /* In seconds */
1467 * This must be done last as it checks the value in
1468 * client_code_page.
1471 interpret_coding_system(KANJI);
1474 static TALLOC_CTX *lp_talloc;
1476 /******************************************************************* a
1477 free up temporary memory - called from the main loop
1478 ********************************************************************/
1479 void lp_talloc_free(void)
1481 if (!lp_talloc)
1482 return;
1483 talloc_destroy(lp_talloc);
1484 lp_talloc = NULL;
1487 /*******************************************************************
1488 convenience routine to grab string parameters into temporary memory
1489 and run standard_sub_basic on them. The buffers can be written to by
1490 callers without affecting the source string.
1491 ********************************************************************/
1492 static char *lp_string(const char *s)
1494 size_t len = s ? strlen(s) : 0;
1495 char *ret;
1497 if (!lp_talloc)
1498 lp_talloc = talloc_init();
1500 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1502 if (!ret)
1503 return NULL;
1505 if (!s)
1506 *ret = 0;
1507 else
1508 StrnCpy(ret, s, len);
1510 trim_string(ret, "\"", "\"");
1512 standard_sub_basic(ret, len + 100);
1513 return (ret);
1518 In this section all the functions that are used to access the
1519 parameters from the rest of the program are defined
1522 #define FN_GLOBAL_STRING(fn_name,ptr) \
1523 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1524 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1525 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1526 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1527 char fn_name(void) {return(*(char *)(ptr));}
1528 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1529 int fn_name(void) {return(*(int *)(ptr));}
1531 #define FN_LOCAL_STRING(fn_name,val) \
1532 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1533 #define FN_LOCAL_CONST_STRING(fn_name,val) \
1534 const char *fn_name(int i) {return(const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1535 #define FN_LOCAL_BOOL(fn_name,val) \
1536 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1537 #define FN_LOCAL_CHAR(fn_name,val) \
1538 char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1539 #define FN_LOCAL_INTEGER(fn_name,val) \
1540 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1542 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1543 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1544 #ifdef WITH_TDB_SAM
1545 FN_GLOBAL_STRING(lp_tdb_passwd_file, &Globals.szTDBPasswdFile)
1546 #else
1547 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1548 #endif
1549 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1550 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1551 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1552 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1553 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1554 FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
1555 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1556 FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
1557 #ifdef WITH_UTMP
1558 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1559 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1560 FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
1561 #endif
1562 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1563 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1564 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1565 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1566 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1567 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1568 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1569 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1570 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1571 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1572 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1573 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1574 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1575 #ifdef USING_GROUPNAME_MAP
1576 FN_GLOBAL_STRING(lp_groupname_map, &Globals.szGroupnameMap)
1577 #endif /* USING_GROUPNAME_MAP */
1578 FN_GLOBAL_STRING(lp_logon_script, &Globals.szLogonScript)
1579 FN_GLOBAL_STRING(lp_logon_path, &Globals.szLogonPath)
1580 FN_GLOBAL_STRING(lp_logon_drive, &Globals.szLogonDrive)
1581 FN_GLOBAL_STRING(lp_logon_home, &Globals.szLogonHome)
1582 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1583 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1584 FN_GLOBAL_STRING(lp_wins_server, &Globals.szWINSserver)
1585 FN_GLOBAL_STRING(lp_interfaces, &Globals.szInterfaces)
1586 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1587 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1588 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1589 FN_GLOBAL_STRING(lp_netbios_aliases, &Globals.szNetbiosAliases)
1590 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1591 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1592 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1593 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1594 FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
1595 FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
1596 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1597 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1598 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1599 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1600 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1601 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
1602 FN_GLOBAL_STRING(lp_codepagedir,&Globals.szCodePageDir)
1603 #ifdef WITH_LDAP_SAM
1604 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer)
1605 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1606 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter)
1607 FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
1608 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1609 FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
1610 #endif /* WITH_LDAP_SAM */
1611 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
1612 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
1613 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
1614 FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
1616 #ifdef WITH_SSL
1617 FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion)
1618 FN_GLOBAL_STRING(lp_ssl_hosts, &Globals.sslHostsRequire)
1619 FN_GLOBAL_STRING(lp_ssl_hosts_resign, &Globals.sslHostsResign)
1620 FN_GLOBAL_STRING(lp_ssl_cacertdir, &Globals.sslCaCertDir)
1621 FN_GLOBAL_STRING(lp_ssl_cacertfile, &Globals.sslCaCertFile)
1622 FN_GLOBAL_STRING(lp_ssl_server_cert, &Globals.sslServerCert)
1623 FN_GLOBAL_STRING(lp_ssl_server_privkey, &Globals.sslServerPrivKey)
1624 FN_GLOBAL_STRING(lp_ssl_client_cert, &Globals.sslClientCert)
1625 FN_GLOBAL_STRING(lp_ssl_client_privkey, &Globals.sslClientPrivKey)
1626 FN_GLOBAL_STRING(lp_ssl_ciphers, &Globals.sslCiphers)
1627 FN_GLOBAL_STRING(lp_ssl_egdsocket, &Globals.sslEgdSocket)
1628 FN_GLOBAL_STRING(lp_ssl_entropyfile, &Globals.sslEntropyFile)
1629 FN_GLOBAL_INTEGER(lp_ssl_entropybytes, &Globals.sslEntropyBytes)
1630 FN_GLOBAL_BOOL(lp_ssl_enabled, &Globals.sslEnabled)
1631 FN_GLOBAL_BOOL(lp_ssl_reqClientCert, &Globals.sslReqClientCert)
1632 FN_GLOBAL_BOOL(lp_ssl_reqServerCert, &Globals.sslReqServerCert)
1633 FN_GLOBAL_BOOL(lp_ssl_compatibility, &Globals.sslCompatibility)
1634 #endif /* WITH_SSL */
1636 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1637 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1638 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1639 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1640 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1641 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1642 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1643 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1644 FN_GLOBAL_BOOL(lp_use_rhosts, &Globals.bUseRhosts)
1645 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1646 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1647 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1648 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1649 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1650 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1651 FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
1652 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1653 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1654 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1655 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1656 FN_GLOBAL_BOOL(lp_admin_log, &Globals.bAdminLog)
1657 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1658 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1659 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1660 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1661 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1662 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1663 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1664 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1665 FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
1666 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1667 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1668 FN_GLOBAL_BOOL(lp_nt_smb_support, &Globals.bNTSmbSupport)
1669 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1670 FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
1671 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1672 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1673 FN_GLOBAL_BOOL(lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1674 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1675 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1676 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1677 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1678 FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
1679 FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
1680 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1681 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1682 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1683 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1684 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1685 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1686 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1687 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1688 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1689 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1690 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1691 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1692 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1693 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1694 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1695 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1696 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1697 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
1698 FN_GLOBAL_INTEGER(lp_disable_spoolss, &Globals.bDisableSpoolss)
1699 FN_GLOBAL_INTEGER(lp_totalprintjobs, &Globals.iTotalPrintJobs)
1700 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1701 FN_GLOBAL_INTEGER(lp_client_code_page, &Globals.client_code_page)
1702 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1703 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1704 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1705 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1706 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1707 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1708 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1709 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1710 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1711 FN_GLOBAL_INTEGER(lp_lock_spin_count, &Globals.iLockSpinCount)
1712 FN_GLOBAL_INTEGER(lp_lock_sleep_time, &Globals.iLockSpinTime)
1713 FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
1714 FN_LOCAL_STRING(lp_preexec, szPreExec)
1715 FN_LOCAL_STRING(lp_postexec, szPostExec)
1716 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1717 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1718 FN_LOCAL_STRING(lp_servicename, szService)
1719 FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
1720 FN_LOCAL_STRING(lp_pathname, szPath)
1721 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1722 FN_LOCAL_STRING(lp_username, szUsername)
1723 FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
1724 FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
1725 FN_LOCAL_STRING(lp_valid_users, szValidUsers)
1726 FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
1727 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1728 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1729 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1730 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1731 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1732 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1733 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1734 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1735 FN_LOCAL_STRING(lp_driverfile, szDriverFile)
1736 FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)
1737 FN_LOCAL_STRING(lp_hostsallow, szHostsallow)
1738 FN_LOCAL_STRING(lp_hostsdeny, szHostsdeny)
1739 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1740 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1741 FN_LOCAL_STRING(lp_comment, comment)
1742 FN_LOCAL_STRING(lp_force_user, force_user)
1743 FN_LOCAL_STRING(lp_force_group, force_group)
1744 FN_LOCAL_STRING(lp_readlist, readlist)
1745 FN_LOCAL_STRING(lp_writelist, writelist)
1746 FN_LOCAL_STRING(lp_printer_admin, printer_admin)
1747 FN_LOCAL_STRING(lp_fstype, fstype)
1748 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1749 FN_LOCAL_STRING(lp_vfs_options, szVfsOptions)
1750 static FN_LOCAL_STRING(lp_volume, volume)
1751 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1752 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1753 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1754 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1755 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
1756 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1757 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1758 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1759 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1760 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1761 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1762 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1763 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1764 FN_LOCAL_BOOL(lp_status, status)
1765 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1766 FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
1767 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1768 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1769 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1770 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1771 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1772 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1773 FN_LOCAL_BOOL(lp_postscript, bPostscript)
1774 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1775 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1776 FN_LOCAL_BOOL(lp_locking, bLocking)
1777 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1778 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1779 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1780 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1781 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1782 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1783 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1784 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1785 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1786 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1787 FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
1788 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1789 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1790 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1791 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1792 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1793 FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
1794 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1795 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1796 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1797 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1798 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1799 FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
1800 FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
1801 FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
1802 FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
1803 FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
1804 #ifdef WITH_SENDFILE
1805 FN_LOCAL_BOOL(lp_use_sendfile, bUseSendfile)
1806 #endif
1807 FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
1808 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1809 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1810 FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
1811 FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
1812 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1813 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1814 FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
1815 FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
1816 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1817 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1818 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1819 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1820 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1821 FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
1822 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1823 FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
1824 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1825 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1826 FN_GLOBAL_BOOL(lp_hide_local_users, &Globals.bHideLocalUsers)
1828 /* local prototypes */
1830 static int map_parameter(char *pszParmName);
1831 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1832 static int getservicebyname(char *pszServiceName,
1833 service * pserviceDest);
1834 static void copy_service(service * pserviceDest,
1835 service * pserviceSource, BOOL *pcopymapDest);
1836 static BOOL service_ok(int iService);
1837 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1838 static BOOL do_section(char *pszSectionName);
1839 static void init_copymap(service * pservice);
1842 /***************************************************************************
1843 initialise a service to the defaults
1844 ***************************************************************************/
1845 static void init_service(service * pservice)
1847 memset((char *)pservice, '\0', sizeof(service));
1848 copy_service(pservice, &sDefault, NULL);
1852 /***************************************************************************
1853 free the dynamically allocated parts of a service struct
1854 ***************************************************************************/
1855 static void free_service(service * pservice)
1857 int i;
1858 if (!pservice)
1859 return;
1861 if (pservice->szService)
1862 DEBUG(5,
1863 ("free_service: Freeing service %s\n",
1864 pservice->szService));
1866 string_free(&pservice->szService);
1867 SAFE_FREE(pservice->copymap);
1869 for (i = 0; parm_table[i].label; i++)
1870 if ((parm_table[i].type == P_STRING ||
1871 parm_table[i].type == P_USTRING) &&
1872 parm_table[i].class == P_LOCAL)
1873 string_free((char **)
1874 (((char *)pservice) +
1875 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1877 ZERO_STRUCTP(pservice);
1880 /***************************************************************************
1881 add a new service to the services array initialising it with the given
1882 service. name must be in DOS codepage.
1883 ***************************************************************************/
1884 static int add_a_service(service * pservice, char *name)
1886 int i;
1887 service tservice;
1888 int num_to_alloc = iNumServices + 1;
1890 tservice = *pservice;
1892 /* it might already exist */
1894 if (name)
1896 i = getservicebyname(name, NULL);
1897 if (i >= 0)
1898 return (i);
1901 /* find an invalid one */
1902 for (i = 0; i < iNumServices; i++)
1903 if (!ServicePtrs[i]->valid)
1904 break;
1906 /* if not, then create one */
1907 if (i == iNumServices)
1909 service **tsp;
1911 #ifdef __INSURE__
1912 service **oldservices = iNumServices ? malloc(sizeof(service *) * iNumServices) : NULL;
1914 if (iNumServices)
1915 memcpy(oldservices, ServicePtrs, sizeof(service *) * iNumServices);
1916 #endif
1918 tsp = (service **) Realloc(ServicePtrs,
1919 sizeof(service *) *
1920 num_to_alloc);
1922 if (!tsp) {
1923 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
1924 return (-1);
1925 } else {
1926 ServicePtrs = tsp;
1927 ServicePtrs[iNumServices] =
1928 (service *) malloc(sizeof(service));
1931 #ifdef __INSURE__
1932 if (iNumServices && (memcmp(oldservices, ServicePtrs, sizeof(service *) * iNumServices) != 0)) {
1933 smb_panic("add_a_service: Realloc corrupted ptrs...\n");
1935 safe_free(oldservices);
1936 #endif
1938 if (!ServicePtrs[iNumServices])
1939 return (-1);
1941 iNumServices++;
1943 else
1944 free_service(ServicePtrs[i]);
1946 ServicePtrs[i]->valid = True;
1948 init_service(ServicePtrs[i]);
1949 copy_service(ServicePtrs[i], &tservice, NULL);
1950 if (name)
1952 string_set(&ServicePtrs[i]->szService, name);
1954 return (i);
1957 /***************************************************************************
1958 add a new home service, with the specified home directory, defaults coming
1959 from service ifrom. homename must be in DOS codepage.
1960 ***************************************************************************/
1961 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1963 int i;
1964 SMB_STRUCT_STAT buf;
1966 /* if the user's home directory doesn't exist, then don't
1967 add it to the list of available shares */
1968 if (sys_stat(pszHomedir, &buf))
1969 return False;
1971 i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
1973 if (i < 0)
1974 return (False);
1976 if (!(*(ServicePtrs[i]->szPath))
1977 || strequal(ServicePtrs[i]->szPath, lp_pathname(-1)))
1978 string_set(&ServicePtrs[i]->szPath, pszHomedir);
1979 if (!(*(ServicePtrs[i]->comment)))
1981 pstring comment;
1982 slprintf(comment, sizeof(comment) - 1,
1983 "Home directory of %s", pszHomename);
1984 string_set(&ServicePtrs[i]->comment, comment);
1986 ServicePtrs[i]->bAvailable = sDefault.bAvailable;
1987 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1989 DEBUG(3,
1990 ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1992 return (True);
1995 /***************************************************************************
1996 add a new service, based on an old one. pszService must be in DOS codepage.
1997 ***************************************************************************/
1998 int lp_add_service(char *pszService, int iDefaultService)
2000 return (add_a_service(ServicePtrs[iDefaultService], pszService));
2004 /***************************************************************************
2005 add the IPC service
2006 ***************************************************************************/
2007 static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok)
2009 pstring comment;
2010 int i = add_a_service(&sDefault, ipc_name);
2012 if (i < 0)
2013 return (False);
2015 slprintf(comment, sizeof(comment) - 1,
2016 "IPC Service (%s)", Globals.szServerString);
2018 string_set(&ServicePtrs[i]->szPath, tmpdir());
2019 string_set(&ServicePtrs[i]->szUsername, "");
2020 string_set(&ServicePtrs[i]->comment, comment);
2021 string_set(&ServicePtrs[i]->fstype, "IPC");
2022 ServicePtrs[i]->status = False;
2023 ServicePtrs[i]->iMaxConnections = 0;
2024 ServicePtrs[i]->bAvailable = True;
2025 ServicePtrs[i]->bRead_only = True;
2026 ServicePtrs[i]->bGuest_only = False;
2027 ServicePtrs[i]->bGuest_ok = guest_ok;
2028 ServicePtrs[i]->bPrint_ok = False;
2029 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2031 DEBUG(3, ("adding IPC service %s\n", ipc_name));
2033 return (True);
2037 /***************************************************************************
2038 add a new printer service, with defaults coming from service iFrom.
2039 printername must be in DOS codepage.
2040 ***************************************************************************/
2041 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
2043 char *comment = "From Printcap";
2044 int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
2046 if (i < 0)
2047 return (False);
2049 /* note that we do NOT default the availability flag to True - */
2050 /* we take it from the default service passed. This allows all */
2051 /* dynamic printers to be disabled by disabling the [printers] */
2052 /* entry (if/when the 'available' keyword is implemented!). */
2054 /* the printer name is set to the service name. */
2055 string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
2056 string_set(&ServicePtrs[i]->comment, comment);
2057 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2058 /* Printers cannot be read_only. */
2059 ServicePtrs[i]->bRead_only = False;
2060 /* No oplocks on printer services. */
2061 ServicePtrs[i]->bOpLocks = False;
2062 /* Printer services must be printable. */
2063 ServicePtrs[i]->bPrint_ok = True;
2065 DEBUG(3, ("adding printer service %s\n", pszPrintername));
2067 return (True);
2070 /***************************************************************************
2071 Map a parameter's string representation to something we can use.
2072 Returns False if the parameter string is not recognised, else TRUE.
2073 ***************************************************************************/
2074 static int map_parameter(char *pszParmName)
2076 int iIndex;
2078 if (*pszParmName == '-')
2079 return (-1);
2081 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
2082 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
2083 return (iIndex);
2085 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
2086 return (-1);
2090 /***************************************************************************
2091 Set a boolean variable from the text value stored in the passed string.
2092 Returns True in success, False if the passed string does not correctly
2093 represent a boolean.
2094 ***************************************************************************/
2095 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
2097 BOOL bRetval;
2099 bRetval = True;
2100 if (strwicmp(pszParmValue, "yes") == 0 ||
2101 strwicmp(pszParmValue, "true") == 0 ||
2102 strwicmp(pszParmValue, "1") == 0)
2103 *pb = True;
2104 else
2105 if (strwicmp(pszParmValue, "no") == 0 ||
2106 strwicmp(pszParmValue, "False") == 0 ||
2107 strwicmp(pszParmValue, "0") == 0)
2108 *pb = False;
2109 else
2111 DEBUG(0,
2112 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
2113 pszParmValue));
2114 bRetval = False;
2116 return (bRetval);
2119 /***************************************************************************
2120 Find a service by name. Otherwise works like get_service.
2121 ***************************************************************************/
2122 static int getservicebyname(char *pszServiceName, service * pserviceDest)
2124 int iService;
2126 for (iService = iNumServices - 1; iService >= 0; iService--)
2127 if (VALID(iService) &&
2128 strwicmp(ServicePtrs[iService]->szService, pszServiceName) == 0)
2130 if (pserviceDest != NULL)
2131 copy_service(pserviceDest, ServicePtrs[iService], NULL);
2132 break;
2135 return (iService);
2140 /***************************************************************************
2141 Copy a service structure to another
2143 If pcopymapDest is NULL then copy all fields
2144 ***************************************************************************/
2145 static void copy_service(service * pserviceDest,
2146 service * pserviceSource, BOOL *pcopymapDest)
2148 int i;
2149 BOOL bcopyall = (pcopymapDest == NULL);
2151 for (i = 0; parm_table[i].label; i++)
2152 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
2153 (bcopyall || pcopymapDest[i]))
2155 void *def_ptr = parm_table[i].ptr;
2156 void *src_ptr =
2157 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
2158 &sDefault);
2159 void *dest_ptr =
2160 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
2161 &sDefault);
2163 switch (parm_table[i].type)
2165 case P_BOOL:
2166 case P_BOOLREV:
2167 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
2168 break;
2170 case P_INTEGER:
2171 case P_ENUM:
2172 case P_OCTAL:
2173 *(int *)dest_ptr = *(int *)src_ptr;
2174 break;
2176 case P_CHAR:
2177 *(char *)dest_ptr = *(char *)src_ptr;
2178 break;
2180 case P_STRING:
2181 string_set(dest_ptr,
2182 *(char **)src_ptr);
2183 break;
2185 case P_USTRING:
2186 string_set(dest_ptr,
2187 *(char **)src_ptr);
2188 strupper(*(char **)dest_ptr);
2189 break;
2190 default:
2191 break;
2195 if (bcopyall)
2197 init_copymap(pserviceDest);
2198 if (pserviceSource->copymap)
2199 memcpy((void *)pserviceDest->copymap,
2200 (void *)pserviceSource->copymap,
2201 sizeof(BOOL) * NUMPARAMETERS);
2205 /***************************************************************************
2206 Check a service for consistency. Return False if the service is in any way
2207 incomplete or faulty, else True.
2208 ***************************************************************************/
2209 static BOOL service_ok(int iService)
2211 BOOL bRetval;
2213 bRetval = True;
2214 if (ServicePtrs[iService]->szService[0] == '\0')
2216 DEBUG(0,
2217 ("The following message indicates an internal error:\n"));
2218 DEBUG(0, ("No service name in service entry.\n"));
2219 bRetval = False;
2222 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2223 /* I can't see why you'd want a non-printable printer service... */
2224 if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
2225 if (!ServicePtrs[iService]->bPrint_ok) {
2226 DEBUG(0,
2227 ("WARNING: [%s] service MUST be printable!\n",
2228 ServicePtrs[iService]->szService));
2229 ServicePtrs[iService]->bPrint_ok = True;
2231 /* [printers] service must also be non-browsable. */
2232 if (ServicePtrs[iService]->bBrowseable)
2233 ServicePtrs[iService]->bBrowseable = False;
2236 if (ServicePtrs[iService]->szPath[0] == '\0' &&
2237 strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0)
2239 DEBUG(0,
2240 ("No path in service %s - using %s\n",
2241 ServicePtrs[iService]->szService, tmpdir()));
2242 string_set(&ServicePtrs[iService]->szPath, tmpdir());
2245 /* If a service is flagged unavailable, log the fact at level 0. */
2246 if (!ServicePtrs[iService]->bAvailable)
2247 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2248 ServicePtrs[iService]->szService));
2250 return (bRetval);
2253 static struct file_lists
2255 struct file_lists *next;
2256 char *name;
2257 char *subfname;
2258 time_t modtime;
2259 } *file_lists = NULL;
2261 /*******************************************************************
2262 keep a linked list of all config files so we know when one has changed
2263 it's date and needs to be reloaded
2264 ********************************************************************/
2265 static void add_to_file_list(char *fname, char *subfname)
2267 struct file_lists *f = file_lists;
2269 while (f) {
2270 if (f->name && !strcmp(f->name, fname))
2271 break;
2272 f = f->next;
2275 if (!f) {
2276 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2277 if (!f)
2278 return;
2279 f->next = file_lists;
2280 f->name = strdup(fname);
2281 if (!f->name) {
2282 SAFE_FREE(f);
2283 return;
2285 f->subfname = strdup(subfname);
2286 if (!f->subfname) {
2287 SAFE_FREE(f);
2288 return;
2290 file_lists = f;
2291 f->modtime = file_modtime(subfname);
2292 } else {
2293 time_t t = file_modtime(subfname);
2294 if (t)
2295 f->modtime = t;
2299 /*******************************************************************
2300 check if a config file has changed date
2301 ********************************************************************/
2302 BOOL lp_file_list_changed(void)
2304 struct file_lists *f = file_lists;
2305 DEBUG(6, ("lp_file_list_changed()\n"));
2307 while (f) {
2308 pstring n2;
2309 time_t mod_time;
2311 pstrcpy(n2, f->name);
2312 standard_sub_basic(n2,sizeof(n2));
2314 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2315 f->name, n2, ctime(&f->modtime)));
2317 mod_time = file_modtime(n2);
2319 if (mod_time && ((f->modtime != mod_time) || (f->subfname == NULL) || (strcmp(n2, f->subfname) != 0))) {
2320 DEBUGADD(6, ("file %s modified: %s\n", n2, ctime(&mod_time)));
2321 f->modtime = mod_time;
2322 SAFE_FREE(f->subfname);
2323 f->subfname = strdup(n2);
2324 return (True);
2326 f = f->next;
2328 return (False);
2331 /***************************************************************************
2332 Run standard_sub_basic on netbios name... needed because global_myname
2333 is not accessed through any lp_ macro.
2334 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2335 ***************************************************************************/
2337 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2339 pstring netbios_name;
2341 pstrcpy(netbios_name, pszParmValue);
2343 standard_sub_basic(netbios_name,sizeof(netbios_name));
2344 strupper(netbios_name);
2347 * Convert from UNIX to DOS string - the UNIX to DOS converter
2348 * isn't called on the special handlers.
2350 unix_to_dos(netbios_name);
2351 pstrcpy(global_myname, netbios_name);
2353 DEBUG(4,
2354 ("handle_netbios_name: set global_myname to: %s\n",
2355 global_myname));
2357 return (True);
2360 /***************************************************************************
2361 Do the work of sourcing in environment variable/value pairs.
2362 ***************************************************************************/
2364 static BOOL source_env(char **lines)
2366 char *varval;
2367 size_t len;
2368 int i;
2369 char *p;
2371 for (i = 0; lines[i]; i++)
2373 char *line = lines[i];
2375 if ((len = strlen(line)) == 0)
2376 continue;
2378 if (line[len - 1] == '\n')
2379 line[--len] = '\0';
2381 if ((varval = malloc(len + 1)) == NULL)
2383 DEBUG(0, ("source_env: Not enough memory!\n"));
2384 return (False);
2387 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2388 strncpy(varval, line, len);
2389 varval[len] = '\0';
2391 p = strchr(line, (int)'=');
2392 if (p == NULL)
2394 DEBUG(4, ("source_env: missing '=': %s\n", line));
2395 continue;
2398 if (putenv(varval))
2400 DEBUG(0,
2401 ("source_env: Failed to put environment variable %s\n",
2402 varval));
2403 continue;
2406 *p = '\0';
2407 p++;
2408 DEBUG(4,
2409 ("source_env: getting var %s = %s\n", line,
2410 getenv(line)));
2413 DEBUG(4, ("source_env: returning successfully\n"));
2414 return (True);
2417 /***************************************************************************
2418 Handle the source environment operation
2419 ***************************************************************************/
2421 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2423 pstring fname;
2424 char *p = fname;
2425 BOOL result;
2426 char **lines;
2428 pstrcpy(fname, pszParmValue);
2430 standard_sub_basic(fname,sizeof(fname));
2432 string_set(ptr, pszParmValue);
2434 DEBUG(4, ("handle_source_env: checking env type\n"));
2437 * Filename starting with '|' means popen and read from stdin.
2440 if (*p == '|')
2442 lines = file_lines_pload(p + 1, NULL, True);
2444 else
2446 lines = file_lines_load(fname, NULL, True);
2449 if (!lines)
2451 DEBUG(0,
2452 ("handle_source_env: Failed to open file %s, Error was %s\n",
2453 fname, strerror(errno)));
2454 return (False);
2457 result = source_env(lines);
2458 file_lines_free(lines);
2460 return (result);
2463 /***************************************************************************
2464 handle the interpretation of the vfs object parameter
2465 *************************************************************************/
2466 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2468 /* Set string value */
2470 string_set(ptr, pszParmValue);
2472 /* Do any other initialisation required for vfs. Note that
2473 anything done here may have linking repercussions in nmbd. */
2475 return True;
2478 /***************************************************************************
2479 handle the interpretation of the coding system parameter
2480 *************************************************************************/
2481 static BOOL handle_coding_system(char *pszParmValue, char **ptr)
2483 string_set(ptr, pszParmValue);
2484 interpret_coding_system(pszParmValue);
2485 return (True);
2488 /***************************************************************************
2489 Handle the interpretation of the character set system parameter.
2490 ***************************************************************************/
2492 static char *saved_character_set = NULL;
2494 static BOOL handle_character_set(char *pszParmValue, char **ptr)
2496 /* A dependency here is that the parameter client code page should be
2497 set before this is called.
2499 string_set(ptr, pszParmValue);
2500 strupper(*ptr);
2501 saved_character_set = strdup(*ptr);
2502 interpret_character_set(*ptr, lp_client_code_page());
2503 return (True);
2506 /***************************************************************************
2507 Handle the interpretation of the client code page parameter.
2508 We handle this separately so that we can reset the character set
2509 parameter in case this came before 'client code page' in the smb.conf.
2510 ***************************************************************************/
2512 static BOOL handle_client_code_page(char *pszParmValue, char **ptr)
2514 Globals.client_code_page = atoi(pszParmValue);
2515 if (saved_character_set != NULL)
2516 interpret_character_set(saved_character_set,
2517 lp_client_code_page());
2518 codepage_initialise(lp_client_code_page());
2519 return (True);
2522 /***************************************************************************
2523 handle the valid chars lines
2524 ***************************************************************************/
2526 static BOOL handle_valid_chars(char *pszParmValue, char **ptr)
2528 string_set(ptr, pszParmValue);
2530 /* A dependency here is that the parameter client code page must be
2531 set before this is called - as calling codepage_initialise()
2532 would overwrite the valid char lines.
2534 codepage_initialise(lp_client_code_page());
2536 add_char_string(pszParmValue);
2537 return (True);
2540 /***************************************************************************
2541 handle the include operation
2542 ***************************************************************************/
2544 static BOOL handle_include(char *pszParmValue, char **ptr)
2546 pstring fname;
2547 pstrcpy(fname, pszParmValue);
2549 standard_sub_basic(fname,sizeof(fname));
2551 add_to_file_list(pszParmValue, fname);
2553 string_set(ptr, fname);
2555 if (file_exist(fname, NULL))
2556 return (pm_process(fname, do_section, do_parameter));
2558 DEBUG(2, ("Can't find include file %s\n", fname));
2560 return (False);
2564 /***************************************************************************
2565 handle the interpretation of the copy parameter
2566 ***************************************************************************/
2567 static BOOL handle_copy(char *pszParmValue, char **ptr)
2569 BOOL bRetval;
2570 int iTemp;
2571 service serviceTemp;
2573 string_set(ptr, pszParmValue);
2575 init_service(&serviceTemp);
2577 bRetval = False;
2579 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2581 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2583 if (iTemp == iServiceIndex)
2585 DEBUG(0,
2586 ("Can't copy service %s - unable to copy self!\n",
2587 pszParmValue));
2589 else
2591 copy_service(ServicePtrs[iServiceIndex],
2592 &serviceTemp,
2593 ServicePtrs[iServiceIndex]->copymap);
2594 bRetval = True;
2597 else
2599 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2600 pszParmValue));
2601 bRetval = False;
2604 free_service(&serviceTemp);
2605 return (bRetval);
2608 /***************************************************************************
2609 Handle winbind uid and gid allocation parameters. The format of these
2610 parameters is:
2612 [global]
2614 winbind uid = 1000-1999
2615 winbind gid = 700-899
2617 We only do simple parsing checks here. The strings are parsed into useful
2618 structures in the winbind daemon code.
2620 ***************************************************************************/
2622 /* Some lp_ routines to return winbind [ug]id information */
2624 static uid_t winbind_uid_low, winbind_uid_high;
2625 static gid_t winbind_gid_low, winbind_gid_high;
2627 BOOL lp_winbind_uid(uid_t *low, uid_t *high)
2629 if (winbind_uid_low == 0 || winbind_uid_high == 0)
2630 return False;
2632 if (low)
2633 *low = winbind_uid_low;
2635 if (high)
2636 *high = winbind_uid_high;
2638 return True;
2641 BOOL lp_winbind_gid(gid_t *low, gid_t *high)
2643 if (winbind_gid_low == 0 || winbind_gid_high == 0)
2644 return False;
2646 if (low)
2647 *low = winbind_gid_low;
2649 if (high)
2650 *high = winbind_gid_high;
2652 return True;
2655 /* Do some simple checks on "winbind [ug]id" parameter values */
2657 static BOOL handle_winbind_uid(char *pszParmValue, char **ptr)
2659 unsigned int low, high;
2661 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2662 return False;
2664 /* Parse OK */
2666 string_set(ptr, pszParmValue);
2668 winbind_uid_low = (uid_t)low;
2669 winbind_uid_high = (uid_t)high;
2671 return True;
2674 static BOOL handle_winbind_gid(char *pszParmValue, char **ptr)
2676 unsigned int low, high;
2678 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2679 return False;
2681 /* Parse OK */
2683 string_set(ptr, pszParmValue);
2685 winbind_gid_low = (gid_t)low;
2686 winbind_gid_high = (gid_t)high;
2688 return True;
2691 /***************************************************************************
2692 Handle the WINS SERVER list.
2693 ***************************************************************************/
2695 static BOOL handle_wins_server_list( char *pszParmValue, char **ptr )
2697 if( !wins_srv_load_list( pszParmValue ) )
2698 return( False ); /* Parse failed. */
2700 string_set( ptr, pszParmValue );
2701 return( True );
2704 /***************************************************************************
2705 Handle the DEBUG level list.
2706 ***************************************************************************/
2708 static BOOL handle_debug_list( char *pszParmValueIn, char **ptr )
2710 pstring pszParmValue;
2712 pstrcpy(pszParmValue, pszParmValueIn);
2713 return debug_parse_levels( pszParmValue );
2717 /***************************************************************************
2718 Initialise a copymap.
2719 ***************************************************************************/
2721 static void init_copymap(service * pservice)
2723 int i;
2724 SAFE_FREE(pservice->copymap);
2725 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2726 if (!pservice->copymap)
2727 DEBUG(0,
2728 ("Couldn't allocate copymap!! (size %d)\n",
2729 (int)NUMPARAMETERS));
2730 else
2731 for (i = 0; i < NUMPARAMETERS; i++)
2732 pservice->copymap[i] = True;
2736 /***************************************************************************
2737 return the local pointer to a parameter given the service number and the
2738 pointer into the default structure
2739 ***************************************************************************/
2740 void *lp_local_ptr(int snum, void *ptr)
2742 return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
2745 /***************************************************************************
2746 Process a parameter for a particular service number. If snum < 0
2747 then assume we are in the globals
2748 ***************************************************************************/
2749 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2751 int parmnum, i;
2752 void *parm_ptr = NULL; /* where we are going to store the result */
2753 void *def_ptr = NULL;
2755 parmnum = map_parameter(pszParmName);
2757 if (parmnum < 0)
2759 DEBUG(0,
2760 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2761 return (True);
2764 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2766 DEBUG(0, ("WARNING: The \"%s\"option is deprecated\n",
2767 pszParmName));
2770 def_ptr = parm_table[parmnum].ptr;
2772 /* we might point at a service, the default service or a global */
2773 if (snum < 0)
2775 parm_ptr = def_ptr;
2777 else
2779 if (parm_table[parmnum].class == P_GLOBAL)
2781 DEBUG(0,
2782 ("Global parameter %s found in service section!\n",
2783 pszParmName));
2784 return (True);
2786 parm_ptr =
2787 ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
2788 &sDefault);
2791 if (snum >= 0)
2793 if (!ServicePtrs[snum]->copymap)
2794 init_copymap(ServicePtrs[snum]);
2796 /* this handles the aliases - set the copymap for other entries with
2797 the same data pointer */
2798 for (i = 0; parm_table[i].label; i++)
2799 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2800 ServicePtrs[snum]->copymap[i] = False;
2803 /* if it is a special case then go ahead */
2804 if (parm_table[parmnum].special)
2806 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2807 return (True);
2810 /* now switch on the type of variable it is */
2811 switch (parm_table[parmnum].type)
2813 case P_BOOL:
2814 set_boolean(parm_ptr, pszParmValue);
2815 break;
2817 case P_BOOLREV:
2818 set_boolean(parm_ptr, pszParmValue);
2819 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2820 break;
2822 case P_INTEGER:
2823 *(int *)parm_ptr = atoi(pszParmValue);
2824 break;
2826 case P_CHAR:
2827 *(char *)parm_ptr = *pszParmValue;
2828 break;
2830 case P_OCTAL:
2831 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2832 break;
2834 case P_STRING:
2835 string_set(parm_ptr, pszParmValue);
2836 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2837 unix_to_dos(*(char **)parm_ptr);
2838 break;
2840 case P_USTRING:
2841 string_set(parm_ptr, pszParmValue);
2842 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2843 unix_to_dos(*(char **)parm_ptr);
2844 strupper(*(char **)parm_ptr);
2845 break;
2847 case P_GSTRING:
2848 pstrcpy((char *)parm_ptr, pszParmValue);
2849 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2850 unix_to_dos((char *)parm_ptr);
2851 break;
2853 case P_UGSTRING:
2854 pstrcpy((char *)parm_ptr, pszParmValue);
2855 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2856 unix_to_dos((char *)parm_ptr);
2857 strupper((char *)parm_ptr);
2858 break;
2860 case P_ENUM:
2861 for (i = 0; parm_table[parmnum].enum_list[i].name;
2862 i++)
2864 if (strequal
2865 (pszParmValue,
2866 parm_table[parmnum].enum_list[i].name))
2868 *(int *)parm_ptr =
2869 parm_table[parmnum].
2870 enum_list[i].value;
2871 break;
2874 break;
2875 case P_SEP:
2876 break;
2880 return (True);
2883 /***************************************************************************
2884 Process a parameter.
2885 ***************************************************************************/
2886 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2888 if (!bInGlobalSection && bGlobalOnly)
2889 return (True);
2891 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2893 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2894 pszParmName, pszParmValue));
2898 /***************************************************************************
2899 print a parameter of the specified type
2900 ***************************************************************************/
2901 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f, char *(*dos_to_ext)(const char *))
2903 int i;
2904 switch (p->type)
2906 case P_ENUM:
2907 for (i = 0; p->enum_list[i].name; i++)
2909 if (*(int *)ptr == p->enum_list[i].value)
2911 fprintf(f, "%s",
2912 p->enum_list[i].name);
2913 break;
2916 break;
2918 case P_BOOL:
2919 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2920 break;
2922 case P_BOOLREV:
2923 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2924 break;
2926 case P_INTEGER:
2927 fprintf(f, "%d", *(int *)ptr);
2928 if (strequal(p->label,"log level")) {
2929 for (i = 1; i < DBGC_LAST; i ++) {
2930 if (((int *)ptr)[i])
2931 fprintf(f, ",%s:%d",debug_classname_from_index(i),((int *)ptr)[i]);
2934 break;
2936 case P_CHAR:
2937 fprintf(f, "%c", *(char *)ptr);
2938 break;
2940 case P_OCTAL:
2941 fprintf(f, "%s", octal_string(*(int *)ptr));
2942 break;
2944 case P_GSTRING:
2945 case P_UGSTRING:
2946 if ((char *)ptr) {
2947 if (p->flags & FLAG_DOS_STRING)
2948 fprintf(f, "%s", dos_to_ext((const char *)ptr));
2949 else
2950 fprintf(f, "%s", (char *)ptr);
2952 break;
2954 case P_STRING:
2955 case P_USTRING:
2956 if (*(char **)ptr) {
2957 if(p->flags & FLAG_DOS_STRING)
2958 fprintf(f,"%s",dos_to_ext((const char *)*(const char **)ptr));
2959 else
2960 fprintf(f, "%s", *(char **)ptr);
2962 break;
2963 case P_SEP:
2964 break;
2969 /***************************************************************************
2970 check if two parameters are equal
2971 ***************************************************************************/
2972 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2974 switch (type)
2976 case P_BOOL:
2977 case P_BOOLREV:
2978 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2980 case P_INTEGER:
2981 case P_ENUM:
2982 case P_OCTAL:
2983 return (*((int *)ptr1) == *((int *)ptr2));
2985 case P_CHAR:
2986 return (*((char *)ptr1) == *((char *)ptr2));
2988 case P_GSTRING:
2989 case P_UGSTRING:
2991 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2992 if (p1 && !*p1)
2993 p1 = NULL;
2994 if (p2 && !*p2)
2995 p2 = NULL;
2996 return (p1 == p2 || strequal(p1, p2));
2998 case P_STRING:
2999 case P_USTRING:
3001 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
3002 if (p1 && !*p1)
3003 p1 = NULL;
3004 if (p2 && !*p2)
3005 p2 = NULL;
3006 return (p1 == p2 || strequal(p1, p2));
3008 case P_SEP:
3009 break;
3011 return (False);
3014 /***************************************************************************
3015 Initialize any local varients in the sDefault table.
3016 ***************************************************************************/
3018 void init_locals(void)
3020 /* None as yet. */
3023 /***************************************************************************
3024 Process a new section (service). At this stage all sections are services.
3025 Later we'll have special sections that permit server parameters to be set.
3026 Returns True on success, False on failure. SectionName must be in DOS codepage.
3027 ***************************************************************************/
3028 static BOOL do_section(char *pszSectionName)
3030 BOOL bRetval;
3031 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
3032 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
3033 bRetval = False;
3035 /* if we were in a global section then do the local inits */
3036 if (bInGlobalSection && !isglobal)
3037 init_locals();
3039 /* if we've just struck a global section, note the fact. */
3040 bInGlobalSection = isglobal;
3042 /* check for multiple global sections */
3043 if (bInGlobalSection)
3045 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
3046 return (True);
3049 if (!bInGlobalSection && bGlobalOnly)
3050 return (True);
3052 /* if we have a current service, tidy it up before moving on */
3053 bRetval = True;
3055 if (iServiceIndex >= 0)
3056 bRetval = service_ok(iServiceIndex);
3058 /* if all is still well, move to the next record in the services array */
3059 if (bRetval)
3061 /* We put this here to avoid an odd message order if messages are */
3062 /* issued by the post-processing of a previous section. */
3063 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
3065 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
3066 < 0)
3068 DEBUG(0, ("Failed to add a new service\n"));
3069 return (False);
3073 return (bRetval);
3077 /***************************************************************************
3078 determine if a partcular base parameter is currently set to the default value.
3079 ***************************************************************************/
3080 static BOOL is_default(int i)
3082 if (!defaults_saved)
3083 return False;
3084 switch (parm_table[i].type)
3086 case P_STRING:
3087 case P_USTRING:
3088 return strequal(parm_table[i].def.svalue,
3089 *(char **)parm_table[i].ptr);
3090 case P_GSTRING:
3091 case P_UGSTRING:
3092 return strequal(parm_table[i].def.svalue,
3093 (char *)parm_table[i].ptr);
3094 case P_BOOL:
3095 case P_BOOLREV:
3096 return parm_table[i].def.bvalue ==
3097 *(BOOL *)parm_table[i].ptr;
3098 case P_CHAR:
3099 return parm_table[i].def.cvalue ==
3100 *(char *)parm_table[i].ptr;
3101 case P_INTEGER:
3102 case P_OCTAL:
3103 case P_ENUM:
3104 return parm_table[i].def.ivalue ==
3105 *(int *)parm_table[i].ptr;
3106 case P_SEP:
3107 break;
3109 return False;
3113 /***************************************************************************
3114 Display the contents of the global structure.
3115 ***************************************************************************/
3116 static void dump_globals(FILE *f, char *(*dos_to_ext)(const char *))
3118 int i;
3119 fprintf(f, "# Global parameters\n[global]\n");
3121 for (i = 0; parm_table[i].label; i++)
3122 if (parm_table[i].class == P_GLOBAL &&
3123 parm_table[i].ptr &&
3124 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3126 if (defaults_saved && is_default(i))
3127 continue;
3128 fprintf(f, "\t%s = ", parm_table[i].label);
3129 print_parameter(&parm_table[i], parm_table[i].ptr, f, dos_to_ext);
3130 fprintf(f, "\n");
3134 /***************************************************************************
3135 return True if a local parameter is currently set to the global default
3136 ***************************************************************************/
3137 BOOL lp_is_default(int snum, struct parm_struct *parm)
3139 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
3141 return equal_parameter(parm->type,
3142 ((char *)ServicePtrs[snum]) + pdiff,
3143 ((char *)&sDefault) + pdiff);
3147 /***************************************************************************
3148 Display the contents of a single services record.
3149 ***************************************************************************/
3150 static void dump_a_service(service * pService, FILE * f, char *(*dos_to_ext)(const char *))
3152 int i;
3153 if (pService != &sDefault)
3154 fprintf(f, "\n[%s]\n", pService->szService);
3156 for (i = 0; parm_table[i].label; i++)
3157 if (parm_table[i].class == P_LOCAL &&
3158 parm_table[i].ptr &&
3159 (*parm_table[i].label != '-') &&
3160 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3162 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
3164 if (pService == &sDefault)
3166 if (defaults_saved && is_default(i))
3167 continue;
3169 else
3171 if (equal_parameter(parm_table[i].type,
3172 ((char *)pService) +
3173 pdiff,
3174 ((char *)&sDefault) +
3175 pdiff))
3176 continue;
3179 fprintf(f, "\t%s = ", parm_table[i].label);
3180 print_parameter(&parm_table[i],
3181 ((char *)pService) + pdiff, f, dos_to_ext);
3182 fprintf(f, "\n");
3187 /***************************************************************************
3188 return info about the next service in a service. snum==-1 gives the globals
3190 return NULL when out of parameters
3191 ***************************************************************************/
3192 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
3194 if (snum == -1)
3196 /* do the globals */
3197 for (; parm_table[*i].label; (*i)++)
3199 if (parm_table[*i].class == P_SEPARATOR)
3200 return &parm_table[(*i)++];
3202 if (!parm_table[*i].ptr
3203 || (*parm_table[*i].label == '-'))
3204 continue;
3206 if ((*i) > 0
3207 && (parm_table[*i].ptr ==
3208 parm_table[(*i) - 1].ptr))
3209 continue;
3211 return &parm_table[(*i)++];
3214 else
3216 service *pService = ServicePtrs[snum];
3218 for (; parm_table[*i].label; (*i)++)
3220 if (parm_table[*i].class == P_SEPARATOR)
3221 return &parm_table[(*i)++];
3223 if (parm_table[*i].class == P_LOCAL &&
3224 parm_table[*i].ptr &&
3225 (*parm_table[*i].label != '-') &&
3226 ((*i) == 0 ||
3227 (parm_table[*i].ptr !=
3228 parm_table[(*i) - 1].ptr)))
3230 int pdiff =
3231 PTR_DIFF(parm_table[*i].ptr,
3232 &sDefault);
3234 if (allparameters ||
3235 !equal_parameter(parm_table[*i].type,
3236 ((char *)pService) +
3237 pdiff,
3238 ((char *)&sDefault) +
3239 pdiff))
3241 return &parm_table[(*i)++];
3247 return NULL;
3251 #if 0
3252 /***************************************************************************
3253 Display the contents of a single copy structure.
3254 ***************************************************************************/
3255 static void dump_copy_map(BOOL *pcopymap)
3257 int i;
3258 if (!pcopymap)
3259 return;
3261 printf("\n\tNon-Copied parameters:\n");
3263 for (i = 0; parm_table[i].label; i++)
3264 if (parm_table[i].class == P_LOCAL &&
3265 parm_table[i].ptr && !pcopymap[i] &&
3266 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3268 printf("\t\t%s\n", parm_table[i].label);
3271 #endif
3273 /***************************************************************************
3274 Return TRUE if the passed service number is within range.
3275 ***************************************************************************/
3277 BOOL lp_snum_ok(int iService)
3279 return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
3282 /***************************************************************************
3283 Auto-load some home services.
3284 ***************************************************************************/
3286 static void lp_add_auto_services(char *str)
3288 char *s;
3289 char *p;
3290 int homes;
3292 if (!str)
3293 return;
3295 s = strdup(str);
3296 if (!s)
3297 return;
3299 homes = lp_servicenumber(HOMES_NAME);
3301 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP)) {
3302 char *home = get_user_service_home_dir(p);
3304 if (lp_servicenumber(p) >= 0)
3305 continue;
3307 if (home && homes >= 0)
3308 lp_add_home(p, homes, home);
3310 SAFE_FREE(s);
3313 /***************************************************************************
3314 Auto-load one printer.
3315 ***************************************************************************/
3317 void lp_add_one_printer(char *name, char *comment)
3319 int printers = lp_servicenumber(PRINTERS_NAME);
3320 int i;
3322 if (lp_servicenumber(name) < 0) {
3323 lp_add_printer(name, printers);
3324 if ((i = lp_servicenumber(name)) >= 0) {
3325 string_set(&ServicePtrs[i]->comment, comment);
3326 unix_to_dos(ServicePtrs[i]->comment);
3327 ServicePtrs[i]->autoloaded = True;
3332 /***************************************************************************
3333 have we loaded a services file yet?
3334 ***************************************************************************/
3335 BOOL lp_loaded(void)
3337 return (bLoaded);
3340 /***************************************************************************
3341 unload unused services
3342 ***************************************************************************/
3343 void lp_killunused(BOOL (*snumused) (int))
3345 int i;
3346 for (i = 0; i < iNumServices; i++)
3348 if (!VALID(i))
3349 continue;
3351 if (!snumused || !snumused(i))
3353 ServicePtrs[i]->valid = False;
3354 free_service(ServicePtrs[i]);
3360 /***************************************************************************
3361 unload a service
3362 ***************************************************************************/
3363 void lp_killservice(int iServiceIn)
3365 if (VALID(iServiceIn))
3367 ServicePtrs[iServiceIn]->valid = False;
3368 free_service(ServicePtrs[iServiceIn]);
3372 /***************************************************************************
3373 save the curent values of all global and sDefault parameters into the
3374 defaults union. This allows swat and testparm to show only the
3375 changed (ie. non-default) parameters.
3376 ***************************************************************************/
3377 static void lp_save_defaults(void)
3379 int i;
3380 for (i = 0; parm_table[i].label; i++)
3382 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3383 continue;
3384 switch (parm_table[i].type)
3386 case P_STRING:
3387 case P_USTRING:
3388 parm_table[i].def.svalue =
3389 strdup(*(char **)parm_table[i].ptr);
3390 break;
3391 case P_GSTRING:
3392 case P_UGSTRING:
3393 parm_table[i].def.svalue =
3394 strdup((char *)parm_table[i].ptr);
3395 break;
3396 case P_BOOL:
3397 case P_BOOLREV:
3398 parm_table[i].def.bvalue =
3399 *(BOOL *)parm_table[i].ptr;
3400 break;
3401 case P_CHAR:
3402 parm_table[i].def.cvalue =
3403 *(char *)parm_table[i].ptr;
3404 break;
3405 case P_INTEGER:
3406 case P_OCTAL:
3407 case P_ENUM:
3408 parm_table[i].def.ivalue =
3409 *(int *)parm_table[i].ptr;
3410 break;
3411 case P_SEP:
3412 break;
3415 defaults_saved = True;
3418 /*******************************************************************
3419 Set the server type we will announce as via nmbd.
3420 ********************************************************************/
3421 static void set_server_role(void)
3423 server_role = ROLE_STANDALONE;
3425 switch (lp_security()) {
3426 case SEC_SHARE:
3427 if (lp_domain_logons())
3428 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
3429 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3430 break;
3431 case SEC_SERVER:
3432 case SEC_DOMAIN:
3433 if (lp_domain_logons()) {
3434 server_role = ROLE_DOMAIN_BDC;
3435 DEBUG(10,("set_server_role: ROLE_DOMAIN_BDC\n"));
3436 break;
3438 server_role = ROLE_DOMAIN_MEMBER;
3439 DEBUG(10,("set_server_role: ROLE_DOMAIN_MEMBER\n"));
3440 break;
3441 case SEC_USER:
3442 if (lp_domain_logons()) {
3443 server_role = ROLE_DOMAIN_PDC;
3444 DEBUG(10,("set_server_role: ROLE_DOMAIN_PDC\n"));
3445 break;
3447 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3448 break;
3449 default:
3450 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
3451 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3452 break;
3457 /***************************************************************************
3458 Load the services array from the services file. Return True on success,
3459 False on failure.
3460 ***************************************************************************/
3461 BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults,
3462 BOOL add_ipc)
3464 pstring n2;
3465 BOOL bRetval;
3467 pstrcpy(n2, pszFname);
3468 standard_sub_basic(n2,sizeof(n2));
3470 add_to_file_list(pszFname, n2);
3472 bRetval = False;
3474 bInGlobalSection = True;
3475 bGlobalOnly = global_only;
3477 init_globals();
3479 if (save_defaults)
3481 init_locals();
3482 lp_save_defaults();
3485 pstrcpy(n2, pszFname);
3486 standard_sub_basic(n2,sizeof(n2));
3488 /* We get sections first, so have to start 'behind' to make up */
3489 iServiceIndex = -1;
3490 bRetval = pm_process(n2, do_section, do_parameter);
3492 /* finish up the last section */
3493 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3494 if (bRetval)
3495 if (iServiceIndex >= 0)
3496 bRetval = service_ok(iServiceIndex);
3498 lp_add_auto_services(lp_auto_services());
3500 if (add_ipc) {
3501 lp_add_ipc("IPC$", True);
3502 lp_add_ipc("ADMIN$", False);
3505 set_server_role();
3506 set_default_server_announce_type();
3508 bLoaded = True;
3510 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3511 /* if bWINSsupport is true and we are in the client */
3513 if (in_client && Globals.bWINSsupport)
3516 string_set(&Globals.szWINSserver, "127.0.0.1");
3520 return (bRetval);
3524 /***************************************************************************
3525 reset the max number of services
3526 ***************************************************************************/
3527 void lp_resetnumservices(void)
3529 iNumServices = 0;
3532 /***************************************************************************
3533 return the max number of services
3534 ***************************************************************************/
3535 int lp_numservices(void)
3537 return (iNumServices);
3540 /***************************************************************************
3541 Display the contents of the services array in human-readable form.
3542 ***************************************************************************/
3543 void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint, char *(*dos_to_ext)(const char *))
3545 int iService;
3547 if (show_defaults)
3549 defaults_saved = False;
3552 dump_globals(f, dos_to_ext);
3554 dump_a_service(&sDefault, f, dos_to_ext);
3556 for (iService = 0; iService < maxtoprint; iService++)
3557 lp_dump_one(f, show_defaults, iService, dos_to_ext);
3560 /***************************************************************************
3561 Display the contents of one service in human-readable form.
3562 ***************************************************************************/
3563 void lp_dump_one(FILE * f, BOOL show_defaults, int snum, char *(*dos_to_ext)(const char *))
3565 if (VALID(snum))
3567 if (ServicePtrs[snum]->szService[0] == '\0')
3568 return;
3569 dump_a_service(ServicePtrs[snum], f, dos_to_ext);
3574 /***************************************************************************
3575 Return the number of the service with the given name, or -1 if it doesn't
3576 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3577 getservicebyname()! This works ONLY if all services have been loaded, and
3578 does not copy the found service.
3579 ***************************************************************************/
3580 int lp_servicenumber(char *pszServiceName)
3582 int iService;
3583 fstring serviceName;
3586 for (iService = iNumServices - 1; iService >= 0; iService--)
3588 if (VALID(iService) && ServicePtrs[iService]->szService)
3591 * The substitution here is used to support %U is
3592 * service names
3594 fstrcpy(serviceName, ServicePtrs[iService]->szService);
3595 standard_sub_basic(serviceName,sizeof(serviceName));
3596 if (strequal(serviceName, pszServiceName))
3597 break;
3601 if (iService < 0)
3602 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
3604 return (iService);
3607 /*******************************************************************
3608 A useful volume label function. Returns a string in DOS codepage.
3609 ********************************************************************/
3611 char *volume_label(int snum)
3613 char *ret = lp_volume(snum);
3614 if (!*ret)
3615 return lp_servicename(snum);
3616 return (ret);
3620 /*******************************************************************
3621 Set the server type we will announce as via nmbd.
3622 ********************************************************************/
3623 static void set_default_server_announce_type(void)
3625 default_server_announce = 0;
3626 default_server_announce |= SV_TYPE_WORKSTATION;
3627 default_server_announce |= SV_TYPE_SERVER;
3628 default_server_announce |= SV_TYPE_SERVER_UNIX;
3629 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3631 switch (lp_announce_as())
3633 case ANNOUNCE_AS_NT_SERVER:
3635 default_server_announce |= SV_TYPE_SERVER_NT;
3636 /* fall through... */
3638 case ANNOUNCE_AS_NT_WORKSTATION:
3640 default_server_announce |= SV_TYPE_NT;
3641 break;
3643 case ANNOUNCE_AS_WIN95:
3645 default_server_announce |= SV_TYPE_WIN95_PLUS;
3646 break;
3648 case ANNOUNCE_AS_WFW:
3650 default_server_announce |= SV_TYPE_WFW;
3651 break;
3653 default:
3655 break;
3659 switch (lp_server_role())
3661 case ROLE_DOMAIN_MEMBER:
3663 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3664 break;
3666 case ROLE_DOMAIN_PDC:
3668 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3669 break;
3671 case ROLE_DOMAIN_BDC:
3673 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3674 break;
3676 case ROLE_STANDALONE:
3677 default:
3679 break;
3683 if (lp_time_server())
3685 default_server_announce |= SV_TYPE_TIME_SOURCE;
3688 if (lp_host_msdfs())
3690 default_server_announce |= SV_TYPE_DFS_SERVER;
3694 /***********************************************************
3695 returns role of Samba server
3696 ************************************************************/
3698 int lp_server_role(void)
3700 return server_role;
3703 /***********************************************************
3704 If we are PDC then prefer us as DMB
3705 ************************************************************/
3707 BOOL lp_domain_master(void)
3709 if (Globals.bDomainMaster == Auto)
3711 return (lp_server_role() == ROLE_DOMAIN_PDC);
3714 return Globals.bDomainMaster;
3717 /***********************************************************
3718 If we are DMB then prefer us as LMB
3719 ************************************************************/
3721 BOOL lp_preferred_master(void)
3723 if (Globals.bPreferredMaster == Auto)
3725 return (lp_local_master() && lp_domain_master());
3728 return Globals.bPreferredMaster;
3733 /*******************************************************************
3734 remove a service
3735 ********************************************************************/
3736 void lp_remove_service(int snum)
3738 ServicePtrs[snum]->valid = False;
3741 /*******************************************************************
3742 copy a service. new_name must be in dos codepage
3743 ********************************************************************/
3744 void lp_copy_service(int snum, char *new_name)
3746 char *oldname = lp_servicename(snum);
3747 do_section(new_name);
3748 if (snum >= 0)
3750 snum = lp_servicenumber(new_name);
3751 if (snum >= 0)
3752 lp_do_parameter(snum, "copy", oldname);
3757 /*******************************************************************
3758 Get the default server type we will announce as via nmbd.
3759 ********************************************************************/
3760 int lp_default_server_announce(void)
3762 return default_server_announce;
3765 /*******************************************************************
3766 Split the announce version into major and minor numbers.
3767 ********************************************************************/
3768 int lp_major_announce_version(void)
3770 static BOOL got_major = False;
3771 static int major_version = DEFAULT_MAJOR_VERSION;
3772 char *vers;
3773 char *p;
3775 if (got_major)
3776 return major_version;
3778 got_major = True;
3779 if ((vers = lp_announce_version()) == NULL)
3780 return major_version;
3782 if ((p = strchr(vers, '.')) == 0)
3783 return major_version;
3785 *p = '\0';
3786 major_version = atoi(vers);
3787 return major_version;
3790 int lp_minor_announce_version(void)
3792 static BOOL got_minor = False;
3793 static int minor_version = DEFAULT_MINOR_VERSION;
3794 char *vers;
3795 char *p;
3797 if (got_minor)
3798 return minor_version;
3800 got_minor = True;
3801 if ((vers = lp_announce_version()) == NULL)
3802 return minor_version;
3804 if ((p = strchr(vers, '.')) == 0)
3805 return minor_version;
3807 p++;
3808 minor_version = atoi(p);
3809 return minor_version;
3812 /***********************************************************
3813 Set the global name resolution order (used in smbclient).
3814 ************************************************************/
3816 void lp_set_name_resolve_order(char *new_order)
3818 Globals.szNameResolveOrder = new_order;
3821 char *lp_printername(int snum)
3823 char *ret = _lp_printername(snum);
3824 if (ret == NULL || (ret != NULL && *ret == '\0'))
3825 ret = lp_servicename(snum);
3827 return ret;
3830 /***********************************************************
3831 Return a pointer to the private directory (containing
3832 smbpasswd etc.).
3833 ************************************************************/
3835 void get_private_directory(pstring priv_dir)
3837 char *p;
3839 *priv_dir = 0;
3841 #ifdef WITH_TDB_SAM
3842 pstrcpy(priv_dir, lp_tdb_passwd_file());
3843 #else
3844 pstrcpy(priv_dir, lp_smb_passwd_file());
3845 #endif
3847 p = strrchr(priv_dir, '/');
3848 if (p) *p = 0;
3851 /***********************************************************
3852 Allow daemons such as winbindd to fix their logfile name.
3853 ************************************************************/
3855 void lp_set_logfile(const char *name)
3857 extern pstring debugf;
3858 string_set(&Globals.szLogFile, name);
3859 pstrcpy(debugf, name);
3862 /*******************************************************************
3863 Return the NetBIOS called name.
3864 ********************************************************************/
3866 const char *get_called_name(void)
3868 extern fstring local_machine;
3869 static fstring called_name;
3871 if (! *local_machine)
3872 return global_myname;
3875 * Windows NT/2k uses "*SMBSERVER" and XP uses "*SMBSERV"
3876 * arrggg!!! but we've already rewritten the client's
3877 * netbios name at this point...
3880 if (*local_machine) {
3881 if (!StrCaseCmp(local_machine, "_SMBSERVER") || !StrCaseCmp(local_machine, "_SMBSERV")) {
3882 fstrcpy(called_name, get_my_primary_ip());
3883 DEBUG(8,("get_called_name: assuming that client used IP address [%s] as called name.\n",
3884 called_name));
3885 return called_name;
3889 return local_machine;
3892 /*******************************************************************
3893 Return the max print jobs per queue.
3894 ********************************************************************/
3896 int lp_maxprintjobs(int snum)
3898 int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
3899 if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
3900 maxjobs = PRINT_MAX_JOBID - 1;
3902 return maxjobs;