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