2 Unix SMB/Netbios implementation.
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.
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.
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
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
52 /* Set default coding system for KANJI if none specified in Makefile. */
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'.
68 BOOL in_client = False; /* Not in the client by default */
71 extern int DEBUGLEVEL;
72 extern pstring user_socket_options;
73 extern pstring global_myname;
76 #define GLOBAL_NAME "global"
80 #define PRINTERS_NAME "printers"
84 #define HOMES_NAME "homes"
87 /* some helpful bits */
88 #define pSERVICE(i) ServicePtrs[i]
89 #define iSERVICE(i) (*pSERVICE(i))
90 #define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
91 #define VALID(i) iSERVICE(i).valid
93 int keepalive=DEFAULT_KEEPALIVE;
94 extern BOOL use_getwd_cache;
96 extern int extra_time_offset;
98 static BOOL defaults_saved=False;
101 * This structure describes global (ie., server-wide) parameters.
105 char *szPrintcapname;
108 char *szDefaultService;
112 char *szServerString;
113 char *szAutoServices;
114 char *szPasswdProgram;
118 char *szSMBPasswdFile;
119 char *szSMBPassGroupFile;
120 char *szSMBGroupFile;
121 char *szSMBAliasFile;
122 char *szPasswordServer;
123 char *szSocketOptions;
127 char *szAliasnameMap;
128 char *szGroupnameMap;
129 char *szBuiltinnameMap;
130 char *szNTusernameMap;
131 char *szCharacterSet;
138 char *szCodingSystem;
140 char *szRemoteAnnounce;
141 char *szRemoteBrowseSync;
142 char *szSocketAddress;
143 char *szNISHomeMapName;
144 char *szAnnounceVersion; /* This is initialised in init_globals */
145 char *szNetbiosAliases;
146 char *szDomainOtherSIDs;
148 char *szNameResolveOrder;
153 char *szLdapPasswdFile;
154 #endif /* WITH_LDAP */
178 int client_code_page;
179 int announce_as; /* This is initialised in init_globals */
180 int machine_password_timeout;
181 int change_notify_timeout;
186 #endif /* WITH_LDAP */
189 char *sslHostsRequire;
190 char *sslHostsResign;
196 char *sslClientPrivKey;
199 BOOL sslReqClientCert;
200 BOOL sslReqServerCert;
201 BOOL sslCompatibility;
202 #endif /* WITH_SSL */
207 BOOL bPreferredMaster;
210 BOOL bEncryptPasswords;
218 BOOL bReadPrediction;
225 BOOL bBindInterfacesOnly;
226 BOOL bUnixPasswdSync;
227 BOOL bPasswdChatDebug;
228 BOOL bOleLockingCompat;
236 static global Globals;
241 * This structure describes a single service.
249 char *szGuestaccount;
250 char *szInvalidUsers;
258 char *szRootPostExec;
259 char *szPrintcommand;
262 char *szLppausecommand;
263 char *szLpresumecommand;
264 char *szQueuepausecommand;
265 char *szQueueresumecommand;
267 char *szPrinterDriver;
268 char *szPrinterDriverLocation;
277 char *szVetoOplockFiles;
287 int iCreate_force_mode;
297 BOOL bShortCasePreserve;
324 BOOL bDeleteReadonly;
326 BOOL bDeleteVetoFiles;
328 BOOL bDosFiletimeResolution;
329 BOOL bFakeDirCreateTimes;
331 char dummy[3]; /* for alignment */
335 /* This is a default service used to prime a services structure */
336 static service sDefault =
339 NULL, /* szService */
341 NULL, /* szUsername */
342 NULL, /* szGuestAccount - this is set in init_globals() */
343 NULL, /* szInvalidUsers */
344 NULL, /* szValidUsers */
345 NULL, /* szAdminUsers */
347 NULL, /* szInclude */
348 NULL, /* szPreExec */
349 NULL, /* szPostExec */
350 NULL, /* szRootPreExec */
351 NULL, /* szRootPostExec */
352 NULL, /* szPrintcommand */
353 NULL, /* szLpqcommand */
354 NULL, /* szLprmcommand */
355 NULL, /* szLppausecommand */
356 NULL, /* szLpresumecommand */
357 NULL, /* szQueuepausecommand */
358 NULL, /* szQueueresumecommand */
359 NULL, /* szPrintername */
360 NULL, /* szPrinterDriver - this is set in init_globals() */
361 NULL, /* szPrinterDriverLocation */
362 NULL, /* szDontdescend */
363 NULL, /* szHostsallow */
364 NULL, /* szHostsdeny */
365 NULL, /* szMagicScript */
366 NULL, /* szMagicOutput */
367 NULL, /* szMangledMap */
368 NULL, /* szVetoFiles */
369 NULL, /* szHideFiles */
370 NULL, /* szVetoOplockFiles */
372 NULL, /* force user */
373 NULL, /* force group */
375 NULL, /* writelist */
378 0, /* iMinPrintSpace */
379 0744, /* iCreate_mask */
380 0000, /* iCreate_force_mode */
381 0755, /* iDir_mask */
382 0000, /* iDir_force_mode */
383 0, /* iMaxConnections */
384 CASE_LOWER, /* iDefaultCase */
385 DEFAULT_PRINTING, /* iPrinting */
386 False, /* bAlternatePerm */
387 False, /* revalidate */
388 False, /* case sensitive */
389 True, /* case preserve */
390 True, /* short case preserve */
391 False, /* case mangle */
393 True, /* bHideDotFiles */
394 True, /* bBrowseable */
395 True, /* bAvailable */
396 True, /* bRead_only */
397 True, /* bNo_set_dir */
398 False, /* bGuest_only */
399 False, /* bGuest_ok */
400 False, /* bPrint_ok */
401 False, /* bPostscript */
402 False, /* bMap_system */
403 False, /* bMap_hidden */
404 True, /* bMap_archive */
406 False, /* bStrictLocking */
407 True, /* bShareModes */
409 False, /* bOnlyUser */
410 True, /* bMangledNames */
411 True, /* bWidelinks */
412 True, /* bSymlinks */
413 False, /* bSyncAlways */
414 False, /* bStrictSync */
415 '~', /* magic char */
417 False, /* bDeleteReadonly */
418 False, /* bFakeOplocks */
419 False, /* bDeleteVetoFiles */
420 False, /* bDosFiletimes */
421 False, /* bDosFiletimeResolution */
422 False, /* bFakeDirCreateTimes */
423 True, /* bBlockingLocks */
429 /* local variables */
430 static service **ServicePtrs = NULL;
431 static int iNumServices = 0;
432 static int iServiceIndex = 0;
433 static BOOL bInGlobalSection = True;
434 static BOOL bGlobalOnly = False;
435 static int default_server_announce;
437 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
439 /* prototypes for the special type handlers */
440 static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
441 static BOOL handle_include(char *pszParmValue, char **ptr);
442 static BOOL handle_copy(char *pszParmValue, char **ptr);
443 static BOOL handle_character_set(char *pszParmValue,char **ptr);
444 static BOOL handle_coding_system(char *pszParmValue,char **ptr);
446 static void set_default_server_announce_type(void);
448 static struct enum_list enum_protocol[] = {{PROTOCOL_NT1, "NT1"}, {PROTOCOL_LANMAN2, "LANMAN2"},
449 {PROTOCOL_LANMAN1, "LANMAN1"}, {PROTOCOL_CORE,"CORE"},
450 {PROTOCOL_COREPLUS, "COREPLUS"},
451 {PROTOCOL_COREPLUS, "CORE+"}, {-1, NULL}};
453 static struct enum_list enum_security[] = {{SEC_SHARE, "SHARE"}, {SEC_USER, "USER"},
454 {SEC_SERVER, "SERVER"}, {SEC_DOMAIN, "DOMAIN"},
457 static struct enum_list enum_printing[] = {{PRINT_SYSV, "sysv"}, {PRINT_AIX, "aix"},
458 {PRINT_HPUX, "hpux"}, {PRINT_BSD, "bsd"},
459 {PRINT_QNX, "qnx"}, {PRINT_PLP, "plp"},
460 {PRINT_LPRNG, "lprng"}, {PRINT_SOFTQ, "softq"},
463 static struct enum_list enum_announce_as[] = {{ANNOUNCE_AS_NT, "NT"}, {ANNOUNCE_AS_WIN95, "win95"},
464 {ANNOUNCE_AS_WFW, "WfW"}, {-1, NULL}};
466 static struct enum_list enum_case[] = {{CASE_LOWER, "lower"}, {CASE_UPPER, "upper"}, {-1, NULL}};
468 static struct enum_list enum_lm_announce[] = {{0, "False"}, {1, "True"}, {2, "Auto"}, {-1, NULL}};
471 Do you want session setups at user level security with a invalid
472 password to be rejected or allowed in as guest? WinNT rejects them
473 but it can be a pain as it means "net view" needs to use a password
475 You have 3 choices in the setting of map_to_guest:
477 "Never" means session setups with an invalid password
478 are rejected. This is the default.
480 "Bad User" means session setups with an invalid password
481 are rejected, unless the username does not exist, in which case it
482 is treated as a guest login
484 "Bad Password" means session setups with an invalid password
485 are treated as a guest login
487 Note that map_to_guest only has an effect in user or server
491 static struct enum_list enum_map_to_guest[] = {{NEVER_MAP_TO_GUEST, "Never"}, {MAP_TO_GUEST_ON_BAD_USER, "Bad User"}, {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"}, {-1, NULL}};
494 static struct enum_list enum_ssl_version[] = {{SMB_SSL_V2, "ssl2"}, {SMB_SSL_V3, "ssl3"},
495 {SMB_SSL_V23, "ssl2or3"}, {SMB_SSL_TLS1, "tls1"}, {-1, NULL}};
498 /* note that we do not initialise the defaults union - it is not allowed in ANSI C */
499 static struct parm_struct parm_table[] =
501 {"Base Options", P_SEP, P_SEPARATOR},
503 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
504 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
505 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, 0},
506 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC},
507 {"netbios name", P_UGSTRING,P_GLOBAL, global_myname, NULL, NULL, FLAG_BASIC},
508 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, 0},
509 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC},
510 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC},
511 {"bind interfaces only", P_BOOL,P_GLOBAL, &Globals.bBindInterfacesOnly,NULL, NULL, 0},
513 {"Security Options", P_SEP, P_SEPARATOR},
515 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC},
516 {"encrypt passwords",P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC},
517 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC},
518 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0},
519 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0},
520 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0},
521 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0},
522 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0},
524 {"smb passgrp file", P_STRING, P_GLOBAL, &Globals.szSMBPassGroupFile, NULL, NULL, 0},
527 {"smb group file", P_STRING, P_GLOBAL, &Globals.szSMBGroupFile, NULL, NULL, 0},
528 {"smb alias file", P_STRING, P_GLOBAL, &Globals.szSMBAliasFile, NULL, NULL, 0},
530 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0},
531 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
532 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
533 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0},
534 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0},
535 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0},
536 {"passwd chat debug",P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0},
537 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0},
538 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0},
539 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0},
540 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0},
541 {"alternate permissions",P_BOOL,P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL, FLAG_GLOBAL|FLAG_DEPRECATED},
542 {"revalidate", P_BOOL, P_LOCAL, &sDefault.bRevalidate, NULL, NULL, FLAG_GLOBAL},
543 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL},
544 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
545 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0},
546 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL, FLAG_BASIC|FLAG_PRINT|FLAG_GLOBAL},
547 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL},
548 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL},
549 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL},
550 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL},
551 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL},
552 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, 0},
553 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
554 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0},
555 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC},
556 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
557 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
558 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0},
559 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
560 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
561 {"force create mode",P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL},
562 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
563 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
564 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL},
565 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
566 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0},
567 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC|FLAG_PRINT},
568 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0},
569 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, 0},
570 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL|FLAG_BASIC|FLAG_PRINT},
571 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0},
572 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL|FLAG_BASIC|FLAG_PRINT},
573 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0},
576 {"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
578 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0 },
579 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0 },
580 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0} ,
581 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0 },
582 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0 },
583 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0 },
584 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0 },
585 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0 },
586 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0 },
587 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL , 0},
588 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL , 0},
589 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0 },
590 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0},
591 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0 },
592 #endif /* WITH_SSL */
594 {"Logging Options", P_SEP, P_SEPARATOR},
596 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_BASIC},
597 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, 0},
598 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0},
599 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0},
600 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0},
601 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0},
602 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
603 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0},
604 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL},
606 {"Protocol Options", P_SEP, P_SEPARATOR},
608 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
609 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0},
610 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0},
611 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0},
612 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0},
613 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0},
614 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0},
615 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0},
616 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0},
617 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0},
618 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0},
619 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
620 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0},
621 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0},
622 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0},
623 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0},
624 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0},
626 {"Tuning Options", P_SEP, P_SEPARATOR},
628 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0},
629 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0},
630 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0},
631 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0},
632 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0},
633 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, 0},
634 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0},
635 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0},
636 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, 0},
637 {"read prediction", P_BOOL, P_GLOBAL, &Globals.bReadPrediction, NULL, NULL, 0},
638 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0},
639 {"shared mem size", P_INTEGER, P_GLOBAL, &Globals.shmem_size, NULL, NULL, 0},
640 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0},
641 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0},
642 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, 0},
643 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, 0},
645 {"Printing Options", P_SEP, P_SEPARATOR},
647 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, 0},
648 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
649 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0},
650 {"printer driver file", P_STRING, P_GLOBAL, &Globals.szDriverFile, NULL, NULL, 0},
651 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
652 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0},
653 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT},
654 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT|FLAG_GLOBAL},
655 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
656 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
657 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT|FLAG_GLOBAL},
658 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_GLOBAL},
659 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand,NULL, NULL, FLAG_GLOBAL},
660 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_GLOBAL},
661 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_GLOBAL},
663 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
664 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, 0},
665 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, 0},
666 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_GLOBAL},
668 {"Filename Handling", P_SEP, P_SEPARATOR},
669 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0},
670 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0},
671 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0},
672 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0},
673 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, NULL, NULL, 0},
674 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, 0},
675 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_GLOBAL},
676 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0},
677 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_GLOBAL},
678 {"short preserve case",P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve,NULL, NULL, FLAG_GLOBAL},
679 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_GLOBAL},
680 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_GLOBAL},
681 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_GLOBAL},
682 {"delete veto files",P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_GLOBAL},
683 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_GLOBAL},
684 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_GLOBAL},
685 {"veto oplock files",P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles,NULL, NULL, FLAG_GLOBAL},
686 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_GLOBAL},
687 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_GLOBAL},
688 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_GLOBAL},
689 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_GLOBAL},
690 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_GLOBAL},
691 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0},
693 {"Domain Options", P_SEP, P_SEPARATOR},
695 {"local group map", P_STRING, P_GLOBAL, &Globals.szAliasnameMap, NULL, NULL, 0},
696 {"domain group map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0},
697 {"builtin group map", P_STRING, P_GLOBAL, &Globals.szBuiltinnameMap, NULL, NULL, 0},
698 {"domain user map", P_STRING, P_GLOBAL, &Globals.szNTusernameMap, NULL, NULL, 0},
699 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, 0},
701 {"Logon Options", P_SEP, P_SEPARATOR},
703 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, 0},
704 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, 0},
705 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0},
706 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, 0},
707 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0},
709 {"Browse Options", P_SEP, P_SEPARATOR},
711 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC},
712 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_lm_announce, 0},
713 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0},
714 {"preferred master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL, FLAG_BASIC},
715 {"prefered master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL, 0},
716 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC},
717 {"domain master", P_BOOL, P_GLOBAL, &Globals.bDomainMaster, NULL, NULL, FLAG_BASIC},
718 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0},
719 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
720 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0},
722 {"WINS Options", P_SEP, P_SEPARATOR},
724 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0},
725 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0},
726 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL, NULL, FLAG_BASIC},
727 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC},
729 {"Locking Options", P_SEP, P_SEPARATOR},
731 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, 0},
732 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, 0},
733 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
734 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_GLOBAL},
735 {"ole locking compatibility", P_BOOL, P_GLOBAL, &Globals.bOleLockingCompat, NULL, NULL, FLAG_GLOBAL},
736 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_GLOBAL},
737 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_GLOBAL},
738 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_GLOBAL},
741 {"Ldap Options", P_SEP, P_SEPARATOR},
743 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
744 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
745 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0},
746 {"ldap bind as", P_STRING, P_GLOBAL, &Globals.szLdapBindAs, NULL, NULL, 0},
747 {"ldap passwd file", P_STRING, P_GLOBAL, &Globals.szLdapPasswdFile, NULL, NULL, 0},
748 #endif /* WITH_LDAP */
751 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
753 {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
754 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
755 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
756 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0},
757 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
758 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0},
759 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
760 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0},
761 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0},
762 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0},
763 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0},
764 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0},
765 {"remote browse sync",P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync,NULL, NULL, 0},
766 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0},
767 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0},
768 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0},
769 {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0},
770 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0},
771 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
772 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
773 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
774 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
775 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0},
776 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, 0},
777 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, 0},
778 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, 0},
779 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, 0},
780 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, 0},
781 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, 0},
782 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, 0},
783 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_GLOBAL},
784 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_GLOBAL},
785 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, 0},
786 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, 0},
787 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, 0},
788 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_GLOBAL},
789 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_GLOBAL},
790 {"dos filetime resolution",P_BOOL,P_LOCAL,&sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_GLOBAL},
792 {"fake directory create times", P_BOOL,P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_GLOBAL},
793 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
795 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
800 /***************************************************************************
801 Initialise the global parameter structure.
802 ***************************************************************************/
803 static void init_globals(void)
805 static BOOL done_init = False;
811 bzero((void *)&Globals,sizeof(Globals));
813 for (i = 0; parm_table[i].label; i++)
814 if ((parm_table[i].type == P_STRING ||
815 parm_table[i].type == P_USTRING) &&
817 string_init(parm_table[i].ptr,"");
819 string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
820 string_set(&sDefault.szPrinterDriver, "NULL");
821 string_set(&sDefault.fstype, FSTYPE_STRING);
827 DEBUG(3,("Initialising global parameters\n"));
829 string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
831 string_set(&Globals.szSMBPassGroupFile, SMB_PASSGRP_FILE);
834 string_set(&Globals.szSMBGroupFile, SMB_GROUP_FILE);
835 string_set(&Globals.szSMBAliasFile, SMB_ALIAS_FILE);
837 string_set(&Globals.szPasswdChat,"*old*password* %o\\n *new*password* %n\\n *new*password* %n\\n *changed*");
838 string_set(&Globals.szWorkGroup, WORKGROUP);
839 string_set(&Globals.szPasswdProgram, PASSWD_PROGRAM);
840 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
841 string_set(&Globals.szDriverFile, DRIVERFILE);
842 string_set(&Globals.szLockDir, LOCKDIR);
843 string_set(&Globals.szRootdir, "/");
844 string_set(&Globals.szSmbrun, SMBRUN);
845 string_set(&Globals.szSocketAddress, "0.0.0.0");
846 pstrcpy(s, "Samba ");
848 string_set(&Globals.szServerString,s);
849 slprintf(s,sizeof(s)-1, "%d.%d", DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION);
850 string_set(&Globals.szAnnounceVersion,s);
852 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
854 string_set(&Globals.szLogonDrive, "");
855 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
856 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
857 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
859 string_set(&Globals.szNameResolveOrder, "lmhosts host wins bcast");
861 Globals.bLoadPrinters = True;
862 Globals.bUseRhosts = False;
863 Globals.max_packet = 65535;
864 Globals.mangled_stack = 50;
865 Globals.max_xmit = 65535;
866 Globals.max_mux = 50; /* This is *needed* for profile support. */
867 Globals.lpqcachetime = 10;
868 Globals.pwordlevel = 0;
869 Globals.unamelevel = 0;
870 Globals.deadtime = 0;
871 Globals.max_log_size = 5000;
872 Globals.max_open_files = MAX_OPEN_FILES;
873 Globals.maxprotocol = PROTOCOL_NT1;
874 Globals.security = SEC_USER;
875 Globals.bEncryptPasswords = False;
876 Globals.bUpdateEncrypt = False;
877 Globals.bReadRaw = True;
878 Globals.bWriteRaw = True;
879 Globals.bReadPrediction = False;
880 Globals.bReadbmpx = True;
881 Globals.bNullPasswords = False;
882 Globals.bStripDot = False;
884 Globals.bSyslogOnly = False;
885 Globals.bTimestampLogs = True;
886 Globals.os_level = 0;
887 Globals.max_ttl = 60*60*24*3; /* 3 days default. */
888 Globals.max_wins_ttl = 60*60*24*6; /* 6 days default. */
889 Globals.min_wins_ttl = 60*60*6; /* 6 hours default. */
890 Globals.machine_password_timeout = 60*60*24*7; /* 7 days default. */
891 Globals.change_notify_timeout = 60; /* 1 minute default. */
892 Globals.ReadSize = 16*1024;
893 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
894 Globals.lm_interval = 60;
895 Globals.shmem_size = SHMEM_SIZE;
896 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
897 Globals.announce_as = ANNOUNCE_AS_NT;
898 Globals.bUnixRealname = False;
899 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
900 Globals.bNISHomeMap = False;
901 #ifdef WITH_NISPLUS_HOME
902 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
904 string_set(&Globals.szNISHomeMapName, "auto.home");
907 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
908 Globals.bTimeServer = False;
909 Globals.bBindInterfacesOnly = False;
910 Globals.bUnixPasswdSync = False;
911 Globals.bPasswdChatDebug = False;
912 Globals.bOleLockingCompat = True;
913 Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
914 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
915 Globals.bStatCache = True; /* use stat cache by default */
916 Globals.map_to_guest = 0; /* By Default, "Never" */
919 /* default values for ldap */
920 string_set(&Globals.szLdapServer, "localhost");
921 Globals.ldap_port=389;
922 #endif /* WITH_LDAP */
925 Globals.sslVersion = SMB_SSL_V23;
928 * Most of the next variables should be string_set!
931 string_set(&Globals.sslHostsRequire, NULL);
932 string_set(&Globals.sslHostsResign, NULL);
933 string_set(&Globals.sslCaCertDir, NULL);
934 string_set(&Globals.sslCaCertFile, NULL);
935 string_set(&Globals.sslCert, NULL);
936 string_set(&Globals.sslPrivKey, NULL);
937 string_set(&Globals.sslClientCert, NULL);
938 string_set(&Globals.sslClientPrivKey, NULL);
939 string_set(&Globals.sslCiphers, NULL);
940 Globals.sslEnabled = False;
941 Globals.sslReqClientCert = False;
942 Globals.sslReqServerCert = False;
943 Globals.sslCompatibility = False;
944 #endif /* WITH_SSL */
946 /* these parameters are set to defaults that are more appropriate
947 for the increasing samba install base:
949 as a member of the workgroup, that will possibly become a
950 _local_ master browser (lm = True). this is opposed to a forced
951 local master browser startup (pm = True).
953 doesn't provide WINS server service by default (wsupp = False),
954 and doesn't provide domain master browser services by default, either.
958 Globals.bPreferredMaster = False;
959 Globals.bLocalMaster = True;
960 Globals.bDomainMaster = False;
961 Globals.bDomainLogons = False;
962 Globals.bBrowseList = True;
963 Globals.bWINSsupport = False;
964 Globals.bWINSproxy = False;
966 Globals.bDNSproxy = True;
969 * smbd will check at runtime to see if this value
970 * will really be used or not.
972 Globals.bKernelOplocks = True;
975 * This must be done last as it checks the value in
979 interpret_coding_system(KANJI);
982 /***************************************************************************
983 check if a string is initialised and if not then initialise it
984 ***************************************************************************/
985 static void string_initial(char **s,char *v)
992 /***************************************************************************
993 Initialise the sDefault parameter structure.
994 ***************************************************************************/
995 static void init_locals(void)
997 /* choose defaults depending on the type of printing */
998 switch (sDefault.iPrinting)
1004 string_initial(&sDefault.szLpqcommand,"lpq -P%p");
1005 string_initial(&sDefault.szLprmcommand,"lprm -P%p %j");
1006 string_initial(&sDefault.szPrintcommand,"lpr -r -P%p %s");
1011 string_initial(&sDefault.szLpqcommand,"lpstat -o%p");
1012 string_initial(&sDefault.szLprmcommand,"cancel %p-%j");
1013 string_initial(&sDefault.szPrintcommand,"lp -c -d%p %s; rm %s");
1015 string_initial(&sDefault.szLppausecommand,"lp -i %p-%j -H hold");
1016 string_initial(&sDefault.szLpresumecommand,"lp -i %p-%j -H resume");
1017 string_initial(&sDefault.szQueuepausecommand, "lpc stop %p");
1018 string_initial(&sDefault.szQueueresumecommand, "lpc start %p");
1020 string_initial(&sDefault.szQueuepausecommand, "disable %p");
1021 string_initial(&sDefault.szQueueresumecommand, "enable %p");
1026 string_initial(&sDefault.szLpqcommand,"lpq -P%p");
1027 string_initial(&sDefault.szLprmcommand,"lprm -P%p %j");
1028 string_initial(&sDefault.szPrintcommand,"lp -r -P%p %s");
1032 string_initial(&sDefault.szLpqcommand,"qstat -l -d%p");
1033 string_initial(&sDefault.szLprmcommand,"qstat -s -j%j -c");
1034 string_initial(&sDefault.szPrintcommand,"lp -d%p -s %s; rm %s");
1035 string_initial(&sDefault.szLppausecommand,"qstat -s -j%j -h");
1036 string_initial(&sDefault.szLpresumecommand,"qstat -s -j%j -r");
1043 /******************************************************************* a
1044 convenience routine to grab string parameters into a rotating buffer,
1045 and run standard_sub_basic on them. The buffers can be written to by
1046 callers without affecting the source string.
1047 ********************************************************************/
1048 static char *lp_string(char *s)
1050 static char *bufs[10];
1051 static int buflen[10];
1052 static int next = -1;
1055 int len = s?strlen(s):0;
1058 /* initialisation */
1059 for (i=0;i<10;i++) {
1066 len = MAX(len+100,sizeof(pstring)); /* the +100 is for some
1067 substitution room */
1069 if (buflen[next] != len) {
1071 if (bufs[next]) free(bufs[next]);
1072 bufs[next] = (char *)malloc(len);
1074 DEBUG(0,("out of memory in lp_string()"));
1079 ret = &bufs[next][0];
1087 trim_string(ret, "\"", "\"");
1089 standard_sub_basic(ret);
1095 In this section all the functions that are used to access the
1096 parameters from the rest of the program are defined
1099 #define FN_GLOBAL_STRING(fn_name,ptr) \
1100 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1101 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1102 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1103 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1104 char fn_name(void) {return(*(char *)(ptr));}
1105 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1106 int fn_name(void) {return(*(int *)(ptr));}
1108 #define FN_LOCAL_STRING(fn_name,val) \
1109 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1110 #define FN_LOCAL_BOOL(fn_name,val) \
1111 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1112 #define FN_LOCAL_CHAR(fn_name,val) \
1113 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1114 #define FN_LOCAL_INTEGER(fn_name,val) \
1115 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1117 FN_GLOBAL_STRING(lp_logfile,&Globals.szLogFile)
1118 FN_GLOBAL_STRING(lp_smbrun,&Globals.szSmbrun)
1119 FN_GLOBAL_STRING(lp_configfile,&Globals.szConfigFile)
1120 FN_GLOBAL_STRING(lp_smb_passwd_file,&Globals.szSMBPasswdFile)
1122 FN_GLOBAL_STRING(lp_smb_passgrp_file,&Globals.szSMBPassGroupFile)
1125 FN_GLOBAL_STRING(lp_smb_group_file,&Globals.szSMBGroupFile)
1126 FN_GLOBAL_STRING(lp_smb_alias_file,&Globals.szSMBAliasFile)
1128 FN_GLOBAL_STRING(lp_serverstring,&Globals.szServerString)
1129 FN_GLOBAL_STRING(lp_printcapname,&Globals.szPrintcapname)
1130 FN_GLOBAL_STRING(lp_lockdir,&Globals.szLockDir)
1131 FN_GLOBAL_STRING(lp_rootdir,&Globals.szRootdir)
1132 FN_GLOBAL_STRING(lp_defaultservice,&Globals.szDefaultService)
1133 FN_GLOBAL_STRING(lp_msg_command,&Globals.szMsgCommand)
1134 FN_GLOBAL_STRING(lp_hosts_equiv,&Globals.szHostsEquiv)
1135 FN_GLOBAL_STRING(lp_auto_services,&Globals.szAutoServices)
1136 FN_GLOBAL_STRING(lp_passwd_program,&Globals.szPasswdProgram)
1137 FN_GLOBAL_STRING(lp_passwd_chat,&Globals.szPasswdChat)
1138 FN_GLOBAL_STRING(lp_passwordserver,&Globals.szPasswordServer)
1139 FN_GLOBAL_STRING(lp_name_resolve_order,&Globals.szNameResolveOrder)
1140 FN_GLOBAL_STRING(lp_workgroup,&Globals.szWorkGroup)
1141 FN_GLOBAL_STRING(lp_username_map,&Globals.szUsernameMap)
1142 FN_GLOBAL_STRING(lp_aliasname_map,&Globals.szAliasnameMap)
1143 FN_GLOBAL_STRING(lp_groupname_map,&Globals.szGroupnameMap)
1144 FN_GLOBAL_STRING(lp_builtinname_map,&Globals.szBuiltinnameMap)
1145 FN_GLOBAL_STRING(lp_ntusrname_map,&Globals.szNTusernameMap)
1146 FN_GLOBAL_STRING(lp_logon_script,&Globals.szLogonScript)
1147 FN_GLOBAL_STRING(lp_logon_path,&Globals.szLogonPath)
1148 FN_GLOBAL_STRING(lp_logon_drive,&Globals.szLogonDrive)
1149 FN_GLOBAL_STRING(lp_logon_home,&Globals.szLogonHome)
1150 FN_GLOBAL_STRING(lp_remote_announce,&Globals.szRemoteAnnounce)
1151 FN_GLOBAL_STRING(lp_remote_browse_sync,&Globals.szRemoteBrowseSync)
1152 FN_GLOBAL_STRING(lp_wins_server,&Globals.szWINSserver)
1153 FN_GLOBAL_STRING(lp_interfaces,&Globals.szInterfaces)
1154 FN_GLOBAL_STRING(lp_socket_address,&Globals.szSocketAddress)
1155 FN_GLOBAL_STRING(lp_nis_home_map_name,&Globals.szNISHomeMapName)
1156 static FN_GLOBAL_STRING(lp_announce_version,&Globals.szAnnounceVersion)
1157 FN_GLOBAL_STRING(lp_netbios_aliases,&Globals.szNetbiosAliases)
1158 FN_GLOBAL_STRING(lp_driverfile,&Globals.szDriverFile)
1159 FN_GLOBAL_STRING(lp_panic_action,&Globals.szPanicAction)
1162 FN_GLOBAL_STRING(lp_ldap_server,&Globals.szLdapServer);
1163 FN_GLOBAL_STRING(lp_ldap_suffix,&Globals.szLdapSuffix);
1164 FN_GLOBAL_STRING(lp_ldap_bind_as,&Globals.szLdapBindAs);
1165 FN_GLOBAL_STRING(lp_ldap_passwd_file,&Globals.szLdapPasswdFile);
1166 #endif /* WITH_LDAP */
1169 FN_GLOBAL_INTEGER(lp_ssl_version,&Globals.sslVersion);
1170 FN_GLOBAL_STRING(lp_ssl_hosts,&Globals.sslHostsRequire);
1171 FN_GLOBAL_STRING(lp_ssl_hosts_resign,&Globals.sslHostsResign);
1172 FN_GLOBAL_STRING(lp_ssl_cacertdir,&Globals.sslCaCertDir);
1173 FN_GLOBAL_STRING(lp_ssl_cacertfile,&Globals.sslCaCertFile);
1174 FN_GLOBAL_STRING(lp_ssl_cert,&Globals.sslCert);
1175 FN_GLOBAL_STRING(lp_ssl_privkey,&Globals.sslPrivKey);
1176 FN_GLOBAL_STRING(lp_ssl_client_cert,&Globals.sslClientCert);
1177 FN_GLOBAL_STRING(lp_ssl_client_privkey,&Globals.sslClientPrivKey);
1178 FN_GLOBAL_STRING(lp_ssl_ciphers,&Globals.sslCiphers);
1179 FN_GLOBAL_BOOL(lp_ssl_enabled,&Globals.sslEnabled);
1180 FN_GLOBAL_BOOL(lp_ssl_reqClientCert,&Globals.sslReqClientCert);
1181 FN_GLOBAL_BOOL(lp_ssl_reqServerCert,&Globals.sslReqServerCert);
1182 FN_GLOBAL_BOOL(lp_ssl_compatibility,&Globals.sslCompatibility);
1183 #endif /* WITH_SSL */
1185 FN_GLOBAL_BOOL(lp_dns_proxy,&Globals.bDNSproxy)
1186 FN_GLOBAL_BOOL(lp_wins_support,&Globals.bWINSsupport)
1187 FN_GLOBAL_BOOL(lp_we_are_a_wins_server,&Globals.bWINSsupport)
1188 FN_GLOBAL_BOOL(lp_wins_proxy,&Globals.bWINSproxy)
1189 FN_GLOBAL_BOOL(lp_local_master,&Globals.bLocalMaster)
1190 FN_GLOBAL_BOOL(lp_domain_master,&Globals.bDomainMaster)
1191 FN_GLOBAL_BOOL(lp_domain_logons,&Globals.bDomainLogons)
1192 FN_GLOBAL_BOOL(lp_preferred_master,&Globals.bPreferredMaster)
1193 FN_GLOBAL_BOOL(lp_load_printers,&Globals.bLoadPrinters)
1194 FN_GLOBAL_BOOL(lp_use_rhosts,&Globals.bUseRhosts)
1195 FN_GLOBAL_BOOL(lp_readprediction,&Globals.bReadPrediction)
1196 FN_GLOBAL_BOOL(lp_readbmpx,&Globals.bReadbmpx)
1197 FN_GLOBAL_BOOL(lp_readraw,&Globals.bReadRaw)
1198 FN_GLOBAL_BOOL(lp_writeraw,&Globals.bWriteRaw)
1199 FN_GLOBAL_BOOL(lp_null_passwords,&Globals.bNullPasswords)
1200 FN_GLOBAL_BOOL(lp_strip_dot,&Globals.bStripDot)
1201 FN_GLOBAL_BOOL(lp_encrypted_passwords,&Globals.bEncryptPasswords)
1202 FN_GLOBAL_BOOL(lp_update_encrypted,&Globals.bUpdateEncrypt)
1203 FN_GLOBAL_BOOL(lp_syslog_only,&Globals.bSyslogOnly)
1204 FN_GLOBAL_BOOL(lp_timestamp_logs,&Globals.bTimestampLogs)
1205 FN_GLOBAL_BOOL(lp_browse_list,&Globals.bBrowseList)
1206 FN_GLOBAL_BOOL(lp_unix_realname,&Globals.bUnixRealname)
1207 FN_GLOBAL_BOOL(lp_nis_home_map,&Globals.bNISHomeMap)
1208 static FN_GLOBAL_BOOL(lp_time_server,&Globals.bTimeServer)
1209 FN_GLOBAL_BOOL(lp_bind_interfaces_only,&Globals.bBindInterfacesOnly)
1210 FN_GLOBAL_BOOL(lp_unix_password_sync,&Globals.bUnixPasswdSync)
1211 FN_GLOBAL_BOOL(lp_passwd_chat_debug,&Globals.bPasswdChatDebug)
1212 FN_GLOBAL_BOOL(lp_ole_locking_compat,&Globals.bOleLockingCompat)
1213 FN_GLOBAL_BOOL(lp_nt_smb_support,&Globals.bNTSmbSupport)
1214 FN_GLOBAL_BOOL(lp_nt_pipe_support,&Globals.bNTPipeSupport)
1215 FN_GLOBAL_BOOL(lp_stat_cache,&Globals.bStatCache)
1217 FN_GLOBAL_INTEGER(lp_os_level,&Globals.os_level)
1218 FN_GLOBAL_INTEGER(lp_max_ttl,&Globals.max_ttl)
1219 FN_GLOBAL_INTEGER(lp_max_wins_ttl,&Globals.max_wins_ttl)
1220 FN_GLOBAL_INTEGER(lp_min_wins_ttl,&Globals.max_wins_ttl)
1221 FN_GLOBAL_INTEGER(lp_max_log_size,&Globals.max_log_size)
1222 FN_GLOBAL_INTEGER(lp_max_open_files,&Globals.max_open_files)
1223 FN_GLOBAL_INTEGER(lp_maxxmit,&Globals.max_xmit)
1224 FN_GLOBAL_INTEGER(lp_maxmux,&Globals.max_mux)
1225 FN_GLOBAL_INTEGER(lp_passwordlevel,&Globals.pwordlevel)
1226 FN_GLOBAL_INTEGER(lp_usernamelevel,&Globals.unamelevel)
1227 FN_GLOBAL_INTEGER(lp_readsize,&Globals.ReadSize)
1228 FN_GLOBAL_INTEGER(lp_shmem_size,&Globals.shmem_size)
1229 FN_GLOBAL_INTEGER(lp_deadtime,&Globals.deadtime)
1230 FN_GLOBAL_INTEGER(lp_maxprotocol,&Globals.maxprotocol)
1231 FN_GLOBAL_INTEGER(lp_security,&Globals.security)
1232 FN_GLOBAL_INTEGER(lp_maxdisksize,&Globals.maxdisksize)
1233 FN_GLOBAL_INTEGER(lp_lpqcachetime,&Globals.lpqcachetime)
1234 FN_GLOBAL_INTEGER(lp_syslog,&Globals.syslog)
1235 FN_GLOBAL_INTEGER(lp_client_code_page,&Globals.client_code_page)
1236 static FN_GLOBAL_INTEGER(lp_announce_as,&Globals.announce_as)
1237 FN_GLOBAL_INTEGER(lp_lm_announce,&Globals.lm_announce)
1238 FN_GLOBAL_INTEGER(lp_lm_interval,&Globals.lm_interval)
1239 FN_GLOBAL_INTEGER(lp_machine_password_timeout,&Globals.machine_password_timeout)
1240 FN_GLOBAL_INTEGER(lp_change_notify_timeout,&Globals.change_notify_timeout)
1241 FN_GLOBAL_INTEGER(lp_stat_cache_size,&Globals.stat_cache_size)
1242 FN_GLOBAL_INTEGER(lp_map_to_guest,&Globals.map_to_guest)
1245 FN_GLOBAL_INTEGER(lp_ldap_port,&Globals.ldap_port)
1246 #endif /* WITH_LDAP */
1248 FN_LOCAL_STRING(lp_preexec,szPreExec)
1249 FN_LOCAL_STRING(lp_postexec,szPostExec)
1250 FN_LOCAL_STRING(lp_rootpreexec,szRootPreExec)
1251 FN_LOCAL_STRING(lp_rootpostexec,szRootPostExec)
1252 FN_LOCAL_STRING(lp_servicename,szService)
1253 FN_LOCAL_STRING(lp_pathname,szPath)
1254 FN_LOCAL_STRING(lp_dontdescend,szDontdescend)
1255 FN_LOCAL_STRING(lp_username,szUsername)
1256 FN_LOCAL_STRING(lp_guestaccount,szGuestaccount)
1257 FN_LOCAL_STRING(lp_invalid_users,szInvalidUsers)
1258 FN_LOCAL_STRING(lp_valid_users,szValidUsers)
1259 FN_LOCAL_STRING(lp_admin_users,szAdminUsers)
1260 FN_LOCAL_STRING(lp_printcommand,szPrintcommand)
1261 FN_LOCAL_STRING(lp_lpqcommand,szLpqcommand)
1262 FN_LOCAL_STRING(lp_lprmcommand,szLprmcommand)
1263 FN_LOCAL_STRING(lp_lppausecommand,szLppausecommand)
1264 FN_LOCAL_STRING(lp_lpresumecommand,szLpresumecommand)
1265 FN_LOCAL_STRING(lp_queuepausecommand,szQueuepausecommand)
1266 FN_LOCAL_STRING(lp_queueresumecommand,szQueueresumecommand)
1267 FN_LOCAL_STRING(lp_printername,szPrintername)
1268 FN_LOCAL_STRING(lp_printerdriver,szPrinterDriver)
1269 FN_LOCAL_STRING(lp_hostsallow,szHostsallow)
1270 FN_LOCAL_STRING(lp_hostsdeny,szHostsdeny)
1271 FN_LOCAL_STRING(lp_magicscript,szMagicScript)
1272 FN_LOCAL_STRING(lp_magicoutput,szMagicOutput)
1273 FN_LOCAL_STRING(lp_comment,comment)
1274 FN_LOCAL_STRING(lp_force_user,force_user)
1275 FN_LOCAL_STRING(lp_force_group,force_group)
1276 FN_LOCAL_STRING(lp_readlist,readlist)
1277 FN_LOCAL_STRING(lp_writelist,writelist)
1278 FN_LOCAL_STRING(lp_fstype,fstype)
1279 static FN_LOCAL_STRING(lp_volume,volume)
1280 FN_LOCAL_STRING(lp_mangled_map,szMangledMap)
1281 FN_LOCAL_STRING(lp_veto_files,szVetoFiles)
1282 FN_LOCAL_STRING(lp_hide_files,szHideFiles)
1283 FN_LOCAL_STRING(lp_veto_oplocks,szVetoOplockFiles)
1284 FN_LOCAL_STRING(lp_driverlocation,szPrinterDriverLocation)
1286 FN_LOCAL_BOOL(lp_revalidate,bRevalidate)
1287 FN_LOCAL_BOOL(lp_casesensitive,bCaseSensitive)
1288 FN_LOCAL_BOOL(lp_preservecase,bCasePreserve)
1289 FN_LOCAL_BOOL(lp_shortpreservecase,bShortCasePreserve)
1290 FN_LOCAL_BOOL(lp_casemangle,bCaseMangle)
1291 FN_LOCAL_BOOL(lp_status,status)
1292 FN_LOCAL_BOOL(lp_hide_dot_files,bHideDotFiles)
1293 FN_LOCAL_BOOL(lp_browseable,bBrowseable)
1294 FN_LOCAL_BOOL(lp_readonly,bRead_only)
1295 FN_LOCAL_BOOL(lp_no_set_dir,bNo_set_dir)
1296 FN_LOCAL_BOOL(lp_guest_ok,bGuest_ok)
1297 FN_LOCAL_BOOL(lp_guest_only,bGuest_only)
1298 FN_LOCAL_BOOL(lp_print_ok,bPrint_ok)
1299 FN_LOCAL_BOOL(lp_postscript,bPostscript)
1300 FN_LOCAL_BOOL(lp_map_hidden,bMap_hidden)
1301 FN_LOCAL_BOOL(lp_map_archive,bMap_archive)
1302 FN_LOCAL_BOOL(lp_locking,bLocking)
1303 FN_LOCAL_BOOL(lp_strict_locking,bStrictLocking)
1304 FN_LOCAL_BOOL(lp_share_modes,bShareModes)
1305 FN_LOCAL_BOOL(lp_oplocks,bOpLocks)
1306 FN_LOCAL_BOOL(lp_onlyuser,bOnlyUser)
1307 FN_LOCAL_BOOL(lp_manglednames,bMangledNames)
1308 FN_LOCAL_BOOL(lp_widelinks,bWidelinks)
1309 FN_LOCAL_BOOL(lp_symlinks,bSymlinks)
1310 FN_LOCAL_BOOL(lp_syncalways,bSyncAlways)
1311 FN_LOCAL_BOOL(lp_strict_sync,bStrictSync)
1312 FN_LOCAL_BOOL(lp_map_system,bMap_system)
1313 FN_LOCAL_BOOL(lp_delete_readonly,bDeleteReadonly)
1314 FN_LOCAL_BOOL(lp_fake_oplocks,bFakeOplocks)
1315 FN_LOCAL_BOOL(lp_recursive_veto_delete,bDeleteVetoFiles)
1316 FN_LOCAL_BOOL(lp_dos_filetimes,bDosFiletimes)
1317 FN_LOCAL_BOOL(lp_dos_filetime_resolution,bDosFiletimeResolution)
1318 FN_LOCAL_BOOL(lp_fake_dir_create_times,bFakeDirCreateTimes)
1319 FN_LOCAL_BOOL(lp_blocking_locks,bBlockingLocks)
1321 FN_LOCAL_INTEGER(lp_create_mode,iCreate_mask)
1322 FN_LOCAL_INTEGER(lp_force_create_mode,iCreate_force_mode)
1323 FN_LOCAL_INTEGER(lp_dir_mode,iDir_mask)
1324 FN_LOCAL_INTEGER(lp_force_dir_mode,iDir_force_mode)
1325 FN_LOCAL_INTEGER(lp_max_connections,iMaxConnections)
1326 FN_LOCAL_INTEGER(lp_defaultcase,iDefaultCase)
1327 FN_LOCAL_INTEGER(lp_minprintspace,iMinPrintSpace)
1328 FN_LOCAL_INTEGER(lp_printing,iPrinting)
1330 FN_LOCAL_CHAR(lp_magicchar,magic_char)
1334 /* local prototypes */
1335 static int strwicmp( char *psz1, char *psz2 );
1336 static int map_parameter( char *pszParmName);
1337 static BOOL set_boolean( BOOL *pb, char *pszParmValue );
1338 static int getservicebyname(char *pszServiceName, service *pserviceDest);
1339 static void copy_service( service *pserviceDest,
1340 service *pserviceSource,
1341 BOOL *pcopymapDest );
1342 static BOOL service_ok(int iService);
1343 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1344 static BOOL do_section(char *pszSectionName);
1345 static void init_copymap(service *pservice);
1348 /***************************************************************************
1349 initialise a service to the defaults
1350 ***************************************************************************/
1351 static void init_service(service *pservice)
1353 bzero((char *)pservice,sizeof(service));
1354 copy_service(pservice,&sDefault,NULL);
1358 /***************************************************************************
1359 free the dynamically allocated parts of a service struct
1360 ***************************************************************************/
1361 static void free_service(service *pservice)
1367 if(pservice->szService)
1368 DEBUG(5,("free_service: Freeing service %s\n", pservice->szService));
1370 string_free(&pservice->szService);
1371 if (pservice->copymap)
1373 free(pservice->copymap);
1374 pservice->copymap = NULL;
1377 for (i=0;parm_table[i].label;i++)
1378 if ((parm_table[i].type == P_STRING ||
1379 parm_table[i].type == P_USTRING) &&
1380 parm_table[i].class == P_LOCAL)
1381 string_free((char **)(((char *)pservice) + PTR_DIFF(parm_table[i].ptr,&sDefault)));
1384 /***************************************************************************
1385 add a new service to the services array initialising it with the given
1387 ***************************************************************************/
1388 static int add_a_service(service *pservice, char *name)
1392 int num_to_alloc = iNumServices+1;
1394 tservice = *pservice;
1396 /* it might already exist */
1399 i = getservicebyname(name,NULL);
1404 /* find an invalid one */
1405 for (i=0;i<iNumServices;i++)
1406 if (!pSERVICE(i)->valid)
1409 /* if not, then create one */
1410 if (i == iNumServices)
1412 ServicePtrs = (service **)Realloc(ServicePtrs,sizeof(service *)*num_to_alloc);
1414 pSERVICE(iNumServices) = (service *)malloc(sizeof(service));
1416 if (!ServicePtrs || !pSERVICE(iNumServices))
1422 free_service(pSERVICE(i));
1424 pSERVICE(i)->valid = True;
1426 init_service(pSERVICE(i));
1427 copy_service(pSERVICE(i),&tservice,NULL);
1429 string_set(&iSERVICE(i).szService,name);
1434 /***************************************************************************
1435 add a new home service, with the specified home directory, defaults coming
1437 ***************************************************************************/
1438 BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
1440 int i = add_a_service(pSERVICE(iDefaultService),pszHomename);
1445 if (!(*(iSERVICE(i).szPath)) || strequal(iSERVICE(i).szPath,lp_pathname(-1)))
1446 string_set(&iSERVICE(i).szPath,pszHomedir);
1447 if (!(*(iSERVICE(i).comment)))
1450 slprintf(comment,sizeof(comment)-1,
1451 "Home directory of %s",pszHomename);
1452 string_set(&iSERVICE(i).comment,comment);
1454 iSERVICE(i).bAvailable = sDefault.bAvailable;
1455 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1457 DEBUG(3,("adding home directory %s at %s\n", pszHomename, pszHomedir));
1462 /***************************************************************************
1463 add a new service, based on an old one
1464 ***************************************************************************/
1465 int lp_add_service(char *pszService, int iDefaultService)
1467 return(add_a_service(pSERVICE(iDefaultService),pszService));
1471 /***************************************************************************
1473 ***************************************************************************/
1474 static BOOL lp_add_ipc(void)
1477 int i = add_a_service(&sDefault,"IPC$");
1482 slprintf(comment,sizeof(comment)-1,
1483 "IPC Service (%s)", Globals.szServerString );
1485 string_set(&iSERVICE(i).szPath,tmpdir());
1486 string_set(&iSERVICE(i).szUsername,"");
1487 string_set(&iSERVICE(i).comment,comment);
1488 string_set(&iSERVICE(i).fstype,"IPC");
1489 iSERVICE(i).status = False;
1490 iSERVICE(i).iMaxConnections = 0;
1491 iSERVICE(i).bAvailable = True;
1492 iSERVICE(i).bRead_only = True;
1493 iSERVICE(i).bGuest_only = False;
1494 iSERVICE(i).bGuest_ok = True;
1495 iSERVICE(i).bPrint_ok = False;
1496 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1498 DEBUG(3,("adding IPC service\n"));
1504 /***************************************************************************
1505 add a new printer service, with defaults coming from service iFrom
1506 ***************************************************************************/
1507 BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
1509 char *comment = "From Printcap";
1510 int i = add_a_service(pSERVICE(iDefaultService),pszPrintername);
1515 /* note that we do NOT default the availability flag to True - */
1516 /* we take it from the default service passed. This allows all */
1517 /* dynamic printers to be disabled by disabling the [printers] */
1518 /* entry (if/when the 'available' keyword is implemented!). */
1520 /* the printer name is set to the service name. */
1521 string_set(&iSERVICE(i).szPrintername,pszPrintername);
1522 string_set(&iSERVICE(i).comment,comment);
1523 iSERVICE(i).bBrowseable = sDefault.bBrowseable;
1524 /* Printers cannot be read_only. */
1525 iSERVICE(i).bRead_only = False;
1526 /* No share modes on printer services. */
1527 iSERVICE(i).bShareModes = False;
1528 /* No oplocks on printer services. */
1529 iSERVICE(i).bOpLocks = False;
1530 /* Printer services must be printable. */
1531 iSERVICE(i).bPrint_ok = True;
1533 DEBUG(3,("adding printer service %s\n",pszPrintername));
1539 /***************************************************************************
1540 Do a case-insensitive, whitespace-ignoring string compare.
1541 ***************************************************************************/
1542 static int strwicmp(char *psz1, char *psz2)
1544 /* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
1545 /* appropriate value. */
1555 /* sync the strings on first non-whitespace */
1558 while (isspace(*psz1))
1560 while (isspace(*psz2))
1562 if (toupper(*psz1) != toupper(*psz2) || *psz1 == '\0' || *psz2 == '\0')
1567 return (*psz1 - *psz2);
1570 /***************************************************************************
1571 Map a parameter's string representation to something we can use.
1572 Returns False if the parameter string is not recognised, else TRUE.
1573 ***************************************************************************/
1574 static int map_parameter(char *pszParmName)
1578 if (*pszParmName == '-')
1581 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1582 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
1585 DEBUG(0,( "Unknown parameter encountered: \"%s\"\n", pszParmName));
1590 /***************************************************************************
1591 Set a boolean variable from the text value stored in the passed string.
1592 Returns True in success, False if the passed string does not correctly
1593 represent a boolean.
1594 ***************************************************************************/
1595 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
1600 if (strwicmp(pszParmValue, "yes") == 0 ||
1601 strwicmp(pszParmValue, "true") == 0 ||
1602 strwicmp(pszParmValue, "1") == 0)
1605 if (strwicmp(pszParmValue, "no") == 0 ||
1606 strwicmp(pszParmValue, "False") == 0 ||
1607 strwicmp(pszParmValue, "0") == 0)
1611 DEBUG(0,("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
1618 /***************************************************************************
1619 Find a service by name. Otherwise works like get_service.
1620 ***************************************************************************/
1621 static int getservicebyname(char *pszServiceName, service *pserviceDest)
1625 for (iService = iNumServices - 1; iService >= 0; iService--)
1626 if (VALID(iService) &&
1627 strwicmp(iSERVICE(iService).szService, pszServiceName) == 0)
1629 if (pserviceDest != NULL)
1630 copy_service(pserviceDest, pSERVICE(iService), NULL);
1639 /***************************************************************************
1640 Copy a service structure to another
1642 If pcopymapDest is NULL then copy all fields
1643 ***************************************************************************/
1644 static void copy_service(service *pserviceDest,
1645 service *pserviceSource,
1649 BOOL bcopyall = (pcopymapDest == NULL);
1651 for (i=0;parm_table[i].label;i++)
1652 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
1653 (bcopyall || pcopymapDest[i]))
1655 void *def_ptr = parm_table[i].ptr;
1657 ((char *)pserviceSource) + PTR_DIFF(def_ptr,&sDefault);
1659 ((char *)pserviceDest) + PTR_DIFF(def_ptr,&sDefault);
1661 switch (parm_table[i].type)
1665 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
1671 *(int *)dest_ptr = *(int *)src_ptr;
1675 *(char *)dest_ptr = *(char *)src_ptr;
1679 string_set(dest_ptr,*(char **)src_ptr);
1683 string_set(dest_ptr,*(char **)src_ptr);
1684 strupper(*(char **)dest_ptr);
1693 init_copymap(pserviceDest);
1694 if (pserviceSource->copymap)
1695 memcpy((void *)pserviceDest->copymap,
1696 (void *)pserviceSource->copymap,sizeof(BOOL)*NUMPARAMETERS);
1700 /***************************************************************************
1701 Check a service for consistency. Return False if the service is in any way
1702 incomplete or faulty, else True.
1703 ***************************************************************************/
1704 static BOOL service_ok(int iService)
1709 if (iSERVICE(iService).szService[0] == '\0')
1711 DEBUG(0,( "The following message indicates an internal error:\n"));
1712 DEBUG(0,( "No service name in service entry.\n"));
1716 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
1717 /* I can't see why you'd want a non-printable printer service... */
1718 if (strwicmp(iSERVICE(iService).szService,PRINTERS_NAME) == 0)
1719 if (!iSERVICE(iService).bPrint_ok)
1721 DEBUG(0,( "WARNING: [%s] service MUST be printable!\n",
1722 iSERVICE(iService).szService));
1723 iSERVICE(iService).bPrint_ok = True;
1726 if (iSERVICE(iService).szPath[0] == '\0' &&
1727 strwicmp(iSERVICE(iService).szService,HOMES_NAME) != 0)
1729 DEBUG(0,("No path in service %s - using %s\n",iSERVICE(iService).szService,tmpdir()));
1730 string_set(&iSERVICE(iService).szPath,tmpdir());
1733 /* If a service is flagged unavailable, log the fact at level 0. */
1734 if (!iSERVICE(iService).bAvailable)
1735 DEBUG(1,( "NOTE: Service %s is flagged unavailable.\n",
1736 iSERVICE(iService).szService));
1741 static struct file_lists {
1742 struct file_lists *next;
1745 } *file_lists = NULL;
1747 /*******************************************************************
1748 keep a linked list of all config files so we know when one has changed
1749 it's date and needs to be reloaded
1750 ********************************************************************/
1751 static void add_to_file_list(char *fname)
1753 struct file_lists *f=file_lists;
1756 if (f->name && !strcmp(f->name,fname)) break;
1761 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
1763 f->next = file_lists;
1764 f->name = strdup(fname);
1775 standard_sub_basic(n2);
1776 f->modtime = file_modtime(n2);
1781 /*******************************************************************
1782 check if a config file has changed date
1783 ********************************************************************/
1784 BOOL lp_file_list_changed(void)
1786 struct file_lists *f = file_lists;
1787 DEBUG(6,("lp_file_list_changed()\n"));
1794 pstrcpy(n2,f->name);
1795 standard_sub_basic(n2);
1797 DEBUGADD( 6, ( "file %s -> %s last mod_time: %s\n",
1798 f->name, n2, ctime(&f->modtime) ) );
1800 mod_time = file_modtime(n2);
1802 if (f->modtime != mod_time) {
1803 DEBUGADD(6,("file %s modified: %s\n", n2, ctime(&mod_time)));
1804 f->modtime = mod_time;
1812 /***************************************************************************
1813 handle the interpretation of the coding system parameter
1814 *************************************************************************/
1815 static BOOL handle_coding_system(char *pszParmValue,char **ptr)
1817 string_set(ptr,pszParmValue);
1818 interpret_coding_system(pszParmValue);
1822 /***************************************************************************
1823 handle the interpretation of the character set system parameter
1824 ***************************************************************************/
1825 static BOOL handle_character_set(char *pszParmValue,char **ptr)
1827 string_set(ptr,pszParmValue);
1828 interpret_character_set(pszParmValue);
1833 /***************************************************************************
1834 handle the valid chars lines
1835 ***************************************************************************/
1836 static BOOL handle_valid_chars(char *pszParmValue,char **ptr)
1838 string_set(ptr,pszParmValue);
1840 /* A dependency here is that the parameter client code page must be
1841 set before this is called - as calling codepage_initialise()
1842 would overwrite the valid char lines.
1844 codepage_initialise(lp_client_code_page());
1846 add_char_string(pszParmValue);
1851 /***************************************************************************
1852 handle the include operation
1853 ***************************************************************************/
1854 static BOOL handle_include(char *pszParmValue,char **ptr)
1857 pstrcpy(fname,pszParmValue);
1859 add_to_file_list(fname);
1861 standard_sub_basic(fname);
1863 string_set(ptr,fname);
1865 if (file_exist(fname,NULL))
1866 return(pm_process(fname, do_section, do_parameter));
1868 DEBUG(2,("Can't find include file %s\n",fname));
1874 /***************************************************************************
1875 handle the interpretation of the copy parameter
1876 ***************************************************************************/
1877 static BOOL handle_copy(char *pszParmValue,char **ptr)
1881 service serviceTemp;
1883 string_set(ptr,pszParmValue);
1885 init_service(&serviceTemp);
1889 DEBUG(3,("Copying service from service %s\n",pszParmValue));
1891 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
1893 if (iTemp == iServiceIndex)
1895 DEBUG(0,("Can't copy service %s - unable to copy self!\n",
1900 copy_service(pSERVICE(iServiceIndex),
1902 iSERVICE(iServiceIndex).copymap);
1908 DEBUG(0,( "Unable to copy service - source not found: %s\n",
1913 free_service(&serviceTemp);
1918 /***************************************************************************
1919 initialise a copymap
1920 ***************************************************************************/
1921 static void init_copymap(service *pservice)
1924 if (pservice->copymap) free(pservice->copymap);
1925 pservice->copymap = (BOOL *)malloc(sizeof(BOOL)*NUMPARAMETERS);
1926 if (!pservice->copymap)
1927 DEBUG(0,("Couldn't allocate copymap!! (size %d)\n",NUMPARAMETERS));
1929 for (i=0;i<NUMPARAMETERS;i++)
1930 pservice->copymap[i] = True;
1934 /***************************************************************************
1935 return the local pointer to a parameter given the service number and the
1936 pointer into the default structure
1937 ***************************************************************************/
1938 void *lp_local_ptr(int snum, void *ptr)
1940 return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr,&sDefault));
1943 /***************************************************************************
1944 Process a parameter for a particular service number. If snum < 0
1945 then assume we are in the globals
1946 ***************************************************************************/
1947 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
1950 void *parm_ptr=NULL; /* where we are going to store the result */
1953 parmnum = map_parameter(pszParmName);
1957 DEBUG(0,( "Ignoring unknown parameter \"%s\"\n", pszParmName));
1961 if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
1962 DEBUG(1,("WARNING: The \"%s\"option is deprecated\n",
1966 def_ptr = parm_table[parmnum].ptr;
1968 /* we might point at a service, the default service or a global */
1972 if (parm_table[parmnum].class == P_GLOBAL) {
1973 DEBUG(0,( "Global parameter %s found in service section!\n",pszParmName));
1976 parm_ptr = ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,&sDefault);
1980 if (!iSERVICE(snum).copymap)
1981 init_copymap(pSERVICE(snum));
1983 /* this handles the aliases - set the copymap for other entries with
1984 the same data pointer */
1985 for (i=0;parm_table[i].label;i++)
1986 if (parm_table[i].ptr == parm_table[parmnum].ptr)
1987 iSERVICE(snum).copymap[i] = False;
1990 /* if it is a special case then go ahead */
1991 if (parm_table[parmnum].special) {
1992 parm_table[parmnum].special(pszParmValue,(char **)parm_ptr);
1996 /* now switch on the type of variable it is */
1997 switch (parm_table[parmnum].type)
2000 set_boolean(parm_ptr,pszParmValue);
2004 set_boolean(parm_ptr,pszParmValue);
2005 *(BOOL *)parm_ptr = ! *(BOOL *)parm_ptr;
2009 *(int *)parm_ptr = atoi(pszParmValue);
2013 *(char *)parm_ptr = *pszParmValue;
2017 sscanf(pszParmValue,"%o",(int *)parm_ptr);
2021 string_set(parm_ptr,pszParmValue);
2025 string_set(parm_ptr,pszParmValue);
2026 strupper(*(char **)parm_ptr);
2030 pstrcpy((char *)parm_ptr,pszParmValue);
2034 pstrcpy((char *)parm_ptr,pszParmValue);
2035 strupper((char *)parm_ptr);
2039 for (i=0;parm_table[parmnum].enum_list[i].name;i++) {
2040 if (strequal(pszParmValue, parm_table[parmnum].enum_list[i].name)) {
2041 *(int *)parm_ptr = parm_table[parmnum].enum_list[i].value;
2053 /***************************************************************************
2054 Process a parameter.
2055 ***************************************************************************/
2056 static BOOL do_parameter( char *pszParmName, char *pszParmValue )
2058 if( !bInGlobalSection && bGlobalOnly )
2061 DEBUGADD( 3, ( "doing parameter %s = %s\n", pszParmName, pszParmValue ) );
2063 return( lp_do_parameter( bInGlobalSection ? -2 : iServiceIndex,
2069 /***************************************************************************
2070 print a parameter of the specified type
2071 ***************************************************************************/
2072 static void print_parameter(struct parm_struct *p,void *ptr, FILE *f)
2077 for (i=0;p->enum_list[i].name;i++) {
2078 if (*(int *)ptr == p->enum_list[i].value) {
2079 fprintf(f,"%s",p->enum_list[i].name);
2086 fprintf(f,"%s",BOOLSTR(*(BOOL *)ptr));
2090 fprintf(f,"%s",BOOLSTR(! *(BOOL *)ptr));
2094 fprintf(f,"%d",*(int *)ptr);
2098 fprintf(f,"%c",*(char *)ptr);
2102 fprintf(f,"0%o",*(int *)ptr);
2108 fprintf(f,"%s",(char *)ptr);
2114 fprintf(f,"%s",*(char **)ptr);
2122 /***************************************************************************
2123 check if two parameters are equal
2124 ***************************************************************************/
2125 static BOOL equal_parameter(parm_type type,void *ptr1,void *ptr2)
2131 return(*((BOOL *)ptr1) == *((BOOL *)ptr2));
2136 return(*((int *)ptr1) == *((int *)ptr2));
2139 return(*((char *)ptr1) == *((char *)ptr2));
2144 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
2145 if (p1 && !*p1) p1 = NULL;
2146 if (p2 && !*p2) p2 = NULL;
2147 return(p1==p2 || strequal(p1,p2));
2152 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
2153 if (p1 && !*p1) p1 = NULL;
2154 if (p2 && !*p2) p2 = NULL;
2155 return(p1==p2 || strequal(p1,p2));
2163 /***************************************************************************
2164 Process a new section (service). At this stage all sections are services.
2165 Later we'll have special sections that permit server parameters to be set.
2166 Returns True on success, False on failure.
2167 ***************************************************************************/
2168 static BOOL do_section(char *pszSectionName)
2171 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
2172 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
2175 /* if we were in a global section then do the local inits */
2176 if (bInGlobalSection && !isglobal)
2179 /* if we've just struck a global section, note the fact. */
2180 bInGlobalSection = isglobal;
2182 /* check for multiple global sections */
2183 if (bInGlobalSection)
2185 DEBUG( 3, ( "Processing section \"[%s]\"\n", pszSectionName ) );
2189 if (!bInGlobalSection && bGlobalOnly) return(True);
2191 /* if we have a current service, tidy it up before moving on */
2194 if (iServiceIndex >= 0)
2195 bRetval = service_ok(iServiceIndex);
2197 /* if all is still well, move to the next record in the services array */
2200 /* We put this here to avoid an odd message order if messages are */
2201 /* issued by the post-processing of a previous section. */
2202 DEBUG(2,( "Processing section \"[%s]\"\n", pszSectionName));
2204 if ((iServiceIndex=add_a_service(&sDefault,pszSectionName)) < 0)
2206 DEBUG(0,("Failed to add a new service\n"));
2215 /***************************************************************************
2216 determine if a partcular base parameter is currently set to the default value.
2217 ***************************************************************************/
2218 static BOOL is_default(int i)
2220 if (!defaults_saved) return False;
2221 switch (parm_table[i].type) {
2224 return strequal(parm_table[i].def.svalue,*(char **)parm_table[i].ptr);
2227 return strequal(parm_table[i].def.svalue,(char *)parm_table[i].ptr);
2230 return parm_table[i].def.bvalue == *(BOOL *)parm_table[i].ptr;
2232 return parm_table[i].def.cvalue == *(char *)parm_table[i].ptr;
2236 return parm_table[i].def.ivalue == *(int *)parm_table[i].ptr;
2244 /***************************************************************************
2245 Display the contents of the global structure.
2246 ***************************************************************************/
2247 static void dump_globals(FILE *f)
2250 fprintf(f, "# Global parameters\n");
2252 for (i=0;parm_table[i].label;i++)
2253 if (parm_table[i].class == P_GLOBAL &&
2254 parm_table[i].ptr &&
2255 (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr))) {
2256 if (defaults_saved && is_default(i)) continue;
2257 fprintf(f,"\t%s = ",parm_table[i].label);
2258 print_parameter(&parm_table[i],parm_table[i].ptr, f);
2263 /***************************************************************************
2264 return True if a local parameter is currently set to the global default
2265 ***************************************************************************/
2266 BOOL lp_is_default(int snum, struct parm_struct *parm)
2268 int pdiff = PTR_DIFF(parm->ptr,&sDefault);
2270 return equal_parameter(parm->type,
2271 ((char *)pSERVICE(snum)) + pdiff,
2272 ((char *)&sDefault) + pdiff);
2276 /***************************************************************************
2277 Display the contents of a single services record.
2278 ***************************************************************************/
2279 static void dump_a_service(service *pService, FILE *f)
2282 if (pService != &sDefault)
2283 fprintf(f,"\n[%s]\n",pService->szService);
2285 for (i=0;parm_table[i].label;i++)
2286 if (parm_table[i].class == P_LOCAL &&
2287 parm_table[i].ptr &&
2288 (*parm_table[i].label != '-') &&
2289 (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr))) {
2290 int pdiff = PTR_DIFF(parm_table[i].ptr,&sDefault);
2292 if (pService == &sDefault) {
2293 if (defaults_saved && is_default(i)) continue;
2295 if (equal_parameter(parm_table[i].type,
2296 ((char *)pService) + pdiff,
2297 ((char *)&sDefault) + pdiff))
2301 fprintf(f,"\t%s = ",parm_table[i].label);
2302 print_parameter(&parm_table[i],
2303 ((char *)pService) + pdiff, f);
2309 /***************************************************************************
2310 return info about the next service in a service. snum==-1 gives the globals
2312 return NULL when out of parameters
2313 ***************************************************************************/
2314 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
2317 /* do the globals */
2318 for (;parm_table[*i].label;(*i)++) {
2319 if (parm_table[*i].class == P_SEPARATOR)
2320 return &parm_table[(*i)++];
2322 if (!parm_table[*i].ptr || (*parm_table[*i].label == '-'))
2325 if ((*i) > 0 && (parm_table[*i].ptr == parm_table[(*i)-1].ptr))
2328 return &parm_table[(*i)++];
2331 service *pService = pSERVICE(snum);
2333 for (;parm_table[*i].label;(*i)++) {
2334 if (parm_table[*i].class == P_SEPARATOR)
2335 return &parm_table[(*i)++];
2337 if (parm_table[*i].class == P_LOCAL &&
2338 parm_table[*i].ptr &&
2339 (*parm_table[*i].label != '-') &&
2341 (parm_table[*i].ptr != parm_table[(*i)-1].ptr))) {
2342 int pdiff = PTR_DIFF(parm_table[*i].ptr,&sDefault);
2344 if (allparameters ||
2345 !equal_parameter(parm_table[*i].type,
2346 ((char *)pService) + pdiff,
2347 ((char *)&sDefault) + pdiff)) {
2348 return &parm_table[(*i)++];
2359 /***************************************************************************
2360 Display the contents of a single copy structure.
2361 ***************************************************************************/
2362 static void dump_copy_map(BOOL *pcopymap)
2365 if (!pcopymap) return;
2367 printf("\n\tNon-Copied parameters:\n");
2369 for (i=0;parm_table[i].label;i++)
2370 if (parm_table[i].class == P_LOCAL &&
2371 parm_table[i].ptr && !pcopymap[i] &&
2372 (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr)))
2374 printf("\t\t%s\n",parm_table[i].label);
2379 /***************************************************************************
2380 Return TRUE if the passed service number is within range.
2381 ***************************************************************************/
2382 BOOL lp_snum_ok(int iService)
2384 return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
2388 /***************************************************************************
2389 auto-load some home services
2390 ***************************************************************************/
2391 static void lp_add_auto_services(char *str)
2402 homes = lp_servicenumber(HOMES_NAME);
2404 for (p=strtok(s,LIST_SEP);p;p=strtok(NULL,LIST_SEP)) {
2405 char *home = get_home_dir(p);
2407 if (lp_servicenumber(p) >= 0) continue;
2409 if (home && homes >= 0) {
2410 lp_add_home(p,homes,home);
2416 /***************************************************************************
2417 auto-load one printer
2418 ***************************************************************************/
2419 void lp_add_one_printer(char *name,char *comment)
2421 int printers = lp_servicenumber(PRINTERS_NAME);
2424 if (lp_servicenumber(name) < 0) {
2425 lp_add_printer(name,printers);
2426 if ((i=lp_servicenumber(name)) >= 0)
2427 string_set(&iSERVICE(i).comment,comment);
2431 /***************************************************************************
2432 have we loaded a services file yet?
2433 ***************************************************************************/
2434 BOOL lp_loaded(void)
2439 /***************************************************************************
2440 unload unused services
2441 ***************************************************************************/
2442 void lp_killunused(BOOL (*snumused)(int ))
2445 for (i=0;i<iNumServices;i++)
2446 if (VALID(i) && (!snumused || !snumused(i)))
2448 iSERVICE(i).valid = False;
2449 free_service(pSERVICE(i));
2454 /***************************************************************************
2455 save the curent values of all global and sDefault parameters into the
2456 defaults union. This allows swat and testparm to show only the
2457 changed (ie. non-default) parameters.
2458 ***************************************************************************/
2459 static void lp_save_defaults(void)
2462 for (i = 0; parm_table[i].label; i++) {
2463 if (i>0 && parm_table[i].ptr == parm_table[i-1].ptr) continue;
2464 switch (parm_table[i].type) {
2467 parm_table[i].def.svalue = strdup(*(char **)parm_table[i].ptr);
2471 parm_table[i].def.svalue = strdup((char *)parm_table[i].ptr);
2475 parm_table[i].def.bvalue = *(BOOL *)parm_table[i].ptr;
2478 parm_table[i].def.cvalue = *(char *)parm_table[i].ptr;
2483 parm_table[i].def.ivalue = *(int *)parm_table[i].ptr;
2489 defaults_saved = True;
2493 /***************************************************************************
2494 Load the services array from the services file. Return True on success,
2496 ***************************************************************************/
2497 BOOL lp_load(char *pszFname,BOOL global_only, BOOL save_defaults, BOOL add_ipc)
2502 add_to_file_list(pszFname);
2506 bInGlobalSection = True;
2507 bGlobalOnly = global_only;
2511 if (save_defaults) {
2516 pstrcpy(n2,pszFname);
2517 standard_sub_basic(n2);
2519 /* We get sections first, so have to start 'behind' to make up */
2521 bRetval = pm_process(n2, do_section, do_parameter);
2523 /* finish up the last section */
2524 DEBUG(3,("pm_process() returned %s\n", BOOLSTR(bRetval)));
2526 if (iServiceIndex >= 0)
2527 bRetval = service_ok(iServiceIndex);
2529 lp_add_auto_services(lp_auto_services());
2534 set_default_server_announce_type();
2538 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
2539 /* if bWINSsupport is true and we are in the client */
2541 if (in_client && Globals.bWINSsupport) {
2543 string_set(&Globals.szWINSserver, "127.0.0.1");
2551 /***************************************************************************
2552 return the max number of services
2553 ***************************************************************************/
2554 int lp_numservices(void)
2556 return(iNumServices);
2559 /***************************************************************************
2560 Display the contents of the services array in human-readable form.
2561 ***************************************************************************/
2562 void lp_dump(FILE *f, BOOL show_defaults)
2566 if (show_defaults) {
2567 defaults_saved = False;
2572 dump_a_service(&sDefault, f);
2574 for (iService = 0; iService < iNumServices; iService++)
2576 if (VALID(iService))
2578 if (iSERVICE(iService).szService[0] == '\0')
2580 dump_a_service(pSERVICE(iService), f);
2586 /***************************************************************************
2587 Return the number of the service with the given name, or -1 if it doesn't
2588 exist. Note that this is a DIFFERENT ANIMAL from the internal function
2589 getservicebyname()! This works ONLY if all services have been loaded, and
2590 does not copy the found service.
2591 ***************************************************************************/
2592 int lp_servicenumber(char *pszServiceName)
2596 for (iService = iNumServices - 1; iService >= 0; iService--)
2597 if (VALID(iService) &&
2598 strequal(lp_servicename(iService), pszServiceName))
2602 DEBUG(7,("lp_servicenumber: couldn't find %s\n",pszServiceName));
2607 /*******************************************************************
2608 a useful volume label function
2609 ******************************************************************/
2610 char *volume_label(int snum)
2612 char *ret = lp_volume(snum);
2613 if (!*ret) return(lp_servicename(snum));
2618 /*******************************************************************
2619 Set the server type we will announce as via nmbd.
2620 ********************************************************************/
2621 static void set_default_server_announce_type(void)
2623 default_server_announce = 0;
2624 default_server_announce |= SV_TYPE_WORKSTATION;
2625 default_server_announce |= SV_TYPE_SERVER;
2626 default_server_announce |= SV_TYPE_SERVER_UNIX;
2627 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
2629 switch (lp_announce_as())
2631 case ANNOUNCE_AS_NT:
2633 default_server_announce |= SV_TYPE_SERVER_NT;
2634 default_server_announce |= SV_TYPE_NT;
2637 case ANNOUNCE_AS_WIN95:
2639 default_server_announce |= SV_TYPE_WIN95_PLUS;
2642 case ANNOUNCE_AS_WFW:
2644 default_server_announce |= SV_TYPE_WFW;
2653 switch (lp_server_role())
2655 case ROLE_DOMAIN_MEMBER:
2657 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
2660 case ROLE_DOMAIN_PDC:
2662 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
2665 case ROLE_DOMAIN_BDC:
2667 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
2670 case ROLE_DOMAIN_NONE:
2677 if (lp_time_server())
2679 default_server_announce |= SV_TYPE_TIME_SOURCE;
2684 /*******************************************************************
2686 ********************************************************************/
2687 void lp_remove_service(int snum)
2689 pSERVICE(snum)->valid = False;
2692 /*******************************************************************
2694 ********************************************************************/
2695 void lp_copy_service(int snum, char *new_name)
2697 char *oldname = lp_servicename(snum);
2698 do_section(new_name);
2700 snum = lp_servicenumber(new_name);
2702 lp_do_parameter(snum, "copy", oldname);
2707 /*******************************************************************
2708 Get the default server type we will announce as via nmbd.
2709 ********************************************************************/
2710 int lp_default_server_announce(void)
2712 return default_server_announce;
2715 /*******************************************************************
2716 Split the announce version into major and minor numbers.
2717 ********************************************************************/
2718 int lp_major_announce_version(void)
2720 static BOOL got_major = False;
2721 static int major_version = DEFAULT_MAJOR_VERSION;
2726 return major_version;
2729 if((vers = lp_announce_version()) == NULL)
2730 return major_version;
2732 if((p = strchr(vers, '.')) == 0)
2733 return major_version;
2736 major_version = atoi(vers);
2737 return major_version;
2740 int lp_minor_announce_version(void)
2742 static BOOL got_minor = False;
2743 static int minor_version = DEFAULT_MINOR_VERSION;
2748 return minor_version;
2751 if((vers = lp_announce_version()) == NULL)
2752 return minor_version;
2754 if((p = strchr(vers, '.')) == 0)
2755 return minor_version;
2758 minor_version = atoi(p);
2759 return minor_version;
2762 /***********************************************************
2763 Set the global name resolution order (used in smbclient).
2764 ************************************************************/
2766 void lp_set_name_resolve_order(char *new_order)
2768 Globals.szNameResolveOrder = new_order;
2771 /***********************************************************
2772 Set the flag that says if kernel oplocks are available
2774 ************************************************************/
2776 static BOOL kernel_oplocks_available = False;
2778 void lp_set_kernel_oplocks(BOOL val)
2781 * Only set this to True if kerenl
2782 * oplocks are really available and were
2783 * turned on in the smb.conf file.
2786 if(Globals.bKernelOplocks && val)
2787 kernel_oplocks_available = True;
2789 kernel_oplocks_available = False;
2792 /***********************************************************
2793 Return True if kernel oplocks are available and were turned
2795 ************************************************************/
2797 BOOL lp_kernel_oplocks(void)
2799 return kernel_oplocks_available;
2802 /***********************************************************
2803 returns role of Samba server
2804 ************************************************************/
2805 int lp_server_role(void)
2807 switch (lp_security())
2811 if (lp_domain_logons())
2813 DEBUG(0,("Server's Role (logon server) conflicts with share-level security\n"));
2815 return ROLE_DOMAIN_NONE;
2820 if (lp_domain_logons())
2822 return ROLE_DOMAIN_BDC;
2824 return ROLE_DOMAIN_MEMBER;
2828 if (lp_domain_logons())
2830 return ROLE_DOMAIN_PDC;
2832 return ROLE_DOMAIN_NONE;
2836 DEBUG(0,("Server's Role undefined due to unknown security mode\n"));
2837 return ROLE_DOMAIN_NONE;