Removed unused parameters "max packet", "packet size".
[Samba.git] / source / param / loadparm.c
blobb7be1053b7a3dba9fa1e55de97b1692cfbf0a4a5
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 pwordlevel;
185 int unamelevel;
186 int deadtime;
187 int maxprotocol;
188 int minprotocol;
189 int security;
190 int maxdisksize;
191 int lpqcachetime;
192 int iMaxSmbdProcesses;
193 BOOL bDisableSpoolss;
194 int iTotalPrintJobs;
195 int syslog;
196 int os_level;
197 int enhanced_browsing;
198 int max_ttl;
199 int max_wins_ttl;
200 int min_wins_ttl;
201 int ReadSize;
202 int lm_announce;
203 int lm_interval;
204 int client_code_page;
205 int announce_as; /* This is initialised in init_globals */
206 int machine_password_timeout;
207 int change_notify_timeout;
208 int stat_cache_size;
209 int map_to_guest;
210 int min_passwd_length;
211 int oplock_break_wait_time;
212 int winbind_cache_time;
213 int iLockSpinCount;
214 int iLockSpinTime;
215 #ifdef WITH_LDAP_SAM
216 int ldap_port;
217 int ldap_ssl;
218 char *szLdapServer;
219 char *szLdapSuffix;
220 char *szLdapFilter;
221 char *szLdapAdminDn;
222 #endif /* WITH_LDAP */
224 #ifdef WITH_SSL
225 int sslVersion;
226 char *sslHostsRequire;
227 char *sslHostsResign;
228 char *sslCaCertDir;
229 char *sslCaCertFile;
230 char *sslServerCert;
231 char *sslServerPrivKey;
232 char *sslClientCert;
233 char *sslClientPrivKey;
234 char *sslCiphers;
235 char *sslEgdSocket;
236 char *sslEntropyFile;
237 int sslEntropyBytes;
238 BOOL sslEnabled;
239 BOOL sslReqClientCert;
240 BOOL sslReqServerCert;
241 BOOL sslCompatibility;
242 #endif /* WITH_SSL */
243 BOOL bMsAddPrinterWizard;
244 BOOL bDNSproxy;
245 BOOL bWINSsupport;
246 BOOL bWINSproxy;
247 BOOL bLocalMaster;
248 BOOL bPreferredMaster;
249 BOOL bDomainMaster;
250 BOOL bDomainLogons;
251 BOOL bEncryptPasswords;
252 BOOL bUpdateEncrypt;
253 BOOL bStripDot;
254 BOOL bNullPasswords;
255 BOOL bObeyPamRestrictions;
256 BOOL bLoadPrinters;
257 BOOL bUseRhosts;
258 BOOL bLargeReadwrite;
259 BOOL bReadRaw;
260 BOOL bWriteRaw;
261 BOOL bReadPrediction;
262 BOOL bReadbmpx;
263 BOOL bSyslogOnly;
264 BOOL bAdminLog;
265 BOOL bBrowseList;
266 BOOL bNISHomeMap;
267 BOOL bTimeServer;
268 BOOL bBindInterfacesOnly;
269 BOOL bPamPasswordChange;
270 BOOL bUnixPasswdSync;
271 BOOL bPasswdChatDebug;
272 BOOL bTimestampLogs;
273 BOOL bNTSmbSupport;
274 BOOL bNTPipeSupport;
275 BOOL bNTStatusSupport;
276 BOOL bStatCache;
277 BOOL bKernelOplocks;
278 BOOL bAllowTrustedDomains;
279 BOOL bRestrictAnonymous;
280 BOOL bLanmanAuth;
281 BOOL bDebugHiresTimestamp;
282 BOOL bDebugPid;
283 BOOL bDebugUid;
284 BOOL bHostMSDfs;
285 BOOL bHideLocalUsers;
286 BOOL bUseMmap;
287 BOOL bUnixExtensions;
288 int name_cache_timeout;
290 global;
292 static global Globals;
297 * This structure describes a single service.
299 typedef struct
301 BOOL valid;
302 BOOL autoloaded;
303 char *szService;
304 char *szPath;
305 char *szUsername;
306 char *szGuestaccount;
307 char *szInvalidUsers;
308 char *szValidUsers;
309 char *szAdminUsers;
310 char *szCopy;
311 char *szInclude;
312 char *szPreExec;
313 char *szPostExec;
314 char *szRootPreExec;
315 char *szRootPostExec;
316 char *szPrintcommand;
317 char *szLpqcommand;
318 char *szLprmcommand;
319 char *szLppausecommand;
320 char *szLpresumecommand;
321 char *szQueuepausecommand;
322 char *szQueueresumecommand;
323 char *szPrintername;
324 char *szPrinterDriver;
325 char *szPrinterDriverLocation;
326 char *szDriverFile;
327 char *szDontdescend;
328 char *szHostsallow;
329 char *szHostsdeny;
330 char *szMagicScript;
331 char *szMagicOutput;
332 char *szMangledMap;
333 char *szVetoFiles;
334 char *szHideFiles;
335 char *szVetoOplockFiles;
336 char *comment;
337 char *force_user;
338 char *force_group;
339 char *readlist;
340 char *writelist;
341 char *printer_admin;
342 char *volume;
343 char *fstype;
344 char *szVfsObjectFile;
345 char *szVfsOptions;
346 int iMinPrintSpace;
347 int iMaxPrintJobs;
348 int iWriteCacheSize;
349 int iCreate_mask;
350 int iCreate_force_mode;
351 int iSecurity_mask;
352 int iSecurity_force_mode;
353 int iDir_mask;
354 int iDir_force_mode;
355 int iDir_Security_mask;
356 int iDir_Security_force_mode;
357 int iMaxConnections;
358 int iDefaultCase;
359 int iPrinting;
360 int iOplockContentionLimit;
361 int iCSCPolicy;
362 int iBlock_size;
363 BOOL bAlternatePerm;
364 BOOL bPreexecClose;
365 BOOL bRootpreexecClose;
366 BOOL bCaseSensitive;
367 BOOL bCasePreserve;
368 BOOL bShortCasePreserve;
369 BOOL bCaseMangle;
370 BOOL status;
371 BOOL bHideDotFiles;
372 BOOL bHideUnReadable;
373 BOOL bBrowseable;
374 BOOL bAvailable;
375 BOOL bRead_only;
376 BOOL bNo_set_dir;
377 BOOL bGuest_only;
378 BOOL bGuest_ok;
379 BOOL bPrint_ok;
380 BOOL bPostscript;
381 BOOL bMap_system;
382 BOOL bMap_hidden;
383 BOOL bMap_archive;
384 BOOL bLocking;
385 BOOL bStrictLocking;
386 BOOL bPosixLocking;
387 BOOL bShareModes;
388 BOOL bOpLocks;
389 BOOL bLevel2OpLocks;
390 BOOL bOnlyUser;
391 BOOL bMangledNames;
392 BOOL bWidelinks;
393 BOOL bSymlinks;
394 BOOL bSyncAlways;
395 BOOL bStrictAllocate;
396 BOOL bStrictSync;
397 char magic_char;
398 BOOL *copymap;
399 BOOL bDeleteReadonly;
400 BOOL bFakeOplocks;
401 BOOL bDeleteVetoFiles;
402 BOOL bDosFilemode;
403 BOOL bDosFiletimes;
404 BOOL bDosFiletimeResolution;
405 BOOL bFakeDirCreateTimes;
406 BOOL bBlockingLocks;
407 BOOL bInheritPerms;
408 BOOL bInheritACLS;
409 BOOL bMSDfsRoot;
410 BOOL bUseClientDriver;
411 BOOL bDefaultDevmode;
412 BOOL bNTAclSupport;
413 BOOL bForceUnknownAclUser;
414 #ifdef WITH_SENDFILE
415 BOOL bUseSendfile;
416 #endif
417 BOOL bProfileAcls;
419 char dummy[3]; /* for alignment */
421 service;
424 /* This is a default service used to prime a services structure */
425 static service sDefault = {
426 True, /* valid */
427 False, /* not autoloaded */
428 NULL, /* szService */
429 NULL, /* szPath */
430 NULL, /* szUsername */
431 NULL, /* szGuestAccount - this is set in init_globals() */
432 NULL, /* szInvalidUsers */
433 NULL, /* szValidUsers */
434 NULL, /* szAdminUsers */
435 NULL, /* szCopy */
436 NULL, /* szInclude */
437 NULL, /* szPreExec */
438 NULL, /* szPostExec */
439 NULL, /* szRootPreExec */
440 NULL, /* szRootPostExec */
441 NULL, /* szPrintcommand */
442 NULL, /* szLpqcommand */
443 NULL, /* szLprmcommand */
444 NULL, /* szLppausecommand */
445 NULL, /* szLpresumecommand */
446 NULL, /* szQueuepausecommand */
447 NULL, /* szQueueresumecommand */
448 NULL, /* szPrintername */
449 NULL, /* szPrinterDriver - this is set in init_globals() */
450 NULL, /* szPrinterDriverLocation */
451 NULL, /* szDriverFile */
452 NULL, /* szDontdescend */
453 NULL, /* szHostsallow */
454 NULL, /* szHostsdeny */
455 NULL, /* szMagicScript */
456 NULL, /* szMagicOutput */
457 NULL, /* szMangledMap */
458 NULL, /* szVetoFiles */
459 NULL, /* szHideFiles */
460 NULL, /* szVetoOplockFiles */
461 NULL, /* comment */
462 NULL, /* force user */
463 NULL, /* force group */
464 NULL, /* readlist */
465 NULL, /* writelist */
466 NULL, /* printer admin */
467 NULL, /* volume */
468 NULL, /* fstype */
469 NULL, /* vfs object */
470 NULL, /* vfs options */
471 0, /* iMinPrintSpace */
472 1000, /* iMaxPrintJobs */
473 0, /* iWriteCacheSize */
474 0744, /* iCreate_mask */
475 0000, /* iCreate_force_mode */
476 0777, /* iSecurity_mask */
477 0, /* iSecurity_force_mode */
478 0755, /* iDir_mask */
479 0000, /* iDir_force_mode */
480 0777, /* iDir_Security_mask */
481 0, /* iDir_Security_force_mode */
482 0, /* iMaxConnections */
483 CASE_LOWER, /* iDefaultCase */
484 DEFAULT_PRINTING, /* iPrinting */
485 2, /* iOplockContentionLimit */
486 0, /* iCSCPolicy */
487 1024, /* iBlock_size */
488 False, /* bAlternatePerm */
489 False, /* bPreexecClose */
490 False, /* bRootpreexecClose */
491 False, /* case sensitive */
492 True, /* case preserve */
493 True, /* short case preserve */
494 False, /* case mangle */
495 True, /* status */
496 True, /* bHideDotFiles */
497 False, /* bHideUnReadable */
498 True, /* bBrowseable */
499 True, /* bAvailable */
500 True, /* bRead_only */
501 True, /* bNo_set_dir */
502 False, /* bGuest_only */
503 False, /* bGuest_ok */
504 False, /* bPrint_ok */
505 False, /* bPostscript */
506 False, /* bMap_system */
507 False, /* bMap_hidden */
508 True, /* bMap_archive */
509 True, /* bLocking */
510 False, /* bStrictLocking */
511 True, /* bPosixLocking */
512 True, /* bShareModes */
513 True, /* bOpLocks */
514 True, /* bLevel2OpLocks */
515 False, /* bOnlyUser */
516 True, /* bMangledNames */
517 True, /* bWidelinks */
518 True, /* bSymlinks */
519 False, /* bSyncAlways */
520 False, /* bStrictAllocate */
521 False, /* bStrictSync */
522 '~', /* magic char */
523 NULL, /* copymap */
524 False, /* bDeleteReadonly */
525 False, /* bFakeOplocks */
526 False, /* bDeleteVetoFiles */
527 False, /* bDosFilemode */
528 False, /* bDosFiletimes */
529 False, /* bDosFiletimeResolution */
530 False, /* bFakeDirCreateTimes */
531 True, /* bBlockingLocks */
532 False, /* bInheritPerms */
533 False, /* bInheritACLS */
534 False, /* bMSDfsRoot */
535 False, /* bUseClientDriver */
536 False, /* bDefaultDevmode */
537 True, /* bNTAclSupport */
538 False, /* bForceUnknownAclUser */
539 #ifdef WITH_SENDFILE
540 False, /* bUseSendfile */
541 #endif
542 False, /* bProfileAcls */
544 "" /* dummy */
547 /* local variables */
548 static service **ServicePtrs = NULL;
549 static int iNumServices = 0;
550 static int iServiceIndex = 0;
551 static BOOL bInGlobalSection = True;
552 static BOOL bGlobalOnly = False;
553 static int server_role;
554 static int default_server_announce;
556 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
558 /* prototypes for the special type handlers */
559 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
560 static BOOL handle_include(char *pszParmValue, char **ptr);
561 static BOOL handle_copy(char *pszParmValue, char **ptr);
562 static BOOL handle_character_set(char *pszParmValue, char **ptr);
563 static BOOL handle_coding_system(char *pszParmValue, char **ptr);
564 static BOOL handle_client_code_page(char *pszParmValue, char **ptr);
565 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
566 static BOOL handle_source_env(char *pszParmValue, char **ptr);
567 static BOOL handle_netbios_name(char *pszParmValue, char **ptr);
568 static BOOL handle_winbind_uid(char *pszParmValue, char **ptr);
569 static BOOL handle_winbind_gid(char *pszParmValue, char **ptr);
570 static BOOL handle_wins_server_list(char *pszParmValue, char **ptr);
571 static BOOL handle_debug_list( char *pszParmValue, char **ptr );
573 static void set_server_role(void);
574 static void set_default_server_announce_type(void);
576 static struct enum_list enum_protocol[] = {
577 {PROTOCOL_NT1, "NT1"},
578 {PROTOCOL_LANMAN2, "LANMAN2"},
579 {PROTOCOL_LANMAN1, "LANMAN1"},
580 {PROTOCOL_CORE, "CORE"},
581 {PROTOCOL_COREPLUS, "COREPLUS"},
582 {PROTOCOL_COREPLUS, "CORE+"},
583 {-1, NULL}
586 static struct enum_list enum_security[] = {
587 {SEC_SHARE, "SHARE"},
588 {SEC_USER, "USER"},
589 {SEC_SERVER, "SERVER"},
590 {SEC_DOMAIN, "DOMAIN"},
591 {-1, NULL}
594 static struct enum_list enum_printing[] = {
595 {PRINT_SYSV, "sysv"},
596 {PRINT_AIX, "aix"},
597 {PRINT_HPUX, "hpux"},
598 {PRINT_BSD, "bsd"},
599 {PRINT_QNX, "qnx"},
600 {PRINT_PLP, "plp"},
601 {PRINT_LPRNG, "lprng"},
602 {PRINT_SOFTQ, "softq"},
603 {PRINT_CUPS, "cups"},
604 {PRINT_LPRNT, "nt"},
605 {PRINT_LPROS2, "os2"},
606 #ifdef DEVELOPER
607 {PRINT_TEST, "test"},
608 {PRINT_VLP, "vlp"},
609 #endif /* DEVELOPER */
610 {-1, NULL}
613 #ifdef WITH_LDAP_SAM
614 static struct enum_list enum_ldap_ssl[] = {
615 {LDAP_SSL_ON, "Yes"},
616 {LDAP_SSL_ON, "yes"},
617 {LDAP_SSL_ON, "on"},
618 {LDAP_SSL_ON, "On"},
619 {LDAP_SSL_OFF, "no"},
620 {LDAP_SSL_OFF, "No"},
621 {LDAP_SSL_OFF, "off"},
622 {LDAP_SSL_OFF, "Off"},
623 {LDAP_SSL_START_TLS, "start tls"},
624 {LDAP_SSL_START_TLS, "start_tls"},
625 {-1, NULL}
627 #endif
629 /* Types of machine we can announce as. */
630 #define ANNOUNCE_AS_NT_SERVER 1
631 #define ANNOUNCE_AS_WIN95 2
632 #define ANNOUNCE_AS_WFW 3
633 #define ANNOUNCE_AS_NT_WORKSTATION 4
635 static struct enum_list enum_announce_as[] = {
636 {ANNOUNCE_AS_NT_SERVER, "NT"},
637 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
638 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
639 {ANNOUNCE_AS_WIN95, "win95"},
640 {ANNOUNCE_AS_WFW, "WfW"},
641 {-1, NULL}
644 static struct enum_list enum_case[] = {
645 {CASE_LOWER, "lower"},
646 {CASE_UPPER, "upper"},
647 {-1, NULL}
650 static struct enum_list enum_bool_auto[] = {
651 {False, "No"},
652 {False, "False"},
653 {False, "0"},
654 {True, "Yes"},
655 {True, "True"},
656 {True, "1"},
657 {Auto, "Auto"},
658 {-1, NULL}
661 /* Client-side offline caching policy types */
662 #define CSC_POLICY_MANUAL 0
663 #define CSC_POLICY_DOCUMENTS 1
664 #define CSC_POLICY_PROGRAMS 2
665 #define CSC_POLICY_DISABLE 3
667 static struct enum_list enum_csc_policy[] = {
668 {CSC_POLICY_MANUAL, "manual"},
669 {CSC_POLICY_DOCUMENTS, "documents"},
670 {CSC_POLICY_PROGRAMS, "programs"},
671 {CSC_POLICY_DISABLE, "disable"},
672 {-1,NULL}
676 Do you want session setups at user level security with a invalid
677 password to be rejected or allowed in as guest? WinNT rejects them
678 but it can be a pain as it means "net view" needs to use a password
680 You have 3 choices in the setting of map_to_guest:
682 "Never" means session setups with an invalid password
683 are rejected. This is the default.
685 "Bad User" means session setups with an invalid password
686 are rejected, unless the username does not exist, in which case it
687 is treated as a guest login
689 "Bad Password" means session setups with an invalid password
690 are treated as a guest login
692 Note that map_to_guest only has an effect in user or server
693 level security.
696 static struct enum_list enum_map_to_guest[] = {
697 {NEVER_MAP_TO_GUEST, "Never"},
698 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
699 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
700 {-1, NULL}
703 #ifdef WITH_SSL
704 static struct enum_list enum_ssl_version[] = {
705 {SMB_SSL_V2, "ssl2"},
706 {SMB_SSL_V3, "ssl3"},
707 {SMB_SSL_V23, "ssl2or3"},
708 {SMB_SSL_TLS1, "tls1"},
709 {-1, NULL}
711 #endif
713 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
714 static struct parm_struct parm_table[] = {
715 {"Base Options", P_SEP, P_SEPARATOR},
717 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
718 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, handle_client_code_page, NULL, 0},
719 {"code page directory", P_STRING, P_GLOBAL, &Globals.szCodePageDir, NULL, NULL, 0},
720 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
721 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_DOS_STRING},
722 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING},
723 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING | FLAG_WIZARD},
724 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC | FLAG_DOS_STRING | FLAG_WIZARD},
725 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING},
726 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, FLAG_DOS_STRING},
727 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_DOS_STRING},
728 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC | FLAG_WIZARD},
729 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, FLAG_WIZARD},
731 {"Security Options", P_SEP, P_SEPARATOR},
733 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_WIZARD},
734 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_WIZARD},
735 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
736 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, 0},
737 {"alternate permissions", P_BOOL, P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL | FLAG_DEPRECATED},
738 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
739 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
740 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0},
741 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
742 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
743 {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, 0},
744 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_WIZARD},
745 #ifdef WITH_TDB_SAM
746 {"tdb passwd file", P_STRING, P_GLOBAL, &Globals.szTDBPasswdFile, NULL, NULL, 0},
747 #else
748 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
749 #endif
750 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
751 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
752 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
754 {"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, 0},
755 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
756 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
757 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
758 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
759 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
760 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
761 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
762 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0},
763 {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, 0},
764 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
766 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
767 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
768 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
770 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL},
771 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
772 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
773 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
774 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
775 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
776 {"printer admin", P_STRING, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_PRINT},
777 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
778 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
779 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
781 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE},
782 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
783 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
784 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
786 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
787 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
788 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
789 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
790 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
791 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
792 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
793 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
794 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
795 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
796 {"force unknown acl user", P_OCTAL, P_LOCAL, &sDefault.bForceUnknownAclUser, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
797 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
798 {"inherit acls", P_BOOL, P_LOCAL, &sDefault.bInheritACLS, NULL, NULL, FLAG_SHARE},
799 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
800 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
802 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
803 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
805 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
806 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
807 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
808 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
809 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
811 #ifdef WITH_SSL
812 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
813 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0},
815 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0},
816 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
817 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0},
818 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0},
819 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslServerCert, NULL, NULL, 0},
820 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslServerPrivKey, NULL, NULL, 0},
821 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0},
822 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0},
823 {"ssl egd socket", P_STRING, P_GLOBAL, &Globals.sslEgdSocket, NULL, NULL, 0},
824 {"ssl entropy file", P_STRING, P_GLOBAL, &Globals.sslEntropyFile, NULL, NULL, 0},
825 {"ssl entropy bytes", P_INTEGER, P_GLOBAL, &Globals.sslEntropyBytes, NULL, NULL, 0},
826 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0},
827 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0},
828 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0},
829 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
830 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0},
831 #endif /* WITH_SSL */
833 {"Logging Options", P_SEP, P_SEPARATOR},
835 {"admin log", P_BOOL, P_GLOBAL, &Globals.bAdminLog, NULL, NULL, 0},
836 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
837 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL_CLASS[DBGC_ALL], handle_debug_list, NULL, 0},
838 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
839 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
840 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
842 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
843 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
844 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
845 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, 0},
846 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
847 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
849 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT | FLAG_DEPRECATED},
851 {"Protocol Options", P_SEP, P_SEPARATOR},
853 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
854 {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, 0},
855 {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
856 {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, 0},
857 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
858 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
859 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
861 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
862 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
863 {"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE },
864 {"nt status support", P_BOOL, P_GLOBAL, &Globals.bNTStatusSupport, NULL, NULL, 0 },
865 {"profile acls", P_BOOL, P_LOCAL, &sDefault.bProfileAcls, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE },
866 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
867 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
868 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
869 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
871 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
872 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
873 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
874 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
875 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
876 {"unix extensions", P_BOOL, P_GLOBAL, &Globals.bUnixExtensions, NULL, NULL, 0},
878 {"Tuning Options", P_SEP, P_SEPARATOR},
880 {"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
881 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
882 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
883 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
884 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
886 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
887 {"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, 0},
888 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
889 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
890 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
891 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
892 {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, 0},
893 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
895 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
896 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
897 {"strict allocate", P_BOOL, P_LOCAL, &sDefault.bStrictAllocate, NULL, NULL, FLAG_SHARE},
898 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
899 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
900 {"use mmap", P_BOOL, P_GLOBAL, &Globals.bUseMmap, NULL, NULL, 0},
901 #ifdef WITH_SENDFILE
902 {"use sendfile", P_BOOL, P_LOCAL, &sDefault.bUseSendfile, NULL, NULL, FLAG_SHARE},
903 #endif
904 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
906 {"Printing Options", P_SEP, P_SEPARATOR},
908 {"total print jobs", P_INTEGER, P_GLOBAL, &Globals.iTotalPrintJobs, NULL, NULL, FLAG_PRINT},
909 {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_PRINT},
910 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
911 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT},
912 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
913 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
914 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
915 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED},
916 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
917 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
918 {"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
919 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
920 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
921 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
922 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
923 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
924 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
926 {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, 0},
927 {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, 0},
928 {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, 0},
929 {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, 0},
930 {"os2 driver map", P_STRING, P_GLOBAL, &Globals.szOs2DriverMap, NULL, NULL, 0},
932 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT|FLAG_DOS_STRING},
933 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_DOS_STRING},
934 {"use client driver", P_BOOL, P_LOCAL, &sDefault.bUseClientDriver, NULL, NULL, FLAG_PRINT},
935 {"default devmode", P_BOOL, P_LOCAL, &sDefault.bDefaultDevmode, NULL, NULL, FLAG_PRINT},
936 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED},
937 {"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED},
938 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL | FLAG_DEPRECATED},
940 {"Filename Handling", P_SEP, P_SEPARATOR},
941 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, FLAG_DEPRECATED },
942 {"mangling method", P_STRING, P_GLOBAL, &Globals.szManglingMethod, NULL, NULL, 0},
944 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
945 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
946 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
947 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
948 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
949 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
950 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
951 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
952 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
953 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
954 {"hide unreadable", P_BOOL, P_LOCAL, &sDefault.bHideUnReadable, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
955 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
956 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
957 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
958 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL | FLAG_DOS_STRING},
959 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
960 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
961 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
962 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
963 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
964 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
966 {"Domain Options", P_SEP, P_SEPARATOR},
968 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0},
969 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0},
970 #ifdef USING_GROUPNAME_MAP
972 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
973 #endif /* USING_GROUPNAME_MAP */
975 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
977 {"Logon Options", P_SEP, P_SEPARATOR},
979 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0},
980 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0},
981 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_DOS_STRING},
982 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_DOS_STRING},
983 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
984 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_DOS_STRING},
985 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
987 {"Browse Options", P_SEP, P_SEPARATOR},
989 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
990 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, 0},
991 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
992 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC},
993 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
994 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
995 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC},
996 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
997 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
998 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
999 {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL},
1001 {"WINS Options", P_SEP, P_SEPARATOR},
1002 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
1003 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
1005 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, handle_wins_server_list, NULL, FLAG_BASIC | FLAG_WIZARD},
1006 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_WIZARD},
1007 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, 0},
1009 {"Locking Options", P_SEP, P_SEPARATOR},
1011 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1012 {"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_SHARE | FLAG_GLOBAL},
1013 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
1014 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
1015 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1016 {"lock spin count", P_INTEGER, P_GLOBAL, &Globals.iLockSpinCount, NULL, NULL, FLAG_GLOBAL},
1017 {"lock spin time", P_INTEGER, P_GLOBAL, &Globals.iLockSpinTime, NULL, NULL, FLAG_GLOBAL},
1019 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1020 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1021 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
1022 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1023 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1024 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1025 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
1027 #ifdef WITH_LDAP_SAM
1028 {"Ldap Options", P_SEP, P_SEPARATOR},
1030 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
1031 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
1032 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
1033 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0},
1034 {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, 0},
1035 {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, 0},
1036 #endif /* WITH_LDAP_SAM */
1038 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
1039 {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, 0},
1040 {"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, 0},
1041 {"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, 0},
1043 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
1044 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
1045 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_DOS_STRING},
1046 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
1047 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
1048 {"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, 0},
1049 #ifdef WITH_UTMP
1050 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
1051 {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
1052 {"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, 0},
1053 #endif
1055 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DOS_STRING},
1056 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DOS_STRING},
1057 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
1058 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
1059 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
1060 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
1061 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0},
1062 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
1063 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
1064 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
1065 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
1066 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
1068 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
1069 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
1070 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1071 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
1073 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
1074 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1075 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1076 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
1077 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1078 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT},
1079 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE | FLAG_DOS_STRING},
1080 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
1081 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
1082 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0},
1083 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1084 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1085 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
1086 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
1087 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
1088 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1089 {"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1090 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1091 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1093 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1094 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
1095 {"hide local users", P_BOOL, P_GLOBAL, &Globals.bHideLocalUsers, NULL,
1096 NULL, 0},
1098 {"VFS module options", P_SEP, P_SEPARATOR},
1100 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, FLAG_SHARE},
1101 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, FLAG_SHARE},
1103 #ifdef WITH_MSDFS
1104 {"MSDfs options", P_SEP, P_SEPARATOR},
1106 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
1107 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, 0},
1108 #endif
1110 {"Winbind options", P_SEP, P_SEPARATOR},
1112 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_uid, NULL, 0},
1113 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_gid, NULL, 0},
1114 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, 0},
1115 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, 0},
1116 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, 0},
1117 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
1118 {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, 0},
1119 {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, 0},
1120 {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, 0},
1122 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
1126 /***************************************************************************
1127 Initialise the sDefault parameter structure for the printer values.
1128 ***************************************************************************/
1129 static void init_printer_values(void)
1131 string_set(&sDefault.szPrinterDriver, "");
1132 string_set(&sDefault.szDriverFile, DRIVERFILE);
1134 /* choose defaults depending on the type of printing */
1135 switch (sDefault.iPrinting)
1137 case PRINT_BSD:
1138 case PRINT_AIX:
1139 case PRINT_LPRNT:
1140 case PRINT_LPROS2:
1141 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1142 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1143 string_set(&sDefault.szPrintcommand,
1144 "lpr -r -P%p %s");
1145 break;
1147 case PRINT_LPRNG:
1148 case PRINT_PLP:
1149 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1150 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1151 string_set(&sDefault.szPrintcommand,
1152 "lpr -r -P%p %s");
1153 string_set(&sDefault.szQueuepausecommand,
1154 "lpc stop %p");
1155 string_set(&sDefault.szQueueresumecommand,
1156 "lpc start %p");
1157 string_set(&sDefault.szLppausecommand,
1158 "lpc hold %p %j");
1159 string_set(&sDefault.szLpresumecommand,
1160 "lpc release %p %j");
1161 break;
1163 case PRINT_CUPS:
1164 #ifdef HAVE_CUPS
1165 string_set(&sDefault.szLpqcommand, "");
1166 string_set(&sDefault.szLprmcommand, "");
1167 string_set(&sDefault.szPrintcommand, "");
1168 string_set(&sDefault.szLppausecommand, "");
1169 string_set(&sDefault.szLpresumecommand, "");
1170 string_set(&sDefault.szQueuepausecommand, "");
1171 string_set(&sDefault.szQueueresumecommand, "");
1173 string_set(&Globals.szPrintcapname, "cups");
1174 #else
1175 string_set(&sDefault.szLpqcommand,
1176 "/usr/bin/lpstat -o %p");
1177 string_set(&sDefault.szLprmcommand,
1178 "/usr/bin/cancel %p-%j");
1179 string_set(&sDefault.szPrintcommand,
1180 "/usr/bin/lp -d %p %s; rm %s");
1181 string_set(&sDefault.szLppausecommand,
1182 "lp -i %p-%j -H hold");
1183 string_set(&sDefault.szLpresumecommand,
1184 "lp -i %p-%j -H resume");
1185 string_set(&sDefault.szQueuepausecommand,
1186 "/usr/bin/disable %p");
1187 string_set(&sDefault.szQueueresumecommand,
1188 "/usr/bin/enable %p");
1189 string_set(&Globals.szPrintcapname, "lpstat");
1190 #endif /* HAVE_CUPS */
1191 break;
1193 case PRINT_SYSV:
1194 case PRINT_HPUX:
1195 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1196 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1197 string_set(&sDefault.szPrintcommand,
1198 "lp -c -d%p %s; rm %s");
1199 string_set(&sDefault.szQueuepausecommand,
1200 "disable %p");
1201 string_set(&sDefault.szQueueresumecommand,
1202 "enable %p");
1203 #ifndef HPUX
1204 string_set(&sDefault.szLppausecommand,
1205 "lp -i %p-%j -H hold");
1206 string_set(&sDefault.szLpresumecommand,
1207 "lp -i %p-%j -H resume");
1208 #endif /* SYSV */
1209 break;
1211 case PRINT_QNX:
1212 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1213 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1214 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1215 break;
1217 case PRINT_SOFTQ:
1218 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1219 string_set(&sDefault.szLprmcommand,
1220 "qstat -s -j%j -c");
1221 string_set(&sDefault.szPrintcommand,
1222 "lp -d%p -s %s; rm %s");
1223 string_set(&sDefault.szLppausecommand,
1224 "qstat -s -j%j -h");
1225 string_set(&sDefault.szLpresumecommand,
1226 "qstat -s -j%j -r");
1227 break;
1228 #ifdef DEVELOPER
1229 case PRINT_TEST:
1230 case PRINT_VLP:
1231 string_set(&sDefault.szPrintcommand, "vlp print %p %s");
1232 string_set(&sDefault.szLpqcommand, "vlp lpq %p");
1233 string_set(&sDefault.szLprmcommand, "vlp lprm %p %j");
1234 string_set(&sDefault.szLppausecommand, "vlp lppause %p %j");
1235 string_set(&sDefault.szLpresumecommand, "vlp lpresum %p %j");
1236 string_set(&sDefault.szQueuepausecommand, "vlp queuepause %p");
1237 string_set(&sDefault.szQueueresumecommand, "vlp queueresume %p");
1238 break;
1239 #endif /* DEVELOPER */
1244 /***************************************************************************
1245 Initialise the global parameter structure.
1246 ***************************************************************************/
1247 static void init_globals(void)
1249 static BOOL done_init = False;
1250 pstring s;
1252 if (!done_init)
1254 int i;
1255 memset((void *)&Globals, '\0', sizeof(Globals));
1257 for (i = 0; parm_table[i].label; i++)
1258 if ((parm_table[i].type == P_STRING ||
1259 parm_table[i].type == P_USTRING) &&
1260 parm_table[i].ptr)
1261 string_set(parm_table[i].ptr, "");
1263 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
1264 string_set(&sDefault.fstype, FSTYPE_STRING);
1266 init_printer_values();
1268 done_init = True;
1272 DEBUG(3, ("Initialising global parameters\n"));
1274 #ifdef WITH_TDB_SAM
1275 string_set(&Globals.szTDBPasswdFile, TDB_PASSWD_FILE);
1276 #else
1277 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
1278 #endif
1280 /* use the old 'hash' method by default */
1281 string_set(&Globals.szManglingMethod, "hash");
1284 * Allow the default PASSWD_CHAT to be overridden in local.h.
1286 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1287 string_set(&Globals.szWorkGroup, WORKGROUP);
1288 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
1289 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1290 string_set(&Globals.szLockDir, LOCKDIR);
1291 string_set(&Globals.szPidDir, PIDDIR);
1292 #ifdef WITH_UTMP
1293 string_set(&Globals.szUtmpDir, "");
1294 string_set(&Globals.szWtmpDir, "");
1295 Globals.bUtmp = False;
1296 #endif
1297 string_set(&Globals.szSocketAddress, "0.0.0.0");
1298 pstrcpy(s, "Samba ");
1299 pstrcat(s, VERSION);
1300 string_set(&Globals.szServerString, s);
1301 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1302 DEFAULT_MINOR_VERSION);
1303 string_set(&Globals.szAnnounceVersion, s);
1305 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1307 string_set(&Globals.szLogonDrive, "");
1308 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1309 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1310 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1312 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
1313 string_set(&Globals.szCodePageDir, CODEPAGEDIR);
1315 Globals.bLoadPrinters = True;
1316 Globals.bUseRhosts = False;
1317 Globals.mangled_stack = 50;
1318 Globals.max_xmit = 65535;
1319 Globals.max_mux = 50; /* This is *needed* for profile support. */
1320 Globals.lpqcachetime = 10;
1321 Globals.bDisableSpoolss = False;
1322 Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1323 Globals.iTotalPrintJobs = 0; /* no limit specified */
1324 Globals.pwordlevel = 0;
1325 Globals.unamelevel = 0;
1326 Globals.deadtime = 0;
1327 Globals.bLargeReadwrite = False;
1328 Globals.max_log_size = 5000;
1329 Globals.max_open_files = MAX_OPEN_FILES;
1330 Globals.maxprotocol = PROTOCOL_NT1;
1331 Globals.minprotocol = PROTOCOL_CORE;
1332 Globals.security = SEC_USER;
1333 Globals.bEncryptPasswords = False;
1334 Globals.bUpdateEncrypt = False;
1335 Globals.bReadRaw = True;
1336 Globals.bWriteRaw = True;
1337 Globals.bReadPrediction = False;
1338 Globals.bReadbmpx = False;
1339 Globals.bNullPasswords = False;
1340 Globals.bObeyPamRestrictions = False;
1341 Globals.bStripDot = False;
1342 Globals.syslog = 1;
1343 Globals.bSyslogOnly = False;
1344 Globals.bAdminLog = False;
1345 Globals.bTimestampLogs = True;
1346 Globals.bDebugHiresTimestamp = False;
1347 Globals.bDebugPid = False;
1348 Globals.bDebugUid = False;
1349 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1350 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1351 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1352 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1353 Globals.change_notify_timeout = 60; /* 1 minute default. */
1354 Globals.ReadSize = 16 * 1024;
1355 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1356 Globals.lm_interval = 60;
1357 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1358 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1359 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1360 Globals.bNISHomeMap = False;
1361 #ifdef WITH_NISPLUS_HOME
1362 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1363 #else
1364 string_set(&Globals.szNISHomeMapName, "auto.home");
1365 #endif
1366 #endif
1367 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
1368 Globals.bTimeServer = False;
1369 Globals.bBindInterfacesOnly = False;
1370 Globals.bUnixPasswdSync = False;
1371 Globals.bPamPasswordChange = False;
1372 Globals.bPasswdChatDebug = False;
1373 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
1374 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1375 Globals.bStatCache = True; /* use stat cache by default */
1376 Globals.bNTStatusSupport = True; /* Use NT status by default. */
1377 Globals.bRestrictAnonymous = False;
1378 Globals.bLanmanAuth = True; /* Do use the LanMan hash if it is available */
1379 Globals.map_to_guest = 0; /* By Default, "Never" */
1380 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1381 Globals.oplock_break_wait_time = 0; /* By Default, 0 msecs. */
1382 Globals.enhanced_browsing = True;
1383 Globals.iLockSpinCount = 3; /* Try 2 times. */
1384 Globals.iLockSpinTime = 10; /* usec. */
1385 #ifdef MMAP_BLACKLIST
1386 Globals.bUseMmap = False;
1387 #else
1388 Globals.bUseMmap = True;
1389 #endif
1390 Globals.bUnixExtensions = False;
1392 #ifdef WITH_SSL
1393 Globals.sslVersion = SMB_SSL_V23;
1394 string_set(&Globals.sslHostsRequire, "");
1395 string_set(&Globals.sslHostsResign, "");
1396 string_set(&Globals.sslCaCertDir, "");
1397 string_set(&Globals.sslCaCertFile, "");
1398 string_set(&Globals.sslServerCert, "");
1399 string_set(&Globals.sslServerPrivKey, "");
1400 string_set(&Globals.sslClientCert, "");
1401 string_set(&Globals.sslClientPrivKey, "");
1402 string_set(&Globals.sslCiphers, "");
1403 string_set(&Globals.sslEgdSocket, "");
1404 string_set(&Globals.sslEntropyFile, "");
1405 Globals.sslEntropyBytes = 256;
1406 Globals.sslEnabled = False;
1407 Globals.sslReqClientCert = False;
1408 Globals.sslReqServerCert = False;
1409 Globals.sslCompatibility = False;
1410 #endif /* WITH_SSL */
1412 #ifdef WITH_LDAP_SAM
1413 string_set(&Globals.szLdapServer, "localhost");
1414 string_set(&Globals.szLdapSuffix, "");
1415 string_set(&Globals.szLdapFilter, "(&(uid=%u)(objectclass=sambaAccount))");
1416 string_set(&Globals.szLdapAdminDn, "");
1417 Globals.ldap_port = 636;
1418 Globals.ldap_ssl = LDAP_SSL_ON;
1419 #endif /* WITH_LDAP_SAM */
1420 /* these parameters are set to defaults that are more appropriate
1421 for the increasing samba install base:
1423 as a member of the workgroup, that will possibly become a
1424 _local_ master browser (lm = True). this is opposed to a forced
1425 local master browser startup (pm = True).
1427 doesn't provide WINS server service by default (wsupp = False),
1428 and doesn't provide domain master browser services by default, either.
1432 Globals.bMsAddPrinterWizard = True;
1433 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1434 Globals.os_level = 20;
1435 Globals.bLocalMaster = True;
1436 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1437 Globals.bDomainLogons = False;
1438 Globals.bBrowseList = True;
1439 Globals.bWINSsupport = False;
1440 Globals.bWINSproxy = False;
1442 Globals.bDNSproxy = True;
1444 /* this just means to use them if they exist */
1445 Globals.bKernelOplocks = True;
1447 Globals.bAllowTrustedDomains = True;
1449 string_set(&Globals.szTemplateShell, "/bin/false");
1450 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1451 string_set(&Globals.szWinbindSeparator, "\\");
1452 Globals.winbind_cache_time = 15;
1454 Globals.bWinbindEnumUsers = True;
1455 Globals.bWinbindEnumGroups = True;
1456 Globals.bWinbindUseDefaultDomain = False;
1458 Globals.bHostMSDfs = False;
1460 Globals.name_cache_timeout = 660; /* In seconds */
1463 * This must be done last as it checks the value in
1464 * client_code_page.
1467 interpret_coding_system(KANJI);
1470 static TALLOC_CTX *lp_talloc;
1472 /******************************************************************* a
1473 free up temporary memory - called from the main loop
1474 ********************************************************************/
1475 void lp_talloc_free(void)
1477 if (!lp_talloc)
1478 return;
1479 talloc_destroy(lp_talloc);
1480 lp_talloc = NULL;
1483 /*******************************************************************
1484 convenience routine to grab string parameters into temporary memory
1485 and run standard_sub_basic on them. The buffers can be written to by
1486 callers without affecting the source string.
1487 ********************************************************************/
1488 static char *lp_string(const char *s)
1490 size_t len = s ? strlen(s) : 0;
1491 char *ret;
1493 if (!lp_talloc)
1494 lp_talloc = talloc_init();
1496 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1498 if (!ret)
1499 return NULL;
1501 if (!s)
1502 *ret = 0;
1503 else
1504 StrnCpy(ret, s, len);
1506 trim_string(ret, "\"", "\"");
1508 standard_sub_basic(ret, len + 100);
1509 return (ret);
1514 In this section all the functions that are used to access the
1515 parameters from the rest of the program are defined
1518 #define FN_GLOBAL_STRING(fn_name,ptr) \
1519 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1520 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1521 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1522 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1523 char fn_name(void) {return(*(char *)(ptr));}
1524 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1525 int fn_name(void) {return(*(int *)(ptr));}
1527 #define FN_LOCAL_STRING(fn_name,val) \
1528 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1529 #define FN_LOCAL_CONST_STRING(fn_name,val) \
1530 const char *fn_name(int i) {return(const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1531 #define FN_LOCAL_BOOL(fn_name,val) \
1532 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1533 #define FN_LOCAL_CHAR(fn_name,val) \
1534 char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1535 #define FN_LOCAL_INTEGER(fn_name,val) \
1536 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1538 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1539 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1540 #ifdef WITH_TDB_SAM
1541 FN_GLOBAL_STRING(lp_tdb_passwd_file, &Globals.szTDBPasswdFile)
1542 #else
1543 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1544 #endif
1545 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1546 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1547 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1548 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1549 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1550 FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
1551 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1552 FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
1553 #ifdef WITH_UTMP
1554 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1555 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1556 FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
1557 #endif
1558 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1559 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1560 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1561 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1562 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1563 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1564 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1565 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1566 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1567 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1568 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1569 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1570 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1571 #ifdef USING_GROUPNAME_MAP
1572 FN_GLOBAL_STRING(lp_groupname_map, &Globals.szGroupnameMap)
1573 #endif /* USING_GROUPNAME_MAP */
1574 FN_GLOBAL_STRING(lp_logon_script, &Globals.szLogonScript)
1575 FN_GLOBAL_STRING(lp_logon_path, &Globals.szLogonPath)
1576 FN_GLOBAL_STRING(lp_logon_drive, &Globals.szLogonDrive)
1577 FN_GLOBAL_STRING(lp_logon_home, &Globals.szLogonHome)
1578 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1579 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1580 FN_GLOBAL_STRING(lp_wins_server, &Globals.szWINSserver)
1581 FN_GLOBAL_STRING(lp_interfaces, &Globals.szInterfaces)
1582 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1583 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1584 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1585 FN_GLOBAL_STRING(lp_netbios_aliases, &Globals.szNetbiosAliases)
1586 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1587 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1588 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1589 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1590 FN_GLOBAL_STRING(lp_domain_admin_group, &Globals.szDomainAdminGroup)
1591 FN_GLOBAL_STRING(lp_domain_guest_group, &Globals.szDomainGuestGroup)
1592 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1593 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1594 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1595 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1596 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1597 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
1598 FN_GLOBAL_STRING(lp_codepagedir,&Globals.szCodePageDir)
1599 #ifdef WITH_LDAP_SAM
1600 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer)
1601 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1602 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter)
1603 FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
1604 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1605 FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
1606 #endif /* WITH_LDAP_SAM */
1607 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
1608 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
1609 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
1610 FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
1612 #ifdef WITH_SSL
1613 FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion)
1614 FN_GLOBAL_STRING(lp_ssl_hosts, &Globals.sslHostsRequire)
1615 FN_GLOBAL_STRING(lp_ssl_hosts_resign, &Globals.sslHostsResign)
1616 FN_GLOBAL_STRING(lp_ssl_cacertdir, &Globals.sslCaCertDir)
1617 FN_GLOBAL_STRING(lp_ssl_cacertfile, &Globals.sslCaCertFile)
1618 FN_GLOBAL_STRING(lp_ssl_server_cert, &Globals.sslServerCert)
1619 FN_GLOBAL_STRING(lp_ssl_server_privkey, &Globals.sslServerPrivKey)
1620 FN_GLOBAL_STRING(lp_ssl_client_cert, &Globals.sslClientCert)
1621 FN_GLOBAL_STRING(lp_ssl_client_privkey, &Globals.sslClientPrivKey)
1622 FN_GLOBAL_STRING(lp_ssl_ciphers, &Globals.sslCiphers)
1623 FN_GLOBAL_STRING(lp_ssl_egdsocket, &Globals.sslEgdSocket)
1624 FN_GLOBAL_STRING(lp_ssl_entropyfile, &Globals.sslEntropyFile)
1625 FN_GLOBAL_INTEGER(lp_ssl_entropybytes, &Globals.sslEntropyBytes)
1626 FN_GLOBAL_BOOL(lp_ssl_enabled, &Globals.sslEnabled)
1627 FN_GLOBAL_BOOL(lp_ssl_reqClientCert, &Globals.sslReqClientCert)
1628 FN_GLOBAL_BOOL(lp_ssl_reqServerCert, &Globals.sslReqServerCert)
1629 FN_GLOBAL_BOOL(lp_ssl_compatibility, &Globals.sslCompatibility)
1630 #endif /* WITH_SSL */
1632 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1633 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1634 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1635 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1636 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1637 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1638 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1639 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1640 FN_GLOBAL_BOOL(lp_use_rhosts, &Globals.bUseRhosts)
1641 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1642 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1643 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1644 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1645 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1646 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1647 FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
1648 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1649 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1650 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1651 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1652 FN_GLOBAL_BOOL(lp_admin_log, &Globals.bAdminLog)
1653 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1654 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1655 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1656 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1657 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1658 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1659 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1660 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1661 FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
1662 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1663 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1664 FN_GLOBAL_BOOL(lp_nt_smb_support, &Globals.bNTSmbSupport)
1665 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1666 FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
1667 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1668 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1669 FN_GLOBAL_BOOL(lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1670 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1671 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1672 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1673 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1674 FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
1675 FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
1676 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1677 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1678 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1679 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1680 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1681 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1682 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1683 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1684 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1685 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1686 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1687 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1688 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1689 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1690 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1691 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1692 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1693 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
1694 FN_GLOBAL_INTEGER(lp_disable_spoolss, &Globals.bDisableSpoolss)
1695 FN_GLOBAL_INTEGER(lp_totalprintjobs, &Globals.iTotalPrintJobs)
1696 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1697 FN_GLOBAL_INTEGER(lp_client_code_page, &Globals.client_code_page)
1698 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1699 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1700 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1701 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1702 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1703 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1704 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1705 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1706 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1707 FN_GLOBAL_INTEGER(lp_lock_spin_count, &Globals.iLockSpinCount)
1708 FN_GLOBAL_INTEGER(lp_lock_sleep_time, &Globals.iLockSpinTime)
1709 FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
1710 FN_LOCAL_STRING(lp_preexec, szPreExec)
1711 FN_LOCAL_STRING(lp_postexec, szPostExec)
1712 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1713 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1714 FN_LOCAL_STRING(lp_servicename, szService)
1715 FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
1716 FN_LOCAL_STRING(lp_pathname, szPath)
1717 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1718 FN_LOCAL_STRING(lp_username, szUsername)
1719 FN_LOCAL_STRING(lp_guestaccount, szGuestaccount)
1720 FN_LOCAL_STRING(lp_invalid_users, szInvalidUsers)
1721 FN_LOCAL_STRING(lp_valid_users, szValidUsers)
1722 FN_LOCAL_STRING(lp_admin_users, szAdminUsers)
1723 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1724 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1725 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1726 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1727 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1728 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1729 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1730 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1731 FN_LOCAL_STRING(lp_driverfile, szDriverFile)
1732 FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)
1733 FN_LOCAL_STRING(lp_hostsallow, szHostsallow)
1734 FN_LOCAL_STRING(lp_hostsdeny, szHostsdeny)
1735 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1736 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1737 FN_LOCAL_STRING(lp_comment, comment)
1738 FN_LOCAL_STRING(lp_force_user, force_user)
1739 FN_LOCAL_STRING(lp_force_group, force_group)
1740 FN_LOCAL_STRING(lp_readlist, readlist)
1741 FN_LOCAL_STRING(lp_writelist, writelist)
1742 FN_LOCAL_STRING(lp_printer_admin, printer_admin)
1743 FN_LOCAL_STRING(lp_fstype, fstype)
1744 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1745 FN_LOCAL_STRING(lp_vfs_options, szVfsOptions)
1746 static FN_LOCAL_STRING(lp_volume, volume)
1747 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1748 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1749 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1750 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1751 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
1752 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1753 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1754 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1755 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1756 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1757 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1758 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1759 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1760 FN_LOCAL_BOOL(lp_status, status)
1761 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1762 FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
1763 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1764 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1765 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1766 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1767 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1768 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1769 FN_LOCAL_BOOL(lp_postscript, bPostscript)
1770 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1771 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1772 FN_LOCAL_BOOL(lp_locking, bLocking)
1773 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1774 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1775 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1776 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1777 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1778 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1779 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1780 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1781 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1782 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1783 FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
1784 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1785 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1786 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1787 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1788 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1789 FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
1790 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1791 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1792 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1793 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1794 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1795 FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
1796 FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
1797 FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
1798 FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
1799 FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
1800 #ifdef WITH_SENDFILE
1801 FN_LOCAL_BOOL(lp_use_sendfile, bUseSendfile)
1802 #endif
1803 FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
1804 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1805 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1806 FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
1807 FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
1808 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1809 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1810 FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
1811 FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
1812 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1813 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1814 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1815 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1816 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1817 FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
1818 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1819 FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
1820 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1821 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1822 FN_GLOBAL_BOOL(lp_hide_local_users, &Globals.bHideLocalUsers)
1824 /* local prototypes */
1826 static int map_parameter(char *pszParmName);
1827 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1828 static int getservicebyname(char *pszServiceName,
1829 service * pserviceDest);
1830 static void copy_service(service * pserviceDest,
1831 service * pserviceSource, BOOL *pcopymapDest);
1832 static BOOL service_ok(int iService);
1833 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1834 static BOOL do_section(char *pszSectionName);
1835 static void init_copymap(service * pservice);
1838 /***************************************************************************
1839 initialise a service to the defaults
1840 ***************************************************************************/
1841 static void init_service(service * pservice)
1843 memset((char *)pservice, '\0', sizeof(service));
1844 copy_service(pservice, &sDefault, NULL);
1848 /***************************************************************************
1849 free the dynamically allocated parts of a service struct
1850 ***************************************************************************/
1851 static void free_service(service * pservice)
1853 int i;
1854 if (!pservice)
1855 return;
1857 if (pservice->szService)
1858 DEBUG(5,
1859 ("free_service: Freeing service %s\n",
1860 pservice->szService));
1862 string_free(&pservice->szService);
1863 SAFE_FREE(pservice->copymap);
1865 for (i = 0; parm_table[i].label; i++)
1866 if ((parm_table[i].type == P_STRING ||
1867 parm_table[i].type == P_USTRING) &&
1868 parm_table[i].class == P_LOCAL)
1869 string_free((char **)
1870 (((char *)pservice) +
1871 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1873 ZERO_STRUCTP(pservice);
1876 /***************************************************************************
1877 add a new service to the services array initialising it with the given
1878 service. name must be in DOS codepage.
1879 ***************************************************************************/
1880 static int add_a_service(service * pservice, char *name)
1882 int i;
1883 service tservice;
1884 int num_to_alloc = iNumServices + 1;
1886 tservice = *pservice;
1888 /* it might already exist */
1890 if (name)
1892 i = getservicebyname(name, NULL);
1893 if (i >= 0)
1894 return (i);
1897 /* find an invalid one */
1898 for (i = 0; i < iNumServices; i++)
1899 if (!ServicePtrs[i]->valid)
1900 break;
1902 /* if not, then create one */
1903 if (i == iNumServices)
1905 service **tsp;
1907 #ifdef __INSURE__
1908 service **oldservices = iNumServices ? malloc(sizeof(service *) * iNumServices) : NULL;
1910 if (iNumServices)
1911 memcpy(oldservices, ServicePtrs, sizeof(service *) * iNumServices);
1912 #endif
1914 tsp = (service **) Realloc(ServicePtrs,
1915 sizeof(service *) *
1916 num_to_alloc);
1918 if (!tsp) {
1919 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
1920 return (-1);
1921 } else {
1922 ServicePtrs = tsp;
1923 ServicePtrs[iNumServices] =
1924 (service *) malloc(sizeof(service));
1927 #ifdef __INSURE__
1928 if (iNumServices && (memcmp(oldservices, ServicePtrs, sizeof(service *) * iNumServices) != 0)) {
1929 smb_panic("add_a_service: Realloc corrupted ptrs...\n");
1931 safe_free(oldservices);
1932 #endif
1934 if (!ServicePtrs[iNumServices])
1935 return (-1);
1937 iNumServices++;
1939 else
1940 free_service(ServicePtrs[i]);
1942 ServicePtrs[i]->valid = True;
1944 init_service(ServicePtrs[i]);
1945 copy_service(ServicePtrs[i], &tservice, NULL);
1946 if (name)
1948 string_set(&ServicePtrs[i]->szService, name);
1950 return (i);
1953 /***************************************************************************
1954 add a new home service, with the specified home directory, defaults coming
1955 from service ifrom. homename must be in DOS codepage.
1956 ***************************************************************************/
1957 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1959 int i;
1961 i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
1963 if (i < 0)
1964 return (False);
1966 if (!(*(ServicePtrs[i]->szPath))
1967 || strequal(ServicePtrs[i]->szPath, lp_pathname(-1)))
1968 string_set(&ServicePtrs[i]->szPath, pszHomedir);
1969 if (!(*(ServicePtrs[i]->comment)))
1971 pstring comment;
1972 slprintf(comment, sizeof(comment) - 1,
1973 "Home directory of %s", pszHomename);
1974 string_set(&ServicePtrs[i]->comment, comment);
1976 ServicePtrs[i]->bAvailable = sDefault.bAvailable;
1977 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1979 DEBUG(3,
1980 ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1982 return (True);
1985 /***************************************************************************
1986 add a new service, based on an old one. pszService must be in DOS codepage.
1987 ***************************************************************************/
1988 int lp_add_service(char *pszService, int iDefaultService)
1990 return (add_a_service(ServicePtrs[iDefaultService], pszService));
1994 /***************************************************************************
1995 add the IPC service
1996 ***************************************************************************/
1997 static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok)
1999 pstring comment;
2000 int i = add_a_service(&sDefault, ipc_name);
2002 if (i < 0)
2003 return (False);
2005 slprintf(comment, sizeof(comment) - 1,
2006 "IPC Service (%s)", Globals.szServerString);
2008 string_set(&ServicePtrs[i]->szPath, tmpdir());
2009 string_set(&ServicePtrs[i]->szUsername, "");
2010 string_set(&ServicePtrs[i]->comment, comment);
2011 string_set(&ServicePtrs[i]->fstype, "IPC");
2012 ServicePtrs[i]->status = False;
2013 ServicePtrs[i]->iMaxConnections = 0;
2014 ServicePtrs[i]->bAvailable = True;
2015 ServicePtrs[i]->bRead_only = True;
2016 ServicePtrs[i]->bGuest_only = False;
2017 ServicePtrs[i]->bGuest_ok = guest_ok;
2018 ServicePtrs[i]->bPrint_ok = False;
2019 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2021 DEBUG(3, ("adding IPC service %s\n", ipc_name));
2023 return (True);
2027 /***************************************************************************
2028 add a new printer service, with defaults coming from service iFrom.
2029 printername must be in DOS codepage.
2030 ***************************************************************************/
2031 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
2033 char *comment = "From Printcap";
2034 int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
2036 if (i < 0)
2037 return (False);
2039 /* note that we do NOT default the availability flag to True - */
2040 /* we take it from the default service passed. This allows all */
2041 /* dynamic printers to be disabled by disabling the [printers] */
2042 /* entry (if/when the 'available' keyword is implemented!). */
2044 /* the printer name is set to the service name. */
2045 string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
2046 string_set(&ServicePtrs[i]->comment, comment);
2047 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2048 /* Printers cannot be read_only. */
2049 ServicePtrs[i]->bRead_only = False;
2050 /* No oplocks on printer services. */
2051 ServicePtrs[i]->bOpLocks = False;
2052 /* Printer services must be printable. */
2053 ServicePtrs[i]->bPrint_ok = True;
2055 DEBUG(3, ("adding printer service %s\n", pszPrintername));
2057 return (True);
2060 /***************************************************************************
2061 Map a parameter's string representation to something we can use.
2062 Returns False if the parameter string is not recognised, else TRUE.
2063 ***************************************************************************/
2064 static int map_parameter(char *pszParmName)
2066 int iIndex;
2068 if (*pszParmName == '-')
2069 return (-1);
2071 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
2072 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
2073 return (iIndex);
2075 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
2076 return (-1);
2080 /***************************************************************************
2081 Set a boolean variable from the text value stored in the passed string.
2082 Returns True in success, False if the passed string does not correctly
2083 represent a boolean.
2084 ***************************************************************************/
2085 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
2087 BOOL bRetval;
2089 bRetval = True;
2090 if (strwicmp(pszParmValue, "yes") == 0 ||
2091 strwicmp(pszParmValue, "true") == 0 ||
2092 strwicmp(pszParmValue, "1") == 0)
2093 *pb = True;
2094 else
2095 if (strwicmp(pszParmValue, "no") == 0 ||
2096 strwicmp(pszParmValue, "False") == 0 ||
2097 strwicmp(pszParmValue, "0") == 0)
2098 *pb = False;
2099 else
2101 DEBUG(0,
2102 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
2103 pszParmValue));
2104 bRetval = False;
2106 return (bRetval);
2109 /***************************************************************************
2110 Find a service by name. Otherwise works like get_service.
2111 ***************************************************************************/
2112 static int getservicebyname(char *pszServiceName, service * pserviceDest)
2114 int iService;
2116 for (iService = iNumServices - 1; iService >= 0; iService--)
2117 if (VALID(iService) &&
2118 strwicmp(ServicePtrs[iService]->szService, pszServiceName) == 0)
2120 if (pserviceDest != NULL)
2121 copy_service(pserviceDest, ServicePtrs[iService], NULL);
2122 break;
2125 return (iService);
2130 /***************************************************************************
2131 Copy a service structure to another
2133 If pcopymapDest is NULL then copy all fields
2134 ***************************************************************************/
2135 static void copy_service(service * pserviceDest,
2136 service * pserviceSource, BOOL *pcopymapDest)
2138 int i;
2139 BOOL bcopyall = (pcopymapDest == NULL);
2141 for (i = 0; parm_table[i].label; i++)
2142 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
2143 (bcopyall || pcopymapDest[i]))
2145 void *def_ptr = parm_table[i].ptr;
2146 void *src_ptr =
2147 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
2148 &sDefault);
2149 void *dest_ptr =
2150 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
2151 &sDefault);
2153 switch (parm_table[i].type)
2155 case P_BOOL:
2156 case P_BOOLREV:
2157 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
2158 break;
2160 case P_INTEGER:
2161 case P_ENUM:
2162 case P_OCTAL:
2163 *(int *)dest_ptr = *(int *)src_ptr;
2164 break;
2166 case P_CHAR:
2167 *(char *)dest_ptr = *(char *)src_ptr;
2168 break;
2170 case P_STRING:
2171 string_set(dest_ptr,
2172 *(char **)src_ptr);
2173 break;
2175 case P_USTRING:
2176 string_set(dest_ptr,
2177 *(char **)src_ptr);
2178 strupper(*(char **)dest_ptr);
2179 break;
2180 default:
2181 break;
2185 if (bcopyall)
2187 init_copymap(pserviceDest);
2188 if (pserviceSource->copymap)
2189 memcpy((void *)pserviceDest->copymap,
2190 (void *)pserviceSource->copymap,
2191 sizeof(BOOL) * NUMPARAMETERS);
2195 /***************************************************************************
2196 Check a service for consistency. Return False if the service is in any way
2197 incomplete or faulty, else True.
2198 ***************************************************************************/
2199 static BOOL service_ok(int iService)
2201 BOOL bRetval;
2203 bRetval = True;
2204 if (ServicePtrs[iService]->szService[0] == '\0')
2206 DEBUG(0,
2207 ("The following message indicates an internal error:\n"));
2208 DEBUG(0, ("No service name in service entry.\n"));
2209 bRetval = False;
2212 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2213 /* I can't see why you'd want a non-printable printer service... */
2214 if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
2215 if (!ServicePtrs[iService]->bPrint_ok) {
2216 DEBUG(0,
2217 ("WARNING: [%s] service MUST be printable!\n",
2218 ServicePtrs[iService]->szService));
2219 ServicePtrs[iService]->bPrint_ok = True;
2221 /* [printers] service must also be non-browsable. */
2222 if (ServicePtrs[iService]->bBrowseable)
2223 ServicePtrs[iService]->bBrowseable = False;
2226 if (ServicePtrs[iService]->szPath[0] == '\0' &&
2227 strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0)
2229 DEBUG(0,
2230 ("No path in service %s - using %s\n",
2231 ServicePtrs[iService]->szService, tmpdir()));
2232 string_set(&ServicePtrs[iService]->szPath, tmpdir());
2235 /* If a service is flagged unavailable, log the fact at level 0. */
2236 if (!ServicePtrs[iService]->bAvailable)
2237 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2238 ServicePtrs[iService]->szService));
2240 return (bRetval);
2243 static struct file_lists
2245 struct file_lists *next;
2246 char *name;
2247 char *subfname;
2248 time_t modtime;
2249 } *file_lists = NULL;
2251 /*******************************************************************
2252 keep a linked list of all config files so we know when one has changed
2253 it's date and needs to be reloaded
2254 ********************************************************************/
2255 static void add_to_file_list(char *fname, char *subfname)
2257 struct file_lists *f = file_lists;
2259 while (f) {
2260 if (f->name && !strcmp(f->name, fname))
2261 break;
2262 f = f->next;
2265 if (!f) {
2266 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2267 if (!f)
2268 return;
2269 f->next = file_lists;
2270 f->name = strdup(fname);
2271 if (!f->name) {
2272 SAFE_FREE(f);
2273 return;
2275 f->subfname = strdup(subfname);
2276 if (!f->subfname) {
2277 SAFE_FREE(f);
2278 return;
2280 file_lists = f;
2281 f->modtime = file_modtime(subfname);
2282 } else {
2283 time_t t = file_modtime(subfname);
2284 if (t)
2285 f->modtime = t;
2289 /*******************************************************************
2290 check if a config file has changed date
2291 ********************************************************************/
2292 BOOL lp_file_list_changed(void)
2294 struct file_lists *f = file_lists;
2295 DEBUG(6, ("lp_file_list_changed()\n"));
2297 while (f) {
2298 pstring n2;
2299 time_t mod_time;
2301 pstrcpy(n2, f->name);
2302 standard_sub_basic(n2,sizeof(n2));
2304 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2305 f->name, n2, ctime(&f->modtime)));
2307 mod_time = file_modtime(n2);
2309 if (mod_time && ((f->modtime != mod_time) || (f->subfname == NULL) || (strcmp(n2, f->subfname) != 0))) {
2310 DEBUGADD(6, ("file %s modified: %s\n", n2, ctime(&mod_time)));
2311 f->modtime = mod_time;
2312 SAFE_FREE(f->subfname);
2313 f->subfname = strdup(n2);
2314 return (True);
2316 f = f->next;
2318 return (False);
2321 /***************************************************************************
2322 Run standard_sub_basic on netbios name... needed because global_myname
2323 is not accessed through any lp_ macro.
2324 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2325 ***************************************************************************/
2327 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2329 pstring netbios_name;
2331 pstrcpy(netbios_name, pszParmValue);
2333 standard_sub_basic(netbios_name,sizeof(netbios_name));
2334 strupper(netbios_name);
2337 * Convert from UNIX to DOS string - the UNIX to DOS converter
2338 * isn't called on the special handlers.
2340 unix_to_dos(netbios_name);
2341 pstrcpy(global_myname, netbios_name);
2343 DEBUG(4,
2344 ("handle_netbios_name: set global_myname to: %s\n",
2345 global_myname));
2347 return (True);
2350 /***************************************************************************
2351 Do the work of sourcing in environment variable/value pairs.
2352 ***************************************************************************/
2354 static BOOL source_env(char **lines)
2356 char *varval;
2357 size_t len;
2358 int i;
2359 char *p;
2361 for (i = 0; lines[i]; i++)
2363 char *line = lines[i];
2365 if ((len = strlen(line)) == 0)
2366 continue;
2368 if (line[len - 1] == '\n')
2369 line[--len] = '\0';
2371 if ((varval = malloc(len + 1)) == NULL)
2373 DEBUG(0, ("source_env: Not enough memory!\n"));
2374 return (False);
2377 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2378 strncpy(varval, line, len);
2379 varval[len] = '\0';
2381 p = strchr(line, (int)'=');
2382 if (p == NULL)
2384 DEBUG(4, ("source_env: missing '=': %s\n", line));
2385 continue;
2388 if (putenv(varval))
2390 DEBUG(0,
2391 ("source_env: Failed to put environment variable %s\n",
2392 varval));
2393 continue;
2396 *p = '\0';
2397 p++;
2398 DEBUG(4,
2399 ("source_env: getting var %s = %s\n", line,
2400 getenv(line)));
2403 DEBUG(4, ("source_env: returning successfully\n"));
2404 return (True);
2407 /***************************************************************************
2408 Handle the source environment operation
2409 ***************************************************************************/
2411 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2413 pstring fname;
2414 char *p = fname;
2415 BOOL result;
2416 char **lines;
2418 pstrcpy(fname, pszParmValue);
2420 standard_sub_basic(fname,sizeof(fname));
2422 string_set(ptr, pszParmValue);
2424 DEBUG(4, ("handle_source_env: checking env type\n"));
2427 * Filename starting with '|' means popen and read from stdin.
2430 if (*p == '|')
2432 lines = file_lines_pload(p + 1, NULL, True);
2434 else
2436 lines = file_lines_load(fname, NULL, True);
2439 if (!lines)
2441 DEBUG(0,
2442 ("handle_source_env: Failed to open file %s, Error was %s\n",
2443 fname, strerror(errno)));
2444 return (False);
2447 result = source_env(lines);
2448 file_lines_free(lines);
2450 return (result);
2453 /***************************************************************************
2454 handle the interpretation of the vfs object parameter
2455 *************************************************************************/
2456 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2458 /* Set string value */
2460 string_set(ptr, pszParmValue);
2462 /* Do any other initialisation required for vfs. Note that
2463 anything done here may have linking repercussions in nmbd. */
2465 return True;
2468 /***************************************************************************
2469 handle the interpretation of the coding system parameter
2470 *************************************************************************/
2471 static BOOL handle_coding_system(char *pszParmValue, char **ptr)
2473 string_set(ptr, pszParmValue);
2474 interpret_coding_system(pszParmValue);
2475 return (True);
2478 /***************************************************************************
2479 Handle the interpretation of the character set system parameter.
2480 ***************************************************************************/
2482 static char *saved_character_set = NULL;
2484 static BOOL handle_character_set(char *pszParmValue, char **ptr)
2486 /* A dependency here is that the parameter client code page should be
2487 set before this is called.
2489 string_set(ptr, pszParmValue);
2490 strupper(*ptr);
2491 saved_character_set = strdup(*ptr);
2492 interpret_character_set(*ptr, lp_client_code_page());
2493 return (True);
2496 /***************************************************************************
2497 Handle the interpretation of the client code page parameter.
2498 We handle this separately so that we can reset the character set
2499 parameter in case this came before 'client code page' in the smb.conf.
2500 ***************************************************************************/
2502 static BOOL handle_client_code_page(char *pszParmValue, char **ptr)
2504 Globals.client_code_page = atoi(pszParmValue);
2505 if (saved_character_set != NULL)
2506 interpret_character_set(saved_character_set,
2507 lp_client_code_page());
2508 codepage_initialise(lp_client_code_page());
2509 return (True);
2512 /***************************************************************************
2513 handle the valid chars lines
2514 ***************************************************************************/
2516 static BOOL handle_valid_chars(char *pszParmValue, char **ptr)
2518 string_set(ptr, pszParmValue);
2520 /* A dependency here is that the parameter client code page must be
2521 set before this is called - as calling codepage_initialise()
2522 would overwrite the valid char lines.
2524 codepage_initialise(lp_client_code_page());
2526 add_char_string(pszParmValue);
2527 return (True);
2530 /***************************************************************************
2531 handle the include operation
2532 ***************************************************************************/
2534 static BOOL handle_include(char *pszParmValue, char **ptr)
2536 pstring fname;
2537 pstrcpy(fname, pszParmValue);
2539 standard_sub_basic(fname,sizeof(fname));
2541 add_to_file_list(pszParmValue, fname);
2543 string_set(ptr, fname);
2545 if (file_exist(fname, NULL))
2546 return (pm_process(fname, do_section, do_parameter));
2548 DEBUG(2, ("Can't find include file %s\n", fname));
2550 return (False);
2554 /***************************************************************************
2555 handle the interpretation of the copy parameter
2556 ***************************************************************************/
2557 static BOOL handle_copy(char *pszParmValue, char **ptr)
2559 BOOL bRetval;
2560 int iTemp;
2561 service serviceTemp;
2563 string_set(ptr, pszParmValue);
2565 init_service(&serviceTemp);
2567 bRetval = False;
2569 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2571 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2573 if (iTemp == iServiceIndex)
2575 DEBUG(0,
2576 ("Can't copy service %s - unable to copy self!\n",
2577 pszParmValue));
2579 else
2581 copy_service(ServicePtrs[iServiceIndex],
2582 &serviceTemp,
2583 ServicePtrs[iServiceIndex]->copymap);
2584 bRetval = True;
2587 else
2589 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2590 pszParmValue));
2591 bRetval = False;
2594 free_service(&serviceTemp);
2595 return (bRetval);
2598 /***************************************************************************
2599 Handle winbind uid and gid allocation parameters. The format of these
2600 parameters is:
2602 [global]
2604 winbind uid = 1000-1999
2605 winbind gid = 700-899
2607 We only do simple parsing checks here. The strings are parsed into useful
2608 structures in the winbind daemon code.
2610 ***************************************************************************/
2612 /* Some lp_ routines to return winbind [ug]id information */
2614 static uid_t winbind_uid_low, winbind_uid_high;
2615 static gid_t winbind_gid_low, winbind_gid_high;
2617 BOOL lp_winbind_uid(uid_t *low, uid_t *high)
2619 if (winbind_uid_low == 0 || winbind_uid_high == 0)
2620 return False;
2622 if (low)
2623 *low = winbind_uid_low;
2625 if (high)
2626 *high = winbind_uid_high;
2628 return True;
2631 BOOL lp_winbind_gid(gid_t *low, gid_t *high)
2633 if (winbind_gid_low == 0 || winbind_gid_high == 0)
2634 return False;
2636 if (low)
2637 *low = winbind_gid_low;
2639 if (high)
2640 *high = winbind_gid_high;
2642 return True;
2645 /* Do some simple checks on "winbind [ug]id" parameter values */
2647 static BOOL handle_winbind_uid(char *pszParmValue, char **ptr)
2649 unsigned int low, high;
2651 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2652 return False;
2654 /* Parse OK */
2656 string_set(ptr, pszParmValue);
2658 winbind_uid_low = (uid_t)low;
2659 winbind_uid_high = (uid_t)high;
2661 return True;
2664 static BOOL handle_winbind_gid(char *pszParmValue, char **ptr)
2666 unsigned int low, high;
2668 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2669 return False;
2671 /* Parse OK */
2673 string_set(ptr, pszParmValue);
2675 winbind_gid_low = (gid_t)low;
2676 winbind_gid_high = (gid_t)high;
2678 return True;
2681 /***************************************************************************
2682 Handle the WINS SERVER list.
2683 ***************************************************************************/
2685 static BOOL handle_wins_server_list( char *pszParmValue, char **ptr )
2687 if( !wins_srv_load_list( pszParmValue ) )
2688 return( False ); /* Parse failed. */
2690 string_set( ptr, pszParmValue );
2691 return( True );
2694 /***************************************************************************
2695 Handle the DEBUG level list.
2696 ***************************************************************************/
2698 static BOOL handle_debug_list( char *pszParmValueIn, char **ptr )
2700 pstring pszParmValue;
2702 pstrcpy(pszParmValue, pszParmValueIn);
2703 return debug_parse_levels( pszParmValue );
2707 /***************************************************************************
2708 Initialise a copymap.
2709 ***************************************************************************/
2711 static void init_copymap(service * pservice)
2713 int i;
2714 SAFE_FREE(pservice->copymap);
2715 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2716 if (!pservice->copymap)
2717 DEBUG(0,
2718 ("Couldn't allocate copymap!! (size %d)\n",
2719 (int)NUMPARAMETERS));
2720 else
2721 for (i = 0; i < NUMPARAMETERS; i++)
2722 pservice->copymap[i] = True;
2726 /***************************************************************************
2727 return the local pointer to a parameter given the service number and the
2728 pointer into the default structure
2729 ***************************************************************************/
2730 void *lp_local_ptr(int snum, void *ptr)
2732 return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
2735 /***************************************************************************
2736 Process a parameter for a particular service number. If snum < 0
2737 then assume we are in the globals
2738 ***************************************************************************/
2739 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2741 int parmnum, i;
2742 void *parm_ptr = NULL; /* where we are going to store the result */
2743 void *def_ptr = NULL;
2745 parmnum = map_parameter(pszParmName);
2747 if (parmnum < 0)
2749 DEBUG(0,
2750 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2751 return (True);
2754 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2756 DEBUG(0, ("WARNING: The \"%s\"option is deprecated\n",
2757 pszParmName));
2760 def_ptr = parm_table[parmnum].ptr;
2762 /* we might point at a service, the default service or a global */
2763 if (snum < 0)
2765 parm_ptr = def_ptr;
2767 else
2769 if (parm_table[parmnum].class == P_GLOBAL)
2771 DEBUG(0,
2772 ("Global parameter %s found in service section!\n",
2773 pszParmName));
2774 return (True);
2776 parm_ptr =
2777 ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
2778 &sDefault);
2781 if (snum >= 0)
2783 if (!ServicePtrs[snum]->copymap)
2784 init_copymap(ServicePtrs[snum]);
2786 /* this handles the aliases - set the copymap for other entries with
2787 the same data pointer */
2788 for (i = 0; parm_table[i].label; i++)
2789 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2790 ServicePtrs[snum]->copymap[i] = False;
2793 /* if it is a special case then go ahead */
2794 if (parm_table[parmnum].special)
2796 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2797 return (True);
2800 /* now switch on the type of variable it is */
2801 switch (parm_table[parmnum].type)
2803 case P_BOOL:
2804 set_boolean(parm_ptr, pszParmValue);
2805 break;
2807 case P_BOOLREV:
2808 set_boolean(parm_ptr, pszParmValue);
2809 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2810 break;
2812 case P_INTEGER:
2813 *(int *)parm_ptr = atoi(pszParmValue);
2814 break;
2816 case P_CHAR:
2817 *(char *)parm_ptr = *pszParmValue;
2818 break;
2820 case P_OCTAL:
2821 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2822 break;
2824 case P_STRING:
2825 string_set(parm_ptr, pszParmValue);
2826 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2827 unix_to_dos(*(char **)parm_ptr);
2828 break;
2830 case P_USTRING:
2831 string_set(parm_ptr, pszParmValue);
2832 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2833 unix_to_dos(*(char **)parm_ptr);
2834 strupper(*(char **)parm_ptr);
2835 break;
2837 case P_GSTRING:
2838 pstrcpy((char *)parm_ptr, pszParmValue);
2839 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2840 unix_to_dos((char *)parm_ptr);
2841 break;
2843 case P_UGSTRING:
2844 pstrcpy((char *)parm_ptr, pszParmValue);
2845 if (parm_table[parmnum].flags & FLAG_DOS_STRING)
2846 unix_to_dos((char *)parm_ptr);
2847 strupper((char *)parm_ptr);
2848 break;
2850 case P_ENUM:
2851 for (i = 0; parm_table[parmnum].enum_list[i].name;
2852 i++)
2854 if (strequal
2855 (pszParmValue,
2856 parm_table[parmnum].enum_list[i].name))
2858 *(int *)parm_ptr =
2859 parm_table[parmnum].
2860 enum_list[i].value;
2861 break;
2864 break;
2865 case P_SEP:
2866 break;
2870 return (True);
2873 /***************************************************************************
2874 Process a parameter.
2875 ***************************************************************************/
2876 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2878 if (!bInGlobalSection && bGlobalOnly)
2879 return (True);
2881 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2883 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2884 pszParmName, pszParmValue));
2888 /***************************************************************************
2889 print a parameter of the specified type
2890 ***************************************************************************/
2891 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f, char *(*dos_to_ext)(const char *))
2893 int i;
2894 switch (p->type)
2896 case P_ENUM:
2897 for (i = 0; p->enum_list[i].name; i++)
2899 if (*(int *)ptr == p->enum_list[i].value)
2901 fprintf(f, "%s",
2902 p->enum_list[i].name);
2903 break;
2906 break;
2908 case P_BOOL:
2909 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2910 break;
2912 case P_BOOLREV:
2913 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2914 break;
2916 case P_INTEGER:
2917 fprintf(f, "%d", *(int *)ptr);
2918 if (strequal(p->label,"log level")) {
2919 for (i = 1; i < DBGC_LAST; i ++) {
2920 if (((int *)ptr)[i])
2921 fprintf(f, ",%s:%d",debug_classname_from_index(i),((int *)ptr)[i]);
2924 break;
2926 case P_CHAR:
2927 fprintf(f, "%c", *(char *)ptr);
2928 break;
2930 case P_OCTAL:
2931 fprintf(f, "%s", octal_string(*(int *)ptr));
2932 break;
2934 case P_GSTRING:
2935 case P_UGSTRING:
2936 if ((char *)ptr) {
2937 if (p->flags & FLAG_DOS_STRING)
2938 fprintf(f, "%s", dos_to_ext((const char *)ptr));
2939 else
2940 fprintf(f, "%s", (char *)ptr);
2942 break;
2944 case P_STRING:
2945 case P_USTRING:
2946 if (*(char **)ptr) {
2947 if(p->flags & FLAG_DOS_STRING)
2948 fprintf(f,"%s",dos_to_ext((const char *)*(const char **)ptr));
2949 else
2950 fprintf(f, "%s", *(char **)ptr);
2952 break;
2953 case P_SEP:
2954 break;
2959 /***************************************************************************
2960 check if two parameters are equal
2961 ***************************************************************************/
2962 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
2964 switch (type)
2966 case P_BOOL:
2967 case P_BOOLREV:
2968 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
2970 case P_INTEGER:
2971 case P_ENUM:
2972 case P_OCTAL:
2973 return (*((int *)ptr1) == *((int *)ptr2));
2975 case P_CHAR:
2976 return (*((char *)ptr1) == *((char *)ptr2));
2978 case P_GSTRING:
2979 case P_UGSTRING:
2981 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2982 if (p1 && !*p1)
2983 p1 = NULL;
2984 if (p2 && !*p2)
2985 p2 = NULL;
2986 return (p1 == p2 || strequal(p1, p2));
2988 case P_STRING:
2989 case P_USTRING:
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_SEP:
2999 break;
3001 return (False);
3004 /***************************************************************************
3005 Initialize any local varients in the sDefault table.
3006 ***************************************************************************/
3008 void init_locals(void)
3010 /* None as yet. */
3013 /***************************************************************************
3014 Process a new section (service). At this stage all sections are services.
3015 Later we'll have special sections that permit server parameters to be set.
3016 Returns True on success, False on failure. SectionName must be in DOS codepage.
3017 ***************************************************************************/
3018 static BOOL do_section(char *pszSectionName)
3020 BOOL bRetval;
3021 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
3022 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
3023 bRetval = False;
3025 /* if we were in a global section then do the local inits */
3026 if (bInGlobalSection && !isglobal)
3027 init_locals();
3029 /* if we've just struck a global section, note the fact. */
3030 bInGlobalSection = isglobal;
3032 /* check for multiple global sections */
3033 if (bInGlobalSection)
3035 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
3036 return (True);
3039 if (!bInGlobalSection && bGlobalOnly)
3040 return (True);
3042 /* if we have a current service, tidy it up before moving on */
3043 bRetval = True;
3045 if (iServiceIndex >= 0)
3046 bRetval = service_ok(iServiceIndex);
3048 /* if all is still well, move to the next record in the services array */
3049 if (bRetval)
3051 /* We put this here to avoid an odd message order if messages are */
3052 /* issued by the post-processing of a previous section. */
3053 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
3055 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
3056 < 0)
3058 DEBUG(0, ("Failed to add a new service\n"));
3059 return (False);
3063 return (bRetval);
3067 /***************************************************************************
3068 determine if a partcular base parameter is currently set to the default value.
3069 ***************************************************************************/
3070 static BOOL is_default(int i)
3072 if (!defaults_saved)
3073 return False;
3074 switch (parm_table[i].type)
3076 case P_STRING:
3077 case P_USTRING:
3078 return strequal(parm_table[i].def.svalue,
3079 *(char **)parm_table[i].ptr);
3080 case P_GSTRING:
3081 case P_UGSTRING:
3082 return strequal(parm_table[i].def.svalue,
3083 (char *)parm_table[i].ptr);
3084 case P_BOOL:
3085 case P_BOOLREV:
3086 return parm_table[i].def.bvalue ==
3087 *(BOOL *)parm_table[i].ptr;
3088 case P_CHAR:
3089 return parm_table[i].def.cvalue ==
3090 *(char *)parm_table[i].ptr;
3091 case P_INTEGER:
3092 case P_OCTAL:
3093 case P_ENUM:
3094 return parm_table[i].def.ivalue ==
3095 *(int *)parm_table[i].ptr;
3096 case P_SEP:
3097 break;
3099 return False;
3103 /***************************************************************************
3104 Display the contents of the global structure.
3105 ***************************************************************************/
3106 static void dump_globals(FILE *f, char *(*dos_to_ext)(const char *))
3108 int i;
3109 fprintf(f, "# Global parameters\n[global]\n");
3111 for (i = 0; parm_table[i].label; i++)
3112 if (parm_table[i].class == P_GLOBAL &&
3113 parm_table[i].ptr &&
3114 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3116 if (defaults_saved && is_default(i))
3117 continue;
3118 fprintf(f, "\t%s = ", parm_table[i].label);
3119 print_parameter(&parm_table[i], parm_table[i].ptr, f, dos_to_ext);
3120 fprintf(f, "\n");
3124 /***************************************************************************
3125 return True if a local parameter is currently set to the global default
3126 ***************************************************************************/
3127 BOOL lp_is_default(int snum, struct parm_struct *parm)
3129 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
3131 return equal_parameter(parm->type,
3132 ((char *)ServicePtrs[snum]) + pdiff,
3133 ((char *)&sDefault) + pdiff);
3137 /***************************************************************************
3138 Display the contents of a single services record.
3139 ***************************************************************************/
3140 static void dump_a_service(service * pService, FILE * f, char *(*dos_to_ext)(const char *))
3142 int i;
3143 if (pService != &sDefault)
3144 fprintf(f, "\n[%s]\n", pService->szService);
3146 for (i = 0; parm_table[i].label; i++)
3147 if (parm_table[i].class == P_LOCAL &&
3148 parm_table[i].ptr &&
3149 (*parm_table[i].label != '-') &&
3150 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3152 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
3154 if (pService == &sDefault)
3156 if (defaults_saved && is_default(i))
3157 continue;
3159 else
3161 if (equal_parameter(parm_table[i].type,
3162 ((char *)pService) +
3163 pdiff,
3164 ((char *)&sDefault) +
3165 pdiff))
3166 continue;
3169 fprintf(f, "\t%s = ", parm_table[i].label);
3170 print_parameter(&parm_table[i],
3171 ((char *)pService) + pdiff, f, dos_to_ext);
3172 fprintf(f, "\n");
3177 /***************************************************************************
3178 return info about the next service in a service. snum==-1 gives the globals
3180 return NULL when out of parameters
3181 ***************************************************************************/
3182 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
3184 if (snum == -1)
3186 /* do the globals */
3187 for (; parm_table[*i].label; (*i)++)
3189 if (parm_table[*i].class == P_SEPARATOR)
3190 return &parm_table[(*i)++];
3192 if (!parm_table[*i].ptr
3193 || (*parm_table[*i].label == '-'))
3194 continue;
3196 if ((*i) > 0
3197 && (parm_table[*i].ptr ==
3198 parm_table[(*i) - 1].ptr))
3199 continue;
3201 return &parm_table[(*i)++];
3204 else
3206 service *pService = ServicePtrs[snum];
3208 for (; parm_table[*i].label; (*i)++)
3210 if (parm_table[*i].class == P_SEPARATOR)
3211 return &parm_table[(*i)++];
3213 if (parm_table[*i].class == P_LOCAL &&
3214 parm_table[*i].ptr &&
3215 (*parm_table[*i].label != '-') &&
3216 ((*i) == 0 ||
3217 (parm_table[*i].ptr !=
3218 parm_table[(*i) - 1].ptr)))
3220 int pdiff =
3221 PTR_DIFF(parm_table[*i].ptr,
3222 &sDefault);
3224 if (allparameters ||
3225 !equal_parameter(parm_table[*i].type,
3226 ((char *)pService) +
3227 pdiff,
3228 ((char *)&sDefault) +
3229 pdiff))
3231 return &parm_table[(*i)++];
3237 return NULL;
3241 #if 0
3242 /***************************************************************************
3243 Display the contents of a single copy structure.
3244 ***************************************************************************/
3245 static void dump_copy_map(BOOL *pcopymap)
3247 int i;
3248 if (!pcopymap)
3249 return;
3251 printf("\n\tNon-Copied parameters:\n");
3253 for (i = 0; parm_table[i].label; i++)
3254 if (parm_table[i].class == P_LOCAL &&
3255 parm_table[i].ptr && !pcopymap[i] &&
3256 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3258 printf("\t\t%s\n", parm_table[i].label);
3261 #endif
3263 /***************************************************************************
3264 Return TRUE if the passed service number is within range.
3265 ***************************************************************************/
3267 BOOL lp_snum_ok(int iService)
3269 return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
3272 /***************************************************************************
3273 Auto-load some home services.
3274 ***************************************************************************/
3276 static void lp_add_auto_services(char *str)
3278 char *s;
3279 char *p;
3280 int homes;
3282 if (!str)
3283 return;
3285 s = strdup(str);
3286 if (!s)
3287 return;
3289 homes = lp_servicenumber(HOMES_NAME);
3291 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP)) {
3292 char *home = get_user_service_home_dir(p);
3294 if (lp_servicenumber(p) >= 0)
3295 continue;
3297 if (home && homes >= 0)
3298 lp_add_home(p, homes, home);
3300 SAFE_FREE(s);
3303 /***************************************************************************
3304 Auto-load one printer.
3305 ***************************************************************************/
3307 void lp_add_one_printer(char *name, char *comment)
3309 int printers = lp_servicenumber(PRINTERS_NAME);
3310 int i;
3312 if (lp_servicenumber(name) < 0) {
3313 lp_add_printer(name, printers);
3314 if ((i = lp_servicenumber(name)) >= 0) {
3315 string_set(&ServicePtrs[i]->comment, comment);
3316 unix_to_dos(ServicePtrs[i]->comment);
3317 ServicePtrs[i]->autoloaded = True;
3322 /***************************************************************************
3323 have we loaded a services file yet?
3324 ***************************************************************************/
3325 BOOL lp_loaded(void)
3327 return (bLoaded);
3330 /***************************************************************************
3331 unload unused services
3332 ***************************************************************************/
3333 void lp_killunused(BOOL (*snumused) (int))
3335 int i;
3336 for (i = 0; i < iNumServices; i++)
3338 if (!VALID(i))
3339 continue;
3341 if (!snumused || !snumused(i))
3343 ServicePtrs[i]->valid = False;
3344 free_service(ServicePtrs[i]);
3350 /***************************************************************************
3351 unload a service
3352 ***************************************************************************/
3353 void lp_killservice(int iServiceIn)
3355 if (VALID(iServiceIn))
3357 ServicePtrs[iServiceIn]->valid = False;
3358 free_service(ServicePtrs[iServiceIn]);
3362 /***************************************************************************
3363 save the curent values of all global and sDefault parameters into the
3364 defaults union. This allows swat and testparm to show only the
3365 changed (ie. non-default) parameters.
3366 ***************************************************************************/
3367 static void lp_save_defaults(void)
3369 int i;
3370 for (i = 0; parm_table[i].label; i++)
3372 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3373 continue;
3374 switch (parm_table[i].type)
3376 case P_STRING:
3377 case P_USTRING:
3378 parm_table[i].def.svalue =
3379 strdup(*(char **)parm_table[i].ptr);
3380 break;
3381 case P_GSTRING:
3382 case P_UGSTRING:
3383 parm_table[i].def.svalue =
3384 strdup((char *)parm_table[i].ptr);
3385 break;
3386 case P_BOOL:
3387 case P_BOOLREV:
3388 parm_table[i].def.bvalue =
3389 *(BOOL *)parm_table[i].ptr;
3390 break;
3391 case P_CHAR:
3392 parm_table[i].def.cvalue =
3393 *(char *)parm_table[i].ptr;
3394 break;
3395 case P_INTEGER:
3396 case P_OCTAL:
3397 case P_ENUM:
3398 parm_table[i].def.ivalue =
3399 *(int *)parm_table[i].ptr;
3400 break;
3401 case P_SEP:
3402 break;
3405 defaults_saved = True;
3408 /*******************************************************************
3409 Set the server type we will announce as via nmbd.
3410 ********************************************************************/
3411 static void set_server_role(void)
3413 server_role = ROLE_STANDALONE;
3415 switch (lp_security()) {
3416 case SEC_SHARE:
3417 if (lp_domain_logons())
3418 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
3419 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3420 break;
3421 case SEC_SERVER:
3422 case SEC_DOMAIN:
3423 if (lp_domain_logons()) {
3424 server_role = ROLE_DOMAIN_BDC;
3425 DEBUG(10,("set_server_role: ROLE_DOMAIN_BDC\n"));
3426 break;
3428 server_role = ROLE_DOMAIN_MEMBER;
3429 DEBUG(10,("set_server_role: ROLE_DOMAIN_MEMBER\n"));
3430 break;
3431 case SEC_USER:
3432 if (lp_domain_logons()) {
3433 server_role = ROLE_DOMAIN_PDC;
3434 DEBUG(10,("set_server_role: ROLE_DOMAIN_PDC\n"));
3435 break;
3437 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3438 break;
3439 default:
3440 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
3441 DEBUG(10,("set_server_role: ROLE_STANDALONE\n"));
3442 break;
3447 /***************************************************************************
3448 Load the services array from the services file. Return True on success,
3449 False on failure.
3450 ***************************************************************************/
3451 BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults,
3452 BOOL add_ipc)
3454 pstring n2;
3455 BOOL bRetval;
3457 pstrcpy(n2, pszFname);
3458 standard_sub_basic(n2,sizeof(n2));
3460 add_to_file_list(pszFname, n2);
3462 bRetval = False;
3464 bInGlobalSection = True;
3465 bGlobalOnly = global_only;
3467 init_globals();
3469 if (save_defaults)
3471 init_locals();
3472 lp_save_defaults();
3475 pstrcpy(n2, pszFname);
3476 standard_sub_basic(n2,sizeof(n2));
3478 /* We get sections first, so have to start 'behind' to make up */
3479 iServiceIndex = -1;
3480 bRetval = pm_process(n2, do_section, do_parameter);
3482 /* finish up the last section */
3483 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3484 if (bRetval)
3485 if (iServiceIndex >= 0)
3486 bRetval = service_ok(iServiceIndex);
3488 lp_add_auto_services(lp_auto_services());
3490 if (add_ipc) {
3491 lp_add_ipc("IPC$", True);
3492 lp_add_ipc("ADMIN$", False);
3495 set_server_role();
3496 set_default_server_announce_type();
3498 bLoaded = True;
3500 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3501 /* if bWINSsupport is true and we are in the client */
3503 if (in_client && Globals.bWINSsupport)
3506 string_set(&Globals.szWINSserver, "127.0.0.1");
3510 return (bRetval);
3514 /***************************************************************************
3515 reset the max number of services
3516 ***************************************************************************/
3517 void lp_resetnumservices(void)
3519 iNumServices = 0;
3522 /***************************************************************************
3523 return the max number of services
3524 ***************************************************************************/
3525 int lp_numservices(void)
3527 return (iNumServices);
3530 /***************************************************************************
3531 Display the contents of the services array in human-readable form.
3532 ***************************************************************************/
3533 void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint, char *(*dos_to_ext)(const char *))
3535 int iService;
3537 if (show_defaults)
3539 defaults_saved = False;
3542 dump_globals(f, dos_to_ext);
3544 dump_a_service(&sDefault, f, dos_to_ext);
3546 for (iService = 0; iService < maxtoprint; iService++)
3547 lp_dump_one(f, show_defaults, iService, dos_to_ext);
3550 /***************************************************************************
3551 Display the contents of one service in human-readable form.
3552 ***************************************************************************/
3553 void lp_dump_one(FILE * f, BOOL show_defaults, int snum, char *(*dos_to_ext)(const char *))
3555 if (VALID(snum))
3557 if (ServicePtrs[snum]->szService[0] == '\0')
3558 return;
3559 dump_a_service(ServicePtrs[snum], f, dos_to_ext);
3564 /***************************************************************************
3565 Return the number of the service with the given name, or -1 if it doesn't
3566 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3567 getservicebyname()! This works ONLY if all services have been loaded, and
3568 does not copy the found service.
3569 ***************************************************************************/
3570 int lp_servicenumber(char *pszServiceName)
3572 int iService;
3573 fstring serviceName;
3576 for (iService = iNumServices - 1; iService >= 0; iService--)
3578 if (VALID(iService) && ServicePtrs[iService]->szService)
3581 * The substitution here is used to support %U is
3582 * service names
3584 fstrcpy(serviceName, ServicePtrs[iService]->szService);
3585 standard_sub_basic(serviceName,sizeof(serviceName));
3586 if (strequal(serviceName, pszServiceName))
3587 break;
3591 if (iService < 0)
3592 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
3594 return (iService);
3597 /*******************************************************************
3598 A useful volume label function. Returns a string in DOS codepage.
3599 ********************************************************************/
3601 char *volume_label(int snum)
3603 char *ret = lp_volume(snum);
3604 if (!*ret)
3605 return lp_servicename(snum);
3606 return (ret);
3610 /*******************************************************************
3611 Set the server type we will announce as via nmbd.
3612 ********************************************************************/
3613 static void set_default_server_announce_type(void)
3615 default_server_announce = 0;
3616 default_server_announce |= SV_TYPE_WORKSTATION;
3617 default_server_announce |= SV_TYPE_SERVER;
3618 default_server_announce |= SV_TYPE_SERVER_UNIX;
3619 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3621 switch (lp_announce_as())
3623 case ANNOUNCE_AS_NT_SERVER:
3625 default_server_announce |= SV_TYPE_SERVER_NT;
3626 /* fall through... */
3628 case ANNOUNCE_AS_NT_WORKSTATION:
3630 default_server_announce |= SV_TYPE_NT;
3631 break;
3633 case ANNOUNCE_AS_WIN95:
3635 default_server_announce |= SV_TYPE_WIN95_PLUS;
3636 break;
3638 case ANNOUNCE_AS_WFW:
3640 default_server_announce |= SV_TYPE_WFW;
3641 break;
3643 default:
3645 break;
3649 switch (lp_server_role())
3651 case ROLE_DOMAIN_MEMBER:
3653 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3654 break;
3656 case ROLE_DOMAIN_PDC:
3658 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3659 break;
3661 case ROLE_DOMAIN_BDC:
3663 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3664 break;
3666 case ROLE_STANDALONE:
3667 default:
3669 break;
3673 if (lp_time_server())
3675 default_server_announce |= SV_TYPE_TIME_SOURCE;
3678 if (lp_host_msdfs())
3680 default_server_announce |= SV_TYPE_DFS_SERVER;
3684 /***********************************************************
3685 returns role of Samba server
3686 ************************************************************/
3688 int lp_server_role(void)
3690 return server_role;
3693 /***********************************************************
3694 If we are PDC then prefer us as DMB
3695 ************************************************************/
3697 BOOL lp_domain_master(void)
3699 if (Globals.bDomainMaster == Auto)
3701 return (lp_server_role() == ROLE_DOMAIN_PDC);
3704 return Globals.bDomainMaster;
3707 /***********************************************************
3708 If we are DMB then prefer us as LMB
3709 ************************************************************/
3711 BOOL lp_preferred_master(void)
3713 if (Globals.bPreferredMaster == Auto)
3715 return (lp_local_master() && lp_domain_master());
3718 return Globals.bPreferredMaster;
3723 /*******************************************************************
3724 remove a service
3725 ********************************************************************/
3726 void lp_remove_service(int snum)
3728 ServicePtrs[snum]->valid = False;
3731 /*******************************************************************
3732 copy a service. new_name must be in dos codepage
3733 ********************************************************************/
3734 void lp_copy_service(int snum, char *new_name)
3736 char *oldname = lp_servicename(snum);
3737 do_section(new_name);
3738 if (snum >= 0)
3740 snum = lp_servicenumber(new_name);
3741 if (snum >= 0)
3742 lp_do_parameter(snum, "copy", oldname);
3747 /*******************************************************************
3748 Get the default server type we will announce as via nmbd.
3749 ********************************************************************/
3750 int lp_default_server_announce(void)
3752 return default_server_announce;
3755 /*******************************************************************
3756 Split the announce version into major and minor numbers.
3757 ********************************************************************/
3758 int lp_major_announce_version(void)
3760 static BOOL got_major = False;
3761 static int major_version = DEFAULT_MAJOR_VERSION;
3762 char *vers;
3763 char *p;
3765 if (got_major)
3766 return major_version;
3768 got_major = True;
3769 if ((vers = lp_announce_version()) == NULL)
3770 return major_version;
3772 if ((p = strchr(vers, '.')) == 0)
3773 return major_version;
3775 *p = '\0';
3776 major_version = atoi(vers);
3777 return major_version;
3780 int lp_minor_announce_version(void)
3782 static BOOL got_minor = False;
3783 static int minor_version = DEFAULT_MINOR_VERSION;
3784 char *vers;
3785 char *p;
3787 if (got_minor)
3788 return minor_version;
3790 got_minor = True;
3791 if ((vers = lp_announce_version()) == NULL)
3792 return minor_version;
3794 if ((p = strchr(vers, '.')) == 0)
3795 return minor_version;
3797 p++;
3798 minor_version = atoi(p);
3799 return minor_version;
3802 /***********************************************************
3803 Set the global name resolution order (used in smbclient).
3804 ************************************************************/
3806 void lp_set_name_resolve_order(char *new_order)
3808 Globals.szNameResolveOrder = new_order;
3811 char *lp_printername(int snum)
3813 char *ret = _lp_printername(snum);
3814 if (ret == NULL || (ret != NULL && *ret == '\0'))
3815 ret = lp_servicename(snum);
3817 return ret;
3820 /***********************************************************
3821 Return a pointer to the private directory (containing
3822 smbpasswd etc.).
3823 ************************************************************/
3825 void get_private_directory(pstring priv_dir)
3827 char *p;
3829 *priv_dir = 0;
3831 #ifdef WITH_TDB_SAM
3832 pstrcpy(priv_dir, lp_tdb_passwd_file());
3833 #else
3834 pstrcpy(priv_dir, lp_smb_passwd_file());
3835 #endif
3837 p = strrchr(priv_dir, '/');
3838 if (p) *p = 0;
3841 /***********************************************************
3842 Allow daemons such as winbindd to fix their logfile name.
3843 ************************************************************/
3845 void lp_set_logfile(const char *name)
3847 extern pstring debugf;
3848 string_set(&Globals.szLogFile, name);
3849 pstrcpy(debugf, name);
3852 /*******************************************************************
3853 Return the NetBIOS called name.
3854 ********************************************************************/
3856 const char *get_called_name(void)
3858 extern fstring local_machine;
3859 static fstring called_name;
3861 if (! *local_machine)
3862 return global_myname;
3865 * Windows NT/2k uses "*SMBSERVER" and XP uses "*SMBSERV"
3866 * arrggg!!! but we've already rewritten the client's
3867 * netbios name at this point...
3870 if (*local_machine) {
3871 if (!StrCaseCmp(local_machine, "_SMBSERVER") || !StrCaseCmp(local_machine, "_SMBSERV")) {
3872 fstrcpy(called_name, get_my_primary_ip());
3873 DEBUG(8,("get_called_name: assuming that client used IP address [%s] as called name.\n",
3874 called_name));
3875 return called_name;
3879 return local_machine;
3882 /*******************************************************************
3883 Return the max print jobs per queue.
3884 ********************************************************************/
3886 int lp_maxprintjobs(int snum)
3888 int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
3889 if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
3890 maxjobs = PRINT_MAX_JOBID - 1;
3892 return maxjobs;