~vcs-imports/samba/main

« back to all changes in this revision

Viewing changes to source/param/loadparm.c

  • Committer: jerry
  • Date: 2006-07-14 21:48:39 UTC
  • Revision ID: vcs-imports@canonical.com-20060714214839-586d8c489a8fcead
gutting trunk to move to svn:externals

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* 
2
 
   Unix SMB/CIFS implementation.
3
 
   Parameter loading functions
4
 
   Copyright (C) Karl Auer 1993-1998
5
 
 
6
 
   Largely re-written by Andrew Tridgell, September 1994
7
 
 
8
 
   Copyright (C) Simo Sorce 2001
9
 
   Copyright (C) Alexander Bokovoy 2002
10
 
   Copyright (C) Stefan (metze) Metzmacher 2002
11
 
   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
12
 
   
13
 
   This program is free software; you can redistribute it and/or modify
14
 
   it under the terms of the GNU General Public License as published by
15
 
   the Free Software Foundation; either version 2 of the License, or
16
 
   (at your option) any later version.
17
 
   
18
 
   This program is distributed in the hope that it will be useful,
19
 
   but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 
   GNU General Public License for more details.
22
 
   
23
 
   You should have received a copy of the GNU General Public License
24
 
   along with this program; if not, write to the Free Software
25
 
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26
 
*/
27
 
 
28
 
/*
29
 
 *  Load parameters.
30
 
 *
31
 
 *  This module provides suitable callback functions for the params
32
 
 *  module. It builds the internal table of service details which is
33
 
 *  then used by the rest of the server.
34
 
 *
35
 
 * To add a parameter:
36
 
 *
37
 
 * 1) add it to the global or service structure definition
38
 
 * 2) add it to the parm_table
39
 
 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
40
 
 * 4) If it's a global then initialise it in init_globals. If a local
41
 
 *    (ie. service) parameter then initialise it in the sDefault structure
42
 
 *  
43
 
 *
44
 
 * Notes:
45
 
 *   The configuration file is processed sequentially for speed. It is NOT
46
 
 *   accessed randomly as happens in 'real' Windows. For this reason, there
47
 
 *   is a fair bit of sequence-dependent code here - ie., code which assumes
48
 
 *   that certain things happen before others. In particular, the code which
49
 
 *   happens at the boundary between sections is delicately poised, so be
50
 
 *   careful!
51
 
 *
52
 
 */
53
 
 
54
 
#include "includes.h"
55
 
 
56
 
BOOL in_client = False;         /* Not in the client by default */
57
 
BOOL bLoaded = False;
58
 
 
59
 
extern pstring user_socket_options;
60
 
extern enum protocol_types Protocol;
61
 
extern userdom_struct current_user_info;
62
 
 
63
 
#ifndef GLOBAL_NAME
64
 
#define GLOBAL_NAME "global"
65
 
#endif
66
 
 
67
 
#ifndef PRINTERS_NAME
68
 
#define PRINTERS_NAME "printers"
69
 
#endif
70
 
 
71
 
#ifndef HOMES_NAME
72
 
#define HOMES_NAME "homes"
73
 
#endif
74
 
 
75
 
/* some helpful bits */
76
 
#define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
77
 
#define VALID(i) (ServicePtrs != NULL && ServicePtrs[i]->valid)
78
 
 
79
 
#define USERSHARE_VALID 1
80
 
#define USERSHARE_PENDING_DELETE 2
81
 
 
82
 
int keepalive = DEFAULT_KEEPALIVE;
83
 
BOOL use_getwd_cache = True;
84
 
 
85
 
extern int extra_time_offset;
86
 
 
87
 
static BOOL defaults_saved = False;
88
 
 
89
 
typedef struct _param_opt_struct param_opt_struct;
90
 
struct _param_opt_struct {
91
 
        param_opt_struct *prev, *next;
92
 
        char *key;
93
 
        char *value;
94
 
        char **list;
95
 
};
96
 
 
97
 
/* 
98
 
 * This structure describes global (ie., server-wide) parameters.
99
 
 */
100
 
typedef struct {
101
 
        char *smb_ports;
102
 
        char *dos_charset;
103
 
        char *unix_charset;
104
 
        char *display_charset;
105
 
        char *szPrintcapname;
106
 
        char *szAddPortCommand;
107
 
        char *szEnumPortsCommand;
108
 
        char *szAddPrinterCommand;
109
 
        char *szDeletePrinterCommand;
110
 
        char *szOs2DriverMap;
111
 
        char *szLockDir;
112
 
        char *szPidDir;
113
 
        char *szRootdir;
114
 
        char *szDefaultService;
115
 
        char *szGetQuota;
116
 
        char *szSetQuota;
117
 
        char *szMsgCommand;
118
 
        char *szServerString;
119
 
        char *szAutoServices;
120
 
        char *szPasswdProgram;
121
 
        char *szPasswdChat;
122
 
        char *szLogFile;
123
 
        char *szConfigFile;
124
 
        char *szSMBPasswdFile;
125
 
        char *szPrivateDir;
126
 
        char *szPassdbBackend;
127
 
        char **szPreloadModules;
128
 
        char *szPasswordServer;
129
 
        char *szSocketOptions;
130
 
        char *szRealm;
131
 
        char *szAfsUsernameMap;
132
 
        int iAfsTokenLifetime;
133
 
        char *szLogNtTokenCommand;
134
 
        char *szUsernameMap;
135
 
        char *szLogonScript;
136
 
        char *szLogonPath;
137
 
        char *szLogonDrive;
138
 
        char *szLogonHome;
139
 
        char **szWINSservers;
140
 
        char **szInterfaces;
141
 
        char *szRemoteAnnounce;
142
 
        char *szRemoteBrowseSync;
143
 
        char *szSocketAddress;
144
 
        char *szNISHomeMapName;
145
 
        char *szAnnounceVersion;        /* This is initialised in init_globals */
146
 
        char *szWorkgroup;
147
 
        char *szNetbiosName;
148
 
        char **szNetbiosAliases;
149
 
        char *szNetbiosScope;
150
 
        char *szNameResolveOrder;
151
 
        char *szPanicAction;
152
 
        char *szAddUserScript;
153
 
        char *szRenameUserScript;
154
 
        char *szDelUserScript;
155
 
        char *szAddGroupScript;
156
 
        char *szDelGroupScript;
157
 
        char *szAddUserToGroupScript;
158
 
        char *szDelUserFromGroupScript;
159
 
        char *szSetPrimaryGroupScript;
160
 
        char *szAddMachineScript;
161
 
        char *szShutdownScript;
162
 
        char *szAbortShutdownScript;
163
 
        char *szUsernameMapScript;
164
 
        char *szCheckPasswordScript;
165
 
        char *szWINSHook;
166
 
        char *szUtmpDir;
167
 
        char *szWtmpDir;
168
 
        BOOL bUtmp;
169
 
        char *szIdmapUID;
170
 
        char *szIdmapGID;
171
 
        BOOL bPassdbExpandExplicit;
172
 
        int AlgorithmicRidBase;
173
 
        char *szTemplateHomedir;
174
 
        char *szTemplateShell;
175
 
        char *szWinbindSeparator;
176
 
        BOOL bWinbindEnumUsers;
177
 
        BOOL bWinbindEnumGroups;
178
 
        BOOL bWinbindUseDefaultDomain;
179
 
        BOOL bWinbindTrustedDomainsOnly;
180
 
        BOOL bWinbindNestedGroups;
181
 
        BOOL bWinbindRefreshTickets;
182
 
        BOOL bWinbindOfflineLogon;
183
 
        char **szIdmapBackend;
184
 
        char *szAddShareCommand;
185
 
        char *szChangeShareCommand;
186
 
        char *szDeleteShareCommand;
187
 
        char **szEventLogs;
188
 
        char *szGuestaccount;
189
 
        char *szManglingMethod;
190
 
        char **szServicesList;
191
 
        char *szUsersharePath;
192
 
        char *szUsershareTemplateShare;
193
 
        char **szUsersharePrefixAllowList;
194
 
        char **szUsersharePrefixDenyList;
195
 
        int mangle_prefix;
196
 
        int max_log_size;
197
 
        char *szLogLevel;
198
 
        int max_xmit;
199
 
        int max_mux;
200
 
        int max_open_files;
201
 
        int open_files_db_hash_size;
202
 
        int pwordlevel;
203
 
        int unamelevel;
204
 
        int deadtime;
205
 
        int maxprotocol;
206
 
        int minprotocol;
207
 
        int security;
208
 
        char **AuthMethods;
209
 
        BOOL paranoid_server_security;
210
 
        int maxdisksize;
211
 
        int lpqcachetime;
212
 
        int iMaxSmbdProcesses;
213
 
        BOOL bDisableSpoolss;
214
 
        int syslog;
215
 
        int os_level;
216
 
        int enhanced_browsing;
217
 
        int max_ttl;
218
 
        int max_wins_ttl;
219
 
        int min_wins_ttl;
220
 
        int lm_announce;
221
 
        int lm_interval;
222
 
        int announce_as;        /* This is initialised in init_globals */
223
 
        int machine_password_timeout;
224
 
        int map_to_guest;
225
 
        int oplock_break_wait_time;
226
 
        int winbind_cache_time;
227
 
        int winbind_max_idle_children;
228
 
        char **szWinbindNssInfo;
229
 
        int iLockSpinCount;
230
 
        int iLockSpinTime;
231
 
        char *szLdapMachineSuffix;
232
 
        char *szLdapUserSuffix;
233
 
        char *szLdapIdmapSuffix;
234
 
        char *szLdapGroupSuffix;
235
 
        int ldap_ssl;
236
 
        char *szLdapSuffix;
237
 
        char *szLdapAdminDn;
238
 
        int iAclCompat;
239
 
        char *szCupsServer;
240
 
        char *szIPrintServer;
241
 
        int ldap_passwd_sync; 
242
 
        int ldap_replication_sleep;
243
 
        int ldap_timeout; /* This is initialised in init_globals */
244
 
        int ldap_page_size;
245
 
        BOOL ldap_delete_dn;
246
 
        BOOL bMsAddPrinterWizard;
247
 
        BOOL bDNSproxy;
248
 
        BOOL bWINSsupport;
249
 
        BOOL bWINSproxy;
250
 
        BOOL bLocalMaster;
251
 
        BOOL bPreferredMaster;
252
 
        BOOL bDomainMaster;
253
 
        BOOL bDomainLogons;
254
 
        BOOL bEncryptPasswords;
255
 
        BOOL bUpdateEncrypt;
256
 
        int  clientSchannel;
257
 
        int  serverSchannel;
258
 
        BOOL bNullPasswords;
259
 
        BOOL bObeyPamRestrictions;
260
 
        BOOL bLoadPrinters;
261
 
        int PrintcapCacheTime;
262
 
        BOOL bLargeReadwrite;
263
 
        BOOL bReadRaw;
264
 
        BOOL bWriteRaw;
265
 
        BOOL bReadbmpx;
266
 
        BOOL bSyslogOnly;
267
 
        BOOL bBrowseList;
268
 
        BOOL bNISHomeMap;
269
 
        BOOL bTimeServer;
270
 
        BOOL bBindInterfacesOnly;
271
 
        BOOL bPamPasswordChange;
272
 
        BOOL bUnixPasswdSync;
273
 
        BOOL bPasswdChatDebug;
274
 
        int iPasswdChatTimeout;
275
 
        BOOL bTimestampLogs;
276
 
        BOOL bNTSmbSupport;
277
 
        BOOL bNTPipeSupport;
278
 
        BOOL bNTStatusSupport;
279
 
        BOOL bStatCache;
280
 
        int iMaxStatCacheSize;
281
 
        BOOL bKernelOplocks;
282
 
        BOOL bAllowTrustedDomains;
283
 
        BOOL bLanmanAuth;
284
 
        BOOL bNTLMAuth;
285
 
        BOOL bUseSpnego;
286
 
        BOOL bClientLanManAuth;
287
 
        BOOL bClientNTLMv2Auth;
288
 
        BOOL bClientPlaintextAuth;
289
 
        BOOL bClientUseSpnego;
290
 
        BOOL bDebugHiresTimestamp;
291
 
        BOOL bDebugPid;
292
 
        BOOL bDebugUid;
293
 
        BOOL bEnableCoreFiles;
294
 
        BOOL bHostMSDfs;
295
 
        BOOL bUseMmap;
296
 
        BOOL bHostnameLookups;
297
 
        BOOL bUnixExtensions;
298
 
        BOOL bDisableNetbios;
299
 
        BOOL bKernelChangeNotify;
300
 
        BOOL bFamChangeNotify;
301
 
        BOOL bUseKerberosKeytab;
302
 
        BOOL bDeferSharingViolations;
303
 
        BOOL bEnablePrivileges;
304
 
        BOOL bASUSupport;
305
 
        BOOL bUsershareOwnerOnly;
306
 
        BOOL bUsershareAllowGuests;
307
 
        int restrict_anonymous;
308
 
        int name_cache_timeout;
309
 
        int client_signing;
310
 
        int server_signing;
311
 
        int iUsershareMaxShares;
312
 
 
313
 
        BOOL bResetOnZeroVC;
314
 
        param_opt_struct *param_opt;
315
 
} global;
316
 
 
317
 
static global Globals;
318
 
 
319
 
/* 
320
 
 * This structure describes a single service. 
321
 
 */
322
 
typedef struct {
323
 
        BOOL valid;
324
 
        BOOL autoloaded;
325
 
        int usershare;
326
 
        time_t usershare_last_mod;
327
 
        char *szService;
328
 
        char *szPath;
329
 
        char *szUsername;
330
 
        char **szInvalidUsers;
331
 
        char **szValidUsers;
332
 
        char **szAdminUsers;
333
 
        char *szCopy;
334
 
        char *szInclude;
335
 
        char *szPreExec;
336
 
        char *szPostExec;
337
 
        char *szRootPreExec;
338
 
        char *szRootPostExec;
339
 
        char *szCupsOptions;
340
 
        char *szPrintcommand;
341
 
        char *szLpqcommand;
342
 
        char *szLprmcommand;
343
 
        char *szLppausecommand;
344
 
        char *szLpresumecommand;
345
 
        char *szQueuepausecommand;
346
 
        char *szQueueresumecommand;
347
 
        char *szPrintername;
348
 
        char *szDontdescend;
349
 
        char **szHostsallow;
350
 
        char **szHostsdeny;
351
 
        char *szMagicScript;
352
 
        char *szMagicOutput;
353
 
        char *szMangledMap;
354
 
        char *szVetoFiles;
355
 
        char *szHideFiles;
356
 
        char *szVetoOplockFiles;
357
 
        char *comment;
358
 
        char *force_user;
359
 
        char *force_group;
360
 
        char **readlist;
361
 
        char **writelist;
362
 
        char **printer_admin;
363
 
        char *volume;
364
 
        char *fstype;
365
 
        char **szVfsObjects;
366
 
        char *szMSDfsProxy;
367
 
        char *szAioWriteBehind;
368
 
        char *szDfree;
369
 
        int iMinPrintSpace;
370
 
        int iMaxPrintJobs;
371
 
        int iMaxReportedPrintJobs;
372
 
        int iWriteCacheSize;
373
 
        int iCreate_mask;
374
 
        int iCreate_force_mode;
375
 
        int iSecurity_mask;
376
 
        int iSecurity_force_mode;
377
 
        int iDir_mask;
378
 
        int iDir_force_mode;
379
 
        int iDir_Security_mask;
380
 
        int iDir_Security_force_mode;
381
 
        int iMaxConnections;
382
 
        int iDefaultCase;
383
 
        int iPrinting;
384
 
        int iOplockContentionLimit;
385
 
        int iCSCPolicy;
386
 
        int iBlock_size;
387
 
        int iDfreeCacheTime;
388
 
        BOOL bPreexecClose;
389
 
        BOOL bRootpreexecClose;
390
 
        int  iCaseSensitive;
391
 
        BOOL bCasePreserve;
392
 
        BOOL bShortCasePreserve;
393
 
        BOOL bHideDotFiles;
394
 
        BOOL bHideSpecialFiles;
395
 
        BOOL bHideUnReadable;
396
 
        BOOL bHideUnWriteableFiles;
397
 
        BOOL bBrowseable;
398
 
        BOOL bAvailable;
399
 
        BOOL bRead_only;
400
 
        BOOL bNo_set_dir;
401
 
        BOOL bGuest_only;
402
 
        BOOL bGuest_ok;
403
 
        BOOL bPrint_ok;
404
 
        BOOL bMap_system;
405
 
        BOOL bMap_hidden;
406
 
        BOOL bMap_archive;
407
 
        BOOL bStoreDosAttributes;
408
 
        BOOL bDmapiSupport;
409
 
        BOOL bLocking;
410
 
        int iStrictLocking;
411
 
        BOOL bPosixLocking;
412
 
        BOOL bShareModes;
413
 
        BOOL bOpLocks;
414
 
        BOOL bLevel2OpLocks;
415
 
        BOOL bOnlyUser;
416
 
        BOOL bMangledNames;
417
 
        BOOL bWidelinks;
418
 
        BOOL bSymlinks;
419
 
        BOOL bSyncAlways;
420
 
        BOOL bStrictAllocate;
421
 
        BOOL bStrictSync;
422
 
        char magic_char;
423
 
        BOOL *copymap;
424
 
        BOOL bDeleteReadonly;
425
 
        BOOL bFakeOplocks;
426
 
        BOOL bDeleteVetoFiles;
427
 
        BOOL bDosFilemode;
428
 
        BOOL bDosFiletimes;
429
 
        BOOL bDosFiletimeResolution;
430
 
        BOOL bFakeDirCreateTimes;
431
 
        BOOL bBlockingLocks;
432
 
        BOOL bInheritPerms;
433
 
        BOOL bInheritACLS;
434
 
        BOOL bInheritOwner;
435
 
        BOOL bMSDfsRoot;
436
 
        BOOL bUseClientDriver;
437
 
        BOOL bDefaultDevmode;
438
 
        BOOL bForcePrintername;
439
 
        BOOL bNTAclSupport;
440
 
        BOOL bForceUnknownAclUser;
441
 
        BOOL bUseSendfile;
442
 
        BOOL bProfileAcls;
443
 
        BOOL bMap_acl_inherit;
444
 
        BOOL bAfs_Share;
445
 
        BOOL bEASupport;
446
 
        BOOL bAclCheckPermissions;
447
 
        BOOL bAclMapFullControl;
448
 
        BOOL bAclGroupControl;
449
 
        int iallocation_roundup_size;
450
 
        int iAioReadSize;
451
 
        int iAioWriteSize;
452
 
        int iMap_readonly;
453
 
        int ichange_notify_timeout;
454
 
        param_opt_struct *param_opt;
455
 
 
456
 
        char dummy[3];          /* for alignment */
457
 
} service;
458
 
 
459
 
 
460
 
/* This is a default service used to prime a services structure */
461
 
static service sDefault = {
462
 
        True,                   /* valid */
463
 
        False,                  /* not autoloaded */
464
 
        0,                      /* not a usershare */
465
 
        (time_t)0,              /* No last mod time */
466
 
        NULL,                   /* szService */
467
 
        NULL,                   /* szPath */
468
 
        NULL,                   /* szUsername */
469
 
        NULL,                   /* szInvalidUsers */
470
 
        NULL,                   /* szValidUsers */
471
 
        NULL,                   /* szAdminUsers */
472
 
        NULL,                   /* szCopy */
473
 
        NULL,                   /* szInclude */
474
 
        NULL,                   /* szPreExec */
475
 
        NULL,                   /* szPostExec */
476
 
        NULL,                   /* szRootPreExec */
477
 
        NULL,                   /* szRootPostExec */
478
 
        NULL,                   /* szCupsOptions */
479
 
        NULL,                   /* szPrintcommand */
480
 
        NULL,                   /* szLpqcommand */
481
 
        NULL,                   /* szLprmcommand */
482
 
        NULL,                   /* szLppausecommand */
483
 
        NULL,                   /* szLpresumecommand */
484
 
        NULL,                   /* szQueuepausecommand */
485
 
        NULL,                   /* szQueueresumecommand */
486
 
        NULL,                   /* szPrintername */
487
 
        NULL,                   /* szDontdescend */
488
 
        NULL,                   /* szHostsallow */
489
 
        NULL,                   /* szHostsdeny */
490
 
        NULL,                   /* szMagicScript */
491
 
        NULL,                   /* szMagicOutput */
492
 
        NULL,                   /* szMangledMap */
493
 
        NULL,                   /* szVetoFiles */
494
 
        NULL,                   /* szHideFiles */
495
 
        NULL,                   /* szVetoOplockFiles */
496
 
        NULL,                   /* comment */
497
 
        NULL,                   /* force user */
498
 
        NULL,                   /* force group */
499
 
        NULL,                   /* readlist */
500
 
        NULL,                   /* writelist */
501
 
        NULL,                   /* printer admin */
502
 
        NULL,                   /* volume */
503
 
        NULL,                   /* fstype */
504
 
        NULL,                   /* vfs objects */
505
 
        NULL,                   /* szMSDfsProxy */
506
 
        NULL,                   /* szAioWriteBehind */
507
 
        NULL,                   /* szDfree */
508
 
        0,                      /* iMinPrintSpace */
509
 
        1000,                   /* iMaxPrintJobs */
510
 
        0,                      /* iMaxReportedPrintJobs */
511
 
        0,                      /* iWriteCacheSize */
512
 
        0744,                   /* iCreate_mask */
513
 
        0000,                   /* iCreate_force_mode */
514
 
        0777,                   /* iSecurity_mask */
515
 
        0,                      /* iSecurity_force_mode */
516
 
        0755,                   /* iDir_mask */
517
 
        0000,                   /* iDir_force_mode */
518
 
        0777,                   /* iDir_Security_mask */
519
 
        0,                      /* iDir_Security_force_mode */
520
 
        0,                      /* iMaxConnections */
521
 
        CASE_LOWER,             /* iDefaultCase */
522
 
        DEFAULT_PRINTING,       /* iPrinting */
523
 
        2,                      /* iOplockContentionLimit */
524
 
        0,                      /* iCSCPolicy */
525
 
        1024,                   /* iBlock_size */
526
 
        0,                      /* iDfreeCacheTime */
527
 
        False,                  /* bPreexecClose */
528
 
        False,                  /* bRootpreexecClose */
529
 
        Auto,                   /* case sensitive */
530
 
        True,                   /* case preserve */
531
 
        True,                   /* short case preserve */
532
 
        True,                   /* bHideDotFiles */
533
 
        False,                  /* bHideSpecialFiles */
534
 
        False,                  /* bHideUnReadable */
535
 
        False,                  /* bHideUnWriteableFiles */
536
 
        True,                   /* bBrowseable */
537
 
        True,                   /* bAvailable */
538
 
        True,                   /* bRead_only */
539
 
        True,                   /* bNo_set_dir */
540
 
        False,                  /* bGuest_only */
541
 
        False,                  /* bGuest_ok */
542
 
        False,                  /* bPrint_ok */
543
 
        False,                  /* bMap_system */
544
 
        False,                  /* bMap_hidden */
545
 
        True,                   /* bMap_archive */
546
 
        False,                  /* bStoreDosAttributes */
547
 
        False,                  /* bDmapiSupport */
548
 
        True,                   /* bLocking */
549
 
        Auto,                   /* iStrictLocking */
550
 
        True,                   /* bPosixLocking */
551
 
        True,                   /* bShareModes */
552
 
        True,                   /* bOpLocks */
553
 
        True,                   /* bLevel2OpLocks */
554
 
        False,                  /* bOnlyUser */
555
 
        True,                   /* bMangledNames */
556
 
        True,                   /* bWidelinks */
557
 
        True,                   /* bSymlinks */
558
 
        False,                  /* bSyncAlways */
559
 
        False,                  /* bStrictAllocate */
560
 
        False,                  /* bStrictSync */
561
 
        '~',                    /* magic char */
562
 
        NULL,                   /* copymap */
563
 
        False,                  /* bDeleteReadonly */
564
 
        False,                  /* bFakeOplocks */
565
 
        False,                  /* bDeleteVetoFiles */
566
 
        False,                  /* bDosFilemode */
567
 
        True,                   /* bDosFiletimes */
568
 
        False,                  /* bDosFiletimeResolution */
569
 
        False,                  /* bFakeDirCreateTimes */
570
 
        True,                   /* bBlockingLocks */
571
 
        False,                  /* bInheritPerms */
572
 
        False,                  /* bInheritACLS */
573
 
        False,                  /* bInheritOwner */
574
 
        True,                   /* bMSDfsRoot */
575
 
        False,                  /* bUseClientDriver */
576
 
        True,                   /* bDefaultDevmode */
577
 
        False,                  /* bForcePrintername */
578
 
        True,                   /* bNTAclSupport */
579
 
        False,                  /* bForceUnknownAclUser */
580
 
        False,                  /* bUseSendfile */
581
 
        False,                  /* bProfileAcls */
582
 
        False,                  /* bMap_acl_inherit */
583
 
        False,                  /* bAfs_Share */
584
 
        False,                  /* bEASupport */
585
 
        True,                   /* bAclCheckPermissions */
586
 
        True,                   /* bAclMapFullControl */
587
 
        False,                  /* bAclGroupControl */
588
 
        SMB_ROUNDUP_ALLOCATION_SIZE,            /* iallocation_roundup_size */
589
 
        0,                      /* iAioReadSize */
590
 
        0,                      /* iAioWriteSize */
591
 
        MAP_READONLY_YES,       /* iMap_readonly */
592
 
        60,                     /* ichange_notify_timeout = 1 minute default. */
593
 
        
594
 
        NULL,                   /* Parametric options */
595
 
 
596
 
        ""                      /* dummy */
597
 
};
598
 
 
599
 
/* local variables */
600
 
static service **ServicePtrs = NULL;
601
 
static int iNumServices = 0;
602
 
static int iServiceIndex = 0;
603
 
static TDB_CONTEXT *ServiceHash;
604
 
static int *invalid_services = NULL;
605
 
static int num_invalid_services = 0;
606
 
static BOOL bInGlobalSection = True;
607
 
static BOOL bGlobalOnly = False;
608
 
static int server_role;
609
 
static int default_server_announce;
610
 
 
611
 
#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
612
 
 
613
 
/* prototypes for the special type handlers */
614
 
static BOOL handle_include( int snum, const char *pszParmValue, char **ptr);
615
 
static BOOL handle_copy( int snum, const char *pszParmValue, char **ptr);
616
 
static BOOL handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
617
 
static BOOL handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
618
 
static BOOL handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
619
 
static BOOL handle_debug_list( int snum, const char *pszParmValue, char **ptr );
620
 
static BOOL handle_workgroup( int snum, const char *pszParmValue, char **ptr );
621
 
static BOOL handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
622
 
static BOOL handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
623
 
static BOOL handle_charset( int snum, const char *pszParmValue, char **ptr );
624
 
static BOOL handle_printing( int snum, const char *pszParmValue, char **ptr);
625
 
 
626
 
static void set_server_role(void);
627
 
static void set_default_server_announce_type(void);
628
 
static void set_allowed_client_auth(void);
629
 
 
630
 
static const struct enum_list enum_protocol[] = {
631
 
        {PROTOCOL_NT1, "NT1"},
632
 
        {PROTOCOL_LANMAN2, "LANMAN2"},
633
 
        {PROTOCOL_LANMAN1, "LANMAN1"},
634
 
        {PROTOCOL_CORE, "CORE"},
635
 
        {PROTOCOL_COREPLUS, "COREPLUS"},
636
 
        {PROTOCOL_COREPLUS, "CORE+"},
637
 
        {-1, NULL}
638
 
};
639
 
 
640
 
static const struct enum_list enum_security[] = {
641
 
        {SEC_SHARE, "SHARE"},
642
 
        {SEC_USER, "USER"},
643
 
        {SEC_SERVER, "SERVER"},
644
 
        {SEC_DOMAIN, "DOMAIN"},
645
 
#ifdef HAVE_ADS
646
 
        {SEC_ADS, "ADS"},
647
 
#endif
648
 
        {-1, NULL}
649
 
};
650
 
 
651
 
static const struct enum_list enum_printing[] = {
652
 
        {PRINT_SYSV, "sysv"},
653
 
        {PRINT_AIX, "aix"},
654
 
        {PRINT_HPUX, "hpux"},
655
 
        {PRINT_BSD, "bsd"},
656
 
        {PRINT_QNX, "qnx"},
657
 
        {PRINT_PLP, "plp"},
658
 
        {PRINT_LPRNG, "lprng"},
659
 
        {PRINT_CUPS, "cups"},
660
 
        {PRINT_IPRINT, "iprint"},
661
 
        {PRINT_LPRNT, "nt"},
662
 
        {PRINT_LPROS2, "os2"},
663
 
#ifdef DEVELOPER
664
 
        {PRINT_TEST, "test"},
665
 
        {PRINT_VLP, "vlp"},
666
 
#endif /* DEVELOPER */
667
 
        {-1, NULL}
668
 
};
669
 
 
670
 
static const struct enum_list enum_ldap_ssl[] = {
671
 
        {LDAP_SSL_OFF, "no"},
672
 
        {LDAP_SSL_OFF, "No"},
673
 
        {LDAP_SSL_OFF, "off"},
674
 
        {LDAP_SSL_OFF, "Off"},
675
 
        {LDAP_SSL_START_TLS, "start tls"},
676
 
        {LDAP_SSL_START_TLS, "Start_tls"},
677
 
        {-1, NULL}
678
 
};
679
 
 
680
 
static const struct enum_list enum_ldap_passwd_sync[] = {
681
 
        {LDAP_PASSWD_SYNC_OFF, "no"},
682
 
        {LDAP_PASSWD_SYNC_OFF, "No"},
683
 
        {LDAP_PASSWD_SYNC_OFF, "off"},
684
 
        {LDAP_PASSWD_SYNC_OFF, "Off"},
685
 
        {LDAP_PASSWD_SYNC_ON, "Yes"},
686
 
        {LDAP_PASSWD_SYNC_ON, "yes"},
687
 
        {LDAP_PASSWD_SYNC_ON, "on"},
688
 
        {LDAP_PASSWD_SYNC_ON, "On"},
689
 
        {LDAP_PASSWD_SYNC_ONLY, "Only"},
690
 
        {LDAP_PASSWD_SYNC_ONLY, "only"},
691
 
        {-1, NULL}
692
 
};
693
 
 
694
 
/* Types of machine we can announce as. */
695
 
#define ANNOUNCE_AS_NT_SERVER 1
696
 
#define ANNOUNCE_AS_WIN95 2
697
 
#define ANNOUNCE_AS_WFW 3
698
 
#define ANNOUNCE_AS_NT_WORKSTATION 4
699
 
 
700
 
static const struct enum_list enum_announce_as[] = {
701
 
        {ANNOUNCE_AS_NT_SERVER, "NT"},
702
 
        {ANNOUNCE_AS_NT_SERVER, "NT Server"},
703
 
        {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
704
 
        {ANNOUNCE_AS_WIN95, "win95"},
705
 
        {ANNOUNCE_AS_WFW, "WfW"},
706
 
        {-1, NULL}
707
 
};
708
 
 
709
 
static const struct enum_list enum_map_readonly[] = {
710
 
        {MAP_READONLY_NO, "no"},
711
 
        {MAP_READONLY_NO, "false"},
712
 
        {MAP_READONLY_NO, "0"},
713
 
        {MAP_READONLY_YES, "yes"},
714
 
        {MAP_READONLY_YES, "true"},
715
 
        {MAP_READONLY_YES, "1"},
716
 
        {MAP_READONLY_PERMISSIONS, "permissions"},
717
 
        {MAP_READONLY_PERMISSIONS, "perms"},
718
 
        {-1, NULL}
719
 
};
720
 
 
721
 
static const struct enum_list enum_case[] = {
722
 
        {CASE_LOWER, "lower"},
723
 
        {CASE_UPPER, "upper"},
724
 
        {-1, NULL}
725
 
};
726
 
 
727
 
static const struct enum_list enum_bool_auto[] = {
728
 
        {False, "No"},
729
 
        {False, "False"},
730
 
        {False, "0"},
731
 
        {True, "Yes"},
732
 
        {True, "True"},
733
 
        {True, "1"},
734
 
        {Auto, "Auto"},
735
 
        {-1, NULL}
736
 
};
737
 
 
738
 
/* Client-side offline caching policy types */
739
 
#define CSC_POLICY_MANUAL 0
740
 
#define CSC_POLICY_DOCUMENTS 1
741
 
#define CSC_POLICY_PROGRAMS 2
742
 
#define CSC_POLICY_DISABLE 3
743
 
 
744
 
static const struct enum_list enum_csc_policy[] = {
745
 
        {CSC_POLICY_MANUAL, "manual"},
746
 
        {CSC_POLICY_DOCUMENTS, "documents"},
747
 
        {CSC_POLICY_PROGRAMS, "programs"},
748
 
        {CSC_POLICY_DISABLE, "disable"},
749
 
        {-1, NULL}
750
 
};
751
 
 
752
 
/* SMB signing types. */
753
 
static const struct enum_list enum_smb_signing_vals[] = {
754
 
        {False, "No"},
755
 
        {False, "False"},
756
 
        {False, "0"},
757
 
        {False, "Off"},
758
 
        {False, "disabled"},
759
 
        {True, "Yes"},
760
 
        {True, "True"},
761
 
        {True, "1"},
762
 
        {True, "On"},
763
 
        {True, "enabled"},
764
 
        {Auto, "auto"},
765
 
        {Required, "required"},
766
 
        {Required, "mandatory"},
767
 
        {Required, "force"},
768
 
        {Required, "forced"},
769
 
        {Required, "enforced"},
770
 
        {-1, NULL}
771
 
};
772
 
 
773
 
/* ACL compatibility options. */
774
 
static const struct enum_list enum_acl_compat_vals[] = {
775
 
    { ACL_COMPAT_AUTO, "auto" },
776
 
    { ACL_COMPAT_WINNT, "winnt" },
777
 
    { ACL_COMPAT_WIN2K, "win2k" },
778
 
    { -1, NULL}
779
 
};
780
 
 
781
 
/* 
782
 
   Do you want session setups at user level security with a invalid
783
 
   password to be rejected or allowed in as guest? WinNT rejects them
784
 
   but it can be a pain as it means "net view" needs to use a password
785
 
 
786
 
   You have 3 choices in the setting of map_to_guest:
787
 
 
788
 
   "Never" means session setups with an invalid password
789
 
   are rejected. This is the default.
790
 
 
791
 
   "Bad User" means session setups with an invalid password
792
 
   are rejected, unless the username does not exist, in which case it
793
 
   is treated as a guest login
794
 
 
795
 
   "Bad Password" means session setups with an invalid password
796
 
   are treated as a guest login
797
 
 
798
 
   Note that map_to_guest only has an effect in user or server
799
 
   level security.
800
 
*/
801
 
 
802
 
static const struct enum_list enum_map_to_guest[] = {
803
 
        {NEVER_MAP_TO_GUEST, "Never"},
804
 
        {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
805
 
        {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
806
 
        {MAP_TO_GUEST_ON_BAD_UID, "Bad Uid"},
807
 
        {-1, NULL}
808
 
};
809
 
 
810
 
/* Note: We do not initialise the defaults union - it is not allowed in ANSI C
811
 
 *
812
 
 * The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
813
 
 * screen in SWAT. This is used to exclude parameters as well as to squash all
814
 
 * parameters that have been duplicated by pseudonyms.
815
 
 *
816
 
 * NOTE: To display a parameter in BASIC view set FLAG_BASIC
817
 
 *       Any parameter that does NOT have FLAG_ADVANCED will not disply at all
818
 
 *       Set FLAG_SHARE and FLAG_PRINT to specifically display parameters in
819
 
 *        respective views.
820
 
 *
821
 
 * NOTE2: Handling of duplicated (synonym) paramters:
822
 
 *      Only the first occurance of a parameter should be enabled by FLAG_BASIC
823
 
 *      and/or FLAG_ADVANCED. All duplicates following the first mention should be
824
 
 *      set to FLAG_HIDE. ie: Make you must place the parameter that has the preferred
825
 
 *      name first, and all synonyms must follow it with the FLAG_HIDE attribute.
826
 
 */
827
 
 
828
 
static struct parm_struct parm_table[] = {
829
 
        {N_("Base Options"), P_SEP, P_SEPARATOR}, 
830
 
 
831
 
        {"dos charset", P_STRING, P_GLOBAL, &Globals.dos_charset, handle_charset, NULL, FLAG_ADVANCED}, 
832
 
        {"unix charset", P_STRING, P_GLOBAL, &Globals.unix_charset, handle_charset, NULL, FLAG_ADVANCED}, 
833
 
        {"display charset", P_STRING, P_GLOBAL, &Globals.display_charset, handle_charset, NULL, FLAG_ADVANCED}, 
834
 
        {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
835
 
        {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
836
 
        {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_HIDE}, 
837
 
        {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkgroup, handle_workgroup, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
838
 
#ifdef WITH_ADS
839
 
        {"realm", P_USTRING, P_GLOBAL, &Globals.szRealm, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
840
 
#endif
841
 
        {"netbios name", P_USTRING, P_GLOBAL, &Globals.szNetbiosName, handle_netbios_name, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
842
 
        {"netbios aliases", P_LIST, P_GLOBAL, &Globals.szNetbiosAliases, handle_netbios_aliases,  NULL, FLAG_ADVANCED}, 
843
 
        {"netbios scope", P_USTRING, P_GLOBAL, &Globals.szNetbiosScope, handle_netbios_scope,  NULL, FLAG_ADVANCED}, 
844
 
        {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED }, 
845
 
        {"interfaces", P_LIST, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
846
 
        {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
847
 
 
848
 
        {N_("Security Options"), P_SEP, P_SEPARATOR}, 
849
 
 
850
 
        {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
851
 
        {"auth methods", P_LIST, P_GLOBAL, &Globals.AuthMethods, NULL, NULL, FLAG_ADVANCED}, 
852
 
        {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
853
 
        {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_ADVANCED}, 
854
 
        {"client schannel", P_ENUM, P_GLOBAL, &Globals.clientSchannel, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
855
 
        {"server schannel", P_ENUM, P_GLOBAL, &Globals.serverSchannel, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
856
 
        {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, FLAG_ADVANCED}, 
857
 
        {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, FLAG_ADVANCED}, 
858
 
        {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED}, 
859
 
        {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED}, 
860
 
        {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
861
 
        {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED}, 
862
 
        {"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED}, 
863
 
        {"passdb backend", P_STRING, P_GLOBAL, &Globals.szPassdbBackend, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
864
 
        {"algorithmic rid base", P_INTEGER, P_GLOBAL, &Globals.AlgorithmicRidBase, NULL, NULL, FLAG_ADVANCED}, 
865
 
        {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_ADVANCED}, 
866
 
        {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE}, 
867
 
        {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE}, 
868
 
        {"guest account", P_STRING, P_GLOBAL, &Globals.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
869
 
        {"enable privileges", P_BOOL, P_GLOBAL, &Globals.bEnablePrivileges, NULL, NULL, FLAG_ADVANCED}, 
870
 
 
871
 
        {"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, FLAG_ADVANCED}, 
872
 
        {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, FLAG_ADVANCED}, 
873
 
        {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED}, 
874
 
        {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, FLAG_ADVANCED}, 
875
 
        {"passwd chat timeout", P_INTEGER, P_GLOBAL, &Globals.iPasswdChatTimeout, NULL, NULL, FLAG_ADVANCED}, 
876
 
        {"check password script", P_STRING, P_GLOBAL, &Globals.szCheckPasswordScript, NULL, NULL, FLAG_ADVANCED}, 
877
 
        {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, FLAG_ADVANCED}, 
878
 
        {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED}, 
879
 
        {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, FLAG_ADVANCED}, 
880
 
        {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, FLAG_ADVANCED}, 
881
 
        {"restrict anonymous", P_INTEGER, P_GLOBAL, &Globals.restrict_anonymous, NULL, NULL, FLAG_ADVANCED}, 
882
 
        {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, FLAG_ADVANCED}, 
883
 
        {"ntlm auth", P_BOOL, P_GLOBAL, &Globals.bNTLMAuth, NULL, NULL, FLAG_ADVANCED}, 
884
 
        {"client NTLMv2 auth", P_BOOL, P_GLOBAL, &Globals.bClientNTLMv2Auth, NULL, NULL, FLAG_ADVANCED}, 
885
 
        {"client lanman auth", P_BOOL, P_GLOBAL, &Globals.bClientLanManAuth, NULL, NULL, FLAG_ADVANCED}, 
886
 
        {"client plaintext auth", P_BOOL, P_GLOBAL, &Globals.bClientPlaintextAuth, NULL, NULL, FLAG_ADVANCED}, 
887
 
 
888
 
        {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
889
 
        {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE}, 
890
 
        {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE}, 
891
 
 
892
 
        {"invalid users", P_LIST, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
893
 
        {"valid users", P_LIST, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
894
 
        {"admin users", P_LIST, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
895
 
        {"read list", P_LIST, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
896
 
        {"write list", P_LIST, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
897
 
        {"printer admin", P_LIST, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_PRINT | FLAG_DEPRECATED }, 
898
 
        {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
899
 
        {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
900
 
        {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_ADVANCED}, 
901
 
 
902
 
        {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE}, 
903
 
        {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE}, 
904
 
        {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE}, 
905
 
        {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE}, 
906
 
 
907
 
        {"acl check permissions", P_BOOL, P_LOCAL, &sDefault.bAclCheckPermissions, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
908
 
        {"acl group control", P_BOOL, P_LOCAL, &sDefault.bAclGroupControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE | FLAG_DEPRECATED },
909
 
        {"acl map full control", P_BOOL, P_LOCAL, &sDefault.bAclMapFullControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
910
 
        {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
911
 
        {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_HIDE}, 
912
 
        {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
913
 
        {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
914
 
        {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
915
 
        {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
916
 
        {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
917
 
        {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
918
 
        {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
919
 
        {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
920
 
        {"force unknown acl user", P_BOOL, P_LOCAL, &sDefault.bForceUnknownAclUser, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
921
 
        {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
922
 
        {"inherit acls", P_BOOL, P_LOCAL, &sDefault.bInheritACLS, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
923
 
        {"inherit owner", P_BOOL, P_LOCAL, &sDefault.bInheritOwner, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
924
 
        {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
925
 
        {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_HIDE}, 
926
 
 
927
 
        {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
928
 
        {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_HIDE}, 
929
 
 
930
 
        {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED}, 
931
 
        {"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
932
 
        {"allow hosts", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_HIDE}, 
933
 
        {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
934
 
        {"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_HIDE}, 
935
 
        {"preload modules", P_LIST, P_GLOBAL, &Globals.szPreloadModules, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
936
 
        {"use kerberos keytab", P_BOOL, P_GLOBAL, &Globals.bUseKerberosKeytab, NULL, NULL, FLAG_ADVANCED}, 
937
 
 
938
 
        {N_("Logging Options"), P_SEP, P_SEPARATOR}, 
939
 
 
940
 
        {"log level", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_ADVANCED}, 
941
 
        {"debuglevel", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_HIDE}, 
942
 
        {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, FLAG_ADVANCED}, 
943
 
        {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, FLAG_ADVANCED}, 
944
 
        {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, FLAG_ADVANCED}, 
945
 
 
946
 
        {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, FLAG_ADVANCED}, 
947
 
        {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_ADVANCED}, 
948
 
        {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_ADVANCED}, 
949
 
        {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, FLAG_ADVANCED}, 
950
 
        {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, FLAG_ADVANCED}, 
951
 
        {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, FLAG_ADVANCED}, 
952
 
        {"enable core files", P_BOOL, P_GLOBAL, &Globals.bEnableCoreFiles, NULL, NULL, FLAG_ADVANCED},
953
 
 
954
 
        {N_("Protocol Options"), P_SEP, P_SEPARATOR}, 
955
 
 
956
 
        {"allocation roundup size", P_INTEGER, P_LOCAL, &sDefault.iallocation_roundup_size, NULL, NULL, FLAG_ADVANCED}, 
957
 
        {"aio read size", P_INTEGER, P_LOCAL, &sDefault.iAioReadSize, NULL, NULL, FLAG_ADVANCED}, 
958
 
        {"aio write size", P_INTEGER, P_LOCAL, &sDefault.iAioWriteSize, NULL, NULL, FLAG_ADVANCED}, 
959
 
        {"aio write behind", P_STRING, P_LOCAL, &sDefault.szAioWriteBehind, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
960
 
        {"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED}, 
961
 
        {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_ADVANCED}, 
962
 
        {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
963
 
        {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
964
 
        {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
965
 
        {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, FLAG_ADVANCED}, 
966
 
        {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, FLAG_ADVANCED}, 
967
 
        {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, FLAG_ADVANCED}, 
968
 
        {"disable netbios", P_BOOL, P_GLOBAL, &Globals.bDisableNetbios, NULL, NULL, FLAG_ADVANCED}, 
969
 
        {"reset on zero vc", P_BOOL, P_GLOBAL, &Globals.bResetOnZeroVC, NULL, NULL, FLAG_ADVANCED}, 
970
 
 
971
 
        {"acl compatibility", P_ENUM, P_GLOBAL, &Globals.iAclCompat, NULL,  enum_acl_compat_vals, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
972
 
        {"defer sharing violations", P_BOOL, P_GLOBAL, &Globals.bDeferSharingViolations, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
973
 
        {"ea support", P_BOOL, P_LOCAL, &sDefault.bEASupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
974
 
        {"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
975
 
        {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, FLAG_ADVANCED}, 
976
 
        {"nt status support", P_BOOL, P_GLOBAL, &Globals.bNTStatusSupport, NULL, NULL, FLAG_ADVANCED}, 
977
 
        {"profile acls", P_BOOL, P_LOCAL, &sDefault.bProfileAcls, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
978
 
 
979
 
        {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, FLAG_ADVANCED}, 
980
 
        {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as,  FLAG_ADVANCED}, 
981
 
        {"map acl inherit", P_BOOL, P_LOCAL, &sDefault.bMap_acl_inherit, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
982
 
        {"afs share", P_BOOL, P_LOCAL, &sDefault.bAfs_Share, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
983
 
        {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, FLAG_ADVANCED}, 
984
 
        {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, FLAG_ADVANCED}, 
985
 
 
986
 
        {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
987
 
        {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, FLAG_ADVANCED}, 
988
 
        {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, FLAG_ADVANCED}, 
989
 
        {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, FLAG_ADVANCED}, 
990
 
        {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, FLAG_ADVANCED}, 
991
 
        {"unix extensions", P_BOOL, P_GLOBAL, &Globals.bUnixExtensions, NULL, NULL, FLAG_ADVANCED}, 
992
 
        {"use spnego", P_BOOL, P_GLOBAL, &Globals.bUseSpnego, NULL, NULL, FLAG_ADVANCED}, 
993
 
        {"client signing", P_ENUM, P_GLOBAL, &Globals.client_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED}, 
994
 
        {"server signing", P_ENUM, P_GLOBAL, &Globals.server_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED}, 
995
 
        {"client use spnego", P_BOOL, P_GLOBAL, &Globals.bClientUseSpnego, NULL, NULL, FLAG_ADVANCED}, 
996
 
 
997
 
        {"enable asu support", P_BOOL, P_GLOBAL, &Globals.bASUSupport, NULL, NULL, FLAG_ADVANCED}, 
998
 
        {"svcctl list", P_LIST, P_GLOBAL, &Globals.szServicesList, NULL, NULL, FLAG_ADVANCED},
999
 
 
1000
 
        {N_("Tuning Options"), P_SEP, P_SEPARATOR}, 
1001
 
 
1002
 
        {"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1003
 
        {"change notify timeout", P_INTEGER, P_LOCAL, &sDefault.ichange_notify_timeout, NULL, NULL, FLAG_ADVANCED}, 
1004
 
        {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, FLAG_ADVANCED}, 
1005
 
        {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_ADVANCED}, 
1006
 
        {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, FLAG_ADVANCED}, 
1007
 
        {"kernel change notify", P_BOOL, P_GLOBAL, &Globals.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED}, 
1008
 
        {"fam change notify", P_BOOL, P_GLOBAL, &Globals.bFamChangeNotify, NULL, NULL, FLAG_ADVANCED},
1009
 
 
1010
 
        {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_ADVANCED}, 
1011
 
        {"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, FLAG_ADVANCED}, 
1012
 
        {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1013
 
        {"paranoid server security", P_BOOL, P_GLOBAL, &Globals.paranoid_server_security, NULL, NULL, FLAG_ADVANCED}, 
1014
 
        {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, FLAG_ADVANCED}, 
1015
 
        {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, FLAG_ADVANCED}, 
1016
 
        {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1017
 
        {"open files database hash size", P_INTEGER, P_GLOBAL, &Globals.open_files_db_hash_size, NULL, NULL, FLAG_ADVANCED}, 
1018
 
 
1019
 
        {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, FLAG_ADVANCED}, 
1020
 
        {"strict allocate", P_BOOL, P_LOCAL, &sDefault.bStrictAllocate, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1021
 
        {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1022
 
        {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1023
 
        {"use mmap", P_BOOL, P_GLOBAL, &Globals.bUseMmap, NULL, NULL, FLAG_ADVANCED}, 
1024
 
        {"use sendfile", P_BOOL, P_LOCAL, &sDefault.bUseSendfile, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1025
 
        {"hostname lookups", P_BOOL, P_GLOBAL, &Globals.bHostnameLookups, NULL, NULL, FLAG_ADVANCED}, 
1026
 
        {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED}, 
1027
 
 
1028
 
        {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED}, 
1029
 
 
1030
 
        {N_("Printing Options"), P_SEP, P_SEPARATOR}, 
1031
 
 
1032
 
        {"max reported print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxReportedPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1033
 
        {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1034
 
        {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1035
 
        {"printcap cache time", P_INTEGER, P_GLOBAL, &Globals.PrintcapCacheTime, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1036
 
        {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1037
 
        {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE}, 
1038
 
        {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1039
 
        {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE}, 
1040
 
        {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, handle_printing, enum_printing, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1041
 
        {"cups options", P_STRING, P_LOCAL, &sDefault.szCupsOptions, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1042
 
        {"cups server", P_STRING, P_GLOBAL, &Globals.szCupsServer, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1043
 
        {"iprint server", P_STRING, P_GLOBAL, &Globals.szIPrintServer, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1044
 
        {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1045
 
        {"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1046
 
        {"enable spoolss", P_BOOLREV, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_HIDE}, 
1047
 
        {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1048
 
        {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1049
 
        {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1050
 
        {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1051
 
        {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1052
 
        {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
1053
 
 
1054
 
        {"addport command", P_STRING, P_GLOBAL, &Globals.szAddPortCommand, NULL, NULL, FLAG_ADVANCED}, 
1055
 
        {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, FLAG_ADVANCED}, 
1056
 
        {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, FLAG_ADVANCED}, 
1057
 
        {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, FLAG_ADVANCED}, 
1058
 
        {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, FLAG_ADVANCED}, 
1059
 
        {"os2 driver map", P_STRING, P_GLOBAL, &Globals.szOs2DriverMap, NULL, NULL, FLAG_ADVANCED}, 
1060
 
 
1061
 
        {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1062
 
        {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_HIDE}, 
1063
 
        {"use client driver", P_BOOL, P_LOCAL, &sDefault.bUseClientDriver, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1064
 
        {"default devmode", P_BOOL, P_LOCAL, &sDefault.bDefaultDevmode, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1065
 
        {"force printername", P_BOOL, P_LOCAL, &sDefault.bForcePrintername, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
1066
 
 
1067
 
        {N_("Filename Handling"), P_SEP, P_SEPARATOR}, 
1068
 
        {"mangling method", P_STRING, P_GLOBAL, &Globals.szManglingMethod, NULL, NULL, FLAG_ADVANCED}, 
1069
 
        {"mangle prefix", P_INTEGER, P_GLOBAL, &Globals.mangle_prefix, NULL, NULL, FLAG_ADVANCED}, 
1070
 
 
1071
 
        {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_ADVANCED | FLAG_SHARE}, 
1072
 
        {"case sensitive", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1073
 
        {"casesignames", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_HIDE}, 
1074
 
        {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1075
 
        {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1076
 
        {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1077
 
        {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1078
 
        {"hide special files", P_BOOL, P_LOCAL, &sDefault.bHideSpecialFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1079
 
        {"hide unreadable", P_BOOL, P_LOCAL, &sDefault.bHideUnReadable, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1080
 
        {"hide unwriteable files", P_BOOL, P_LOCAL, &sDefault.bHideUnWriteableFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1081
 
        {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1082
 
        {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
1083
 
        {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
1084
 
        {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
1085
 
        {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1086
 
        {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1087
 
        {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1088
 
        {"map readonly", P_ENUM, P_LOCAL, &sDefault.iMap_readonly, NULL, enum_map_readonly, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1089
 
        {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1090
 
        {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_DEPRECATED }, 
1091
 
        {"max stat cache size", P_INTEGER, P_GLOBAL, &Globals.iMaxStatCacheSize, NULL, NULL, FLAG_ADVANCED}, 
1092
 
        {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, FLAG_ADVANCED}, 
1093
 
        {"store dos attributes", P_BOOL, P_LOCAL, &sDefault.bStoreDosAttributes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1094
 
        {"dmapi support", P_BOOL, P_LOCAL, &sDefault.bDmapiSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
1095
 
 
1096
 
 
1097
 
        {N_("Domain Options"), P_SEP, P_SEPARATOR}, 
1098
 
 
1099
 
        {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD}, 
1100
 
 
1101
 
        {N_("Logon Options"), P_SEP, P_SEPARATOR}, 
1102
 
 
1103
 
        {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, FLAG_ADVANCED}, 
1104
 
        {"rename user script", P_STRING, P_GLOBAL, &Globals.szRenameUserScript, NULL, NULL, FLAG_ADVANCED},
1105
 
        {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, FLAG_ADVANCED}, 
1106
 
        {"add group script", P_STRING, P_GLOBAL, &Globals.szAddGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1107
 
        {"delete group script", P_STRING, P_GLOBAL, &Globals.szDelGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1108
 
        {"add user to group script", P_STRING, P_GLOBAL, &Globals.szAddUserToGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1109
 
        {"delete user from group script", P_STRING, P_GLOBAL, &Globals.szDelUserFromGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1110
 
        {"set primary group script", P_STRING, P_GLOBAL, &Globals.szSetPrimaryGroupScript, NULL, NULL, FLAG_ADVANCED}, 
1111
 
        {"add machine script", P_STRING, P_GLOBAL, &Globals.szAddMachineScript, NULL, NULL, FLAG_ADVANCED}, 
1112
 
        {"shutdown script", P_STRING, P_GLOBAL, &Globals.szShutdownScript, NULL, NULL, FLAG_ADVANCED}, 
1113
 
        {"abort shutdown script", P_STRING, P_GLOBAL, &Globals.szAbortShutdownScript, NULL, NULL, FLAG_ADVANCED}, 
1114
 
        {"username map script", P_STRING, P_GLOBAL, &Globals.szUsernameMapScript, NULL, NULL, FLAG_ADVANCED}, 
1115
 
 
1116
 
        {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_ADVANCED}, 
1117
 
        {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_ADVANCED}, 
1118
 
        {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, FLAG_ADVANCED}, 
1119
 
        {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_ADVANCED}, 
1120
 
        {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, FLAG_ADVANCED}, 
1121
 
 
1122
 
        {N_("Browse Options"), P_SEP, P_SEPARATOR}, 
1123
 
 
1124
 
        {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
1125
 
        {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, FLAG_ADVANCED}, 
1126
 
        {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, FLAG_ADVANCED}, 
1127
 
        {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
1128
 
        {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE}, 
1129
 
        {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
1130
 
        {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
1131
 
        {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, FLAG_ADVANCED}, 
1132
 
        {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1133
 
        {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE}, 
1134
 
        {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL, FLAG_ADVANCED}, 
1135
 
 
1136
 
        {N_("WINS Options"), P_SEP, P_SEPARATOR}, 
1137
 
 
1138
 
        {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, FLAG_ADVANCED}, 
1139
 
        {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, FLAG_ADVANCED}, 
1140
 
 
1141
 
        {"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
1142
 
        {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD}, 
1143
 
        {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED}, 
1144
 
 
1145
 
        {N_("Locking Options"), P_SEP, P_SEPARATOR}, 
1146
 
 
1147
 
        {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1148
 
        {"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1149
 
        {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1150
 
        {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1151
 
        {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1152
 
        {"lock spin count", P_INTEGER, P_GLOBAL, &Globals.iLockSpinCount, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1153
 
        {"lock spin time", P_INTEGER, P_GLOBAL, &Globals.iLockSpinTime, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1154
 
 
1155
 
        {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1156
 
        {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1157
 
        {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
1158
 
        {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1159
 
        {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1160
 
        {"strict locking", P_ENUM, P_LOCAL, &sDefault.iStrictLocking, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1161
 
        {"share modes", P_BOOL, P_LOCAL,  &sDefault.bShareModes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1162
 
 
1163
 
        {N_("Ldap Options"), P_SEP, P_SEPARATOR}, 
1164
 
 
1165
 
        {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, FLAG_ADVANCED}, 
1166
 
        {"ldap delete dn", P_BOOL, P_GLOBAL, &Globals.ldap_delete_dn, NULL, NULL, FLAG_ADVANCED}, 
1167
 
        {"ldap group suffix", P_STRING, P_GLOBAL, &Globals.szLdapGroupSuffix, NULL, NULL, FLAG_ADVANCED}, 
1168
 
        {"ldap idmap suffix", P_STRING, P_GLOBAL, &Globals.szLdapIdmapSuffix, NULL, NULL, FLAG_ADVANCED}, 
1169
 
        {"ldap machine suffix", P_STRING, P_GLOBAL, &Globals.szLdapMachineSuffix, NULL, NULL, FLAG_ADVANCED}, 
1170
 
        {"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED}, 
1171
 
        {"ldap password sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_HIDE}, 
1172
 
        {"ldap replication sleep", P_INTEGER, P_GLOBAL, &Globals.ldap_replication_sleep, NULL, NULL, FLAG_ADVANCED},
1173
 
        {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, FLAG_ADVANCED}, 
1174
 
        {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED}, 
1175
 
        {"ldap timeout", P_INTEGER, P_GLOBAL, &Globals.ldap_timeout, NULL, NULL, FLAG_ADVANCED},
1176
 
        {"ldap page size", P_INTEGER, P_GLOBAL, &Globals.ldap_page_size, NULL, NULL, FLAG_ADVANCED},
1177
 
        {"ldap user suffix", P_STRING, P_GLOBAL, &Globals.szLdapUserSuffix, NULL, NULL, FLAG_ADVANCED}, 
1178
 
 
1179
 
        {N_("Miscellaneous Options"), P_SEP, P_SEPARATOR}, 
1180
 
        {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED}, 
1181
 
        {"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, FLAG_ADVANCED}, 
1182
 
        {"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, FLAG_ADVANCED}, 
1183
 
 
1184
 
        {N_("EventLog Options"), P_SEP, P_SEPARATOR}, 
1185
 
        {"eventlog list",  P_LIST, P_GLOBAL, &Globals.szEventLogs, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
1186
 
        
1187
 
        {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE}, 
1188
 
        {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED}, 
1189
 
        {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED}, 
1190
 
        {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_ADVANCED}, 
1191
 
        {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_HIDE}, 
1192
 
        {"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, FLAG_ADVANCED}, 
1193
 
#ifdef WITH_UTMP
1194
 
        {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, FLAG_ADVANCED}, 
1195
 
        {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, FLAG_ADVANCED}, 
1196
 
        {"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, FLAG_ADVANCED}, 
1197
 
#endif
1198
 
 
1199
 
        {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED}, 
1200
 
        {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED}, 
1201
 
        {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, FLAG_ADVANCED}, 
1202
 
        {"dfree cache time", P_INTEGER, P_LOCAL, &sDefault.iDfreeCacheTime, NULL, NULL, FLAG_ADVANCED}, 
1203
 
        {"dfree command", P_STRING, P_LOCAL, &sDefault.szDfree, NULL, NULL, FLAG_ADVANCED}, 
1204
 
        {"get quota command", P_STRING, P_GLOBAL, &Globals.szGetQuota, NULL, NULL, FLAG_ADVANCED}, 
1205
 
        {"set quota command", P_STRING, P_GLOBAL, &Globals.szSetQuota, NULL, NULL, FLAG_ADVANCED}, 
1206
 
        {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, FLAG_ADVANCED}, 
1207
 
        {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, FLAG_ADVANCED}, 
1208
 
        {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, FLAG_ADVANCED}, 
1209
 
        {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, FLAG_ADVANCED}, 
1210
 
        {"afs username map", P_STRING, P_GLOBAL, &Globals.szAfsUsernameMap, NULL, NULL, FLAG_ADVANCED}, 
1211
 
        {"afs token lifetime", P_INTEGER, P_GLOBAL, &Globals.iAfsTokenLifetime, NULL, NULL, FLAG_ADVANCED},
1212
 
        {"log nt token command", P_STRING, P_GLOBAL, &Globals.szLogNtTokenCommand, NULL, NULL, FLAG_ADVANCED},
1213
 
        {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, FLAG_ADVANCED}, 
1214
 
        {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, FLAG_ADVANCED}, 
1215
 
        {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE}, 
1216
 
 
1217
 
        {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE}, 
1218
 
        {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE}, 
1219
 
        {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1220
 
        {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_ADVANCED}, 
1221
 
 
1222
 
        {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1223
 
        {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1224
 
        {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1225
 
        {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1226
 
        {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1227
 
        {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
1228
 
        {"usershare allow guests", P_BOOL, P_GLOBAL, &Globals.bUsershareAllowGuests, NULL, NULL, FLAG_ADVANCED},
1229
 
        {"usershare max shares", P_INTEGER, P_GLOBAL, &Globals.iUsershareMaxShares, NULL, NULL, FLAG_ADVANCED},
1230
 
        {"usershare owner only", P_BOOL, P_GLOBAL, &Globals.bUsershareOwnerOnly, NULL, NULL, FLAG_ADVANCED}, 
1231
 
        {"usershare path", P_STRING, P_GLOBAL, &Globals.szUsersharePath, NULL, NULL, FLAG_ADVANCED},
1232
 
        {"usershare prefix allow list", P_LIST, P_GLOBAL, &Globals.szUsersharePrefixAllowList, NULL, NULL, FLAG_ADVANCED}, 
1233
 
        {"usershare prefix deny list", P_LIST, P_GLOBAL, &Globals.szUsersharePrefixDenyList, NULL, NULL, FLAG_ADVANCED}, 
1234
 
        {"usershare template share", P_STRING, P_GLOBAL, &Globals.szUsershareTemplateShare, NULL, NULL, FLAG_ADVANCED},
1235
 
        {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE }, 
1236
 
        {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1237
 
        {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1238
 
        {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1239
 
        {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1240
 
        {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1241
 
        {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1242
 
        {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1243
 
        {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1244
 
        {"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1245
 
        {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1246
 
        {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1247
 
 
1248
 
        {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
1249
 
        {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, FLAG_ADVANCED}, 
1250
 
 
1251
 
        {N_("VFS module options"), P_SEP, P_SEPARATOR}, 
1252
 
 
1253
 
        {"vfs objects", P_LIST, P_LOCAL, &sDefault.szVfsObjects, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1254
 
        {"vfs object", P_LIST, P_LOCAL, &sDefault.szVfsObjects, NULL, NULL, FLAG_HIDE}, 
1255
 
 
1256
 
 
1257
 
        {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1258
 
        {"msdfs proxy", P_STRING, P_LOCAL, &sDefault.szMSDfsProxy, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
1259
 
        {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED}, 
1260
 
 
1261
 
        {N_("Winbind options"), P_SEP, P_SEPARATOR}, 
1262
 
 
1263
 
        {"passdb expand explicit", P_BOOL, P_GLOBAL, &Globals.bPassdbExpandExplicit, NULL, NULL, FLAG_ADVANCED},
1264
 
        {"idmap backend", P_LIST, P_GLOBAL, &Globals.szIdmapBackend, NULL, NULL, FLAG_ADVANCED}, 
1265
 
        {"idmap uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_ADVANCED}, 
1266
 
        {"winbind uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_HIDE}, 
1267
 
        {"idmap gid", P_STRING, P_GLOBAL, &Globals.szIdmapGID, handle_idmap_gid, NULL, FLAG_ADVANCED}, 
1268
 
        {"winbind gid", P_STRING, P_GLOBAL, &Globals.szIdmapGID, handle_idmap_gid, NULL, FLAG_HIDE}, 
1269
 
        {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, FLAG_ADVANCED}, 
1270
 
        {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, FLAG_ADVANCED}, 
1271
 
        {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED}, 
1272
 
        {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, FLAG_ADVANCED}, 
1273
 
        {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, FLAG_ADVANCED}, 
1274
 
        {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED}, 
1275
 
        {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED}, 
1276
 
        {"winbind trusted domains only", P_BOOL, P_GLOBAL, &Globals.bWinbindTrustedDomainsOnly, NULL, NULL, FLAG_ADVANCED}, 
1277
 
        {"winbind nested groups", P_BOOL, P_GLOBAL, &Globals.bWinbindNestedGroups, NULL, NULL, FLAG_ADVANCED}, 
1278
 
        {"winbind nss info", P_LIST, P_GLOBAL, &Globals.szWinbindNssInfo, NULL, NULL, FLAG_ADVANCED}, 
1279
 
        {"winbind refresh tickets", P_BOOL, P_GLOBAL, &Globals.bWinbindRefreshTickets, NULL, NULL, FLAG_ADVANCED}, 
1280
 
        {"winbind offline logon", P_BOOL, P_GLOBAL, &Globals.bWinbindOfflineLogon, NULL, NULL, FLAG_ADVANCED},
1281
 
 
1282
 
        {NULL,  P_BOOL,  P_NONE,  NULL,  NULL,  NULL,  0}
1283
 
};
1284
 
 
1285
 
/***************************************************************************
1286
 
 Initialise the sDefault parameter structure for the printer values.
1287
 
***************************************************************************/
1288
 
 
1289
 
static void init_printer_values(service *pService)
1290
 
{
1291
 
        /* choose defaults depending on the type of printing */
1292
 
        switch (pService->iPrinting) {
1293
 
                case PRINT_BSD:
1294
 
                case PRINT_AIX:
1295
 
                case PRINT_LPRNT:
1296
 
                case PRINT_LPROS2:
1297
 
                        string_set(&pService->szLpqcommand, "lpq -P'%p'");
1298
 
                        string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1299
 
                        string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
1300
 
                        break;
1301
 
 
1302
 
                case PRINT_LPRNG:
1303
 
                case PRINT_PLP:
1304
 
                        string_set(&pService->szLpqcommand, "lpq -P'%p'");
1305
 
                        string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1306
 
                        string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
1307
 
                        string_set(&pService->szQueuepausecommand, "lpc stop '%p'");
1308
 
                        string_set(&pService->szQueueresumecommand, "lpc start '%p'");
1309
 
                        string_set(&pService->szLppausecommand, "lpc hold '%p' %j");
1310
 
                        string_set(&pService->szLpresumecommand, "lpc release '%p' %j");
1311
 
                        break;
1312
 
 
1313
 
                case PRINT_CUPS:
1314
 
                case PRINT_IPRINT:
1315
 
#ifdef HAVE_CUPS
1316
 
                        /* set the lpq command to contain the destination printer
1317
 
                           name only.  This is used by cups_queue_get() */
1318
 
                        string_set(&pService->szLpqcommand, "%p");
1319
 
                        string_set(&pService->szLprmcommand, "");
1320
 
                        string_set(&pService->szPrintcommand, "");
1321
 
                        string_set(&pService->szLppausecommand, "");
1322
 
                        string_set(&pService->szLpresumecommand, "");
1323
 
                        string_set(&pService->szQueuepausecommand, "");
1324
 
                        string_set(&pService->szQueueresumecommand, "");
1325
 
#else
1326
 
                        string_set(&pService->szLpqcommand, "lpq -P'%p'");
1327
 
                        string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
1328
 
                        string_set(&pService->szPrintcommand, "lpr -P'%p' %s; rm %s");
1329
 
                        string_set(&pService->szLppausecommand, "lp -i '%p-%j' -H hold");
1330
 
                        string_set(&pService->szLpresumecommand, "lp -i '%p-%j' -H resume");
1331
 
                        string_set(&pService->szQueuepausecommand, "disable '%p'");
1332
 
                        string_set(&pService->szQueueresumecommand, "enable '%p'");
1333
 
#endif /* HAVE_CUPS */
1334
 
                        break;
1335
 
 
1336
 
                case PRINT_SYSV:
1337
 
                case PRINT_HPUX:
1338
 
                        string_set(&pService->szLpqcommand, "lpstat -o%p");
1339
 
                        string_set(&pService->szLprmcommand, "cancel %p-%j");
1340
 
                        string_set(&pService->szPrintcommand, "lp -c -d%p %s; rm %s");
1341
 
                        string_set(&pService->szQueuepausecommand, "disable %p");
1342
 
                        string_set(&pService->szQueueresumecommand, "enable %p");
1343
 
#ifndef HPUX
1344
 
                        string_set(&pService->szLppausecommand, "lp -i %p-%j -H hold");
1345
 
                        string_set(&pService->szLpresumecommand, "lp -i %p-%j -H resume");
1346
 
#endif /* HPUX */
1347
 
                        break;
1348
 
 
1349
 
                case PRINT_QNX:
1350
 
                        string_set(&pService->szLpqcommand, "lpq -P%p");
1351
 
                        string_set(&pService->szLprmcommand, "lprm -P%p %j");
1352
 
                        string_set(&pService->szPrintcommand, "lp -r -P%p %s");
1353
 
                        break;
1354
 
 
1355
 
#ifdef DEVELOPER
1356
 
        case PRINT_TEST:
1357
 
        case PRINT_VLP:
1358
 
                string_set(&pService->szPrintcommand, "vlp print %p %s");
1359
 
                string_set(&pService->szLpqcommand, "vlp lpq %p");
1360
 
                string_set(&pService->szLprmcommand, "vlp lprm %p %j");
1361
 
                string_set(&pService->szLppausecommand, "vlp lppause %p %j");
1362
 
                string_set(&pService->szLpresumecommand, "vlp lpresum %p %j");
1363
 
                string_set(&pService->szQueuepausecommand, "vlp queuepause %p");
1364
 
                string_set(&pService->szQueueresumecommand, "vlp queueresume %p");
1365
 
                break;
1366
 
#endif /* DEVELOPER */
1367
 
 
1368
 
        }
1369
 
}
1370
 
 
1371
 
/***************************************************************************
1372
 
 Initialise the global parameter structure.
1373
 
***************************************************************************/
1374
 
 
1375
 
static void init_globals(BOOL first_time_only)
1376
 
{
1377
 
        static BOOL done_init = False;
1378
 
        pstring s;
1379
 
 
1380
 
        /* If requested to initialize only once and we've already done it... */
1381
 
        if (first_time_only && done_init) {
1382
 
                /* ... then we have nothing more to do */
1383
 
                return;
1384
 
        }
1385
 
 
1386
 
        if (!done_init) {
1387
 
                int i;
1388
 
 
1389
 
                /* The logfile can be set before this is invoked. Free it if so. */
1390
 
                if (Globals.szLogFile != NULL) {
1391
 
                        string_free(&Globals.szLogFile);
1392
 
                        Globals.szLogFile = NULL;
1393
 
                }
1394
 
 
1395
 
                memset((void *)&Globals, '\0', sizeof(Globals));
1396
 
 
1397
 
                for (i = 0; parm_table[i].label; i++)
1398
 
                        if ((parm_table[i].type == P_STRING ||
1399
 
                             parm_table[i].type == P_USTRING) &&
1400
 
                            parm_table[i].ptr)
1401
 
                                string_set((char **)parm_table[i].ptr, "");
1402
 
 
1403
 
                string_set(&sDefault.fstype, FSTYPE_STRING);
1404
 
 
1405
 
                init_printer_values(&sDefault);
1406
 
 
1407
 
                done_init = True;
1408
 
        }
1409
 
 
1410
 
 
1411
 
        DEBUG(3, ("Initialising global parameters\n"));
1412
 
 
1413
 
        string_set(&Globals.szSMBPasswdFile, dyn_SMB_PASSWD_FILE);
1414
 
        string_set(&Globals.szPrivateDir, dyn_PRIVATE_DIR);
1415
 
 
1416
 
        /* use the new 'hash2' method by default, with a prefix of 1 */
1417
 
        string_set(&Globals.szManglingMethod, "hash2");
1418
 
        Globals.mangle_prefix = 1;
1419
 
 
1420
 
        string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
1421
 
 
1422
 
        /* using UTF8 by default allows us to support all chars */
1423
 
        string_set(&Globals.unix_charset, DEFAULT_UNIX_CHARSET);
1424
 
 
1425
 
#if defined(HAVE_NL_LANGINFO) && defined(CODESET)
1426
 
        /* If the system supports nl_langinfo(), try to grab the value
1427
 
           from the user's locale */
1428
 
        string_set(&Globals.display_charset, "LOCALE");
1429
 
#else
1430
 
        string_set(&Globals.display_charset, DEFAULT_DISPLAY_CHARSET);
1431
 
#endif
1432
 
 
1433
 
        /* Use codepage 850 as a default for the dos character set */
1434
 
        string_set(&Globals.dos_charset, DEFAULT_DOS_CHARSET);
1435
 
 
1436
 
        /*
1437
 
         * Allow the default PASSWD_CHAT to be overridden in local.h.
1438
 
         */
1439
 
        string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1440
 
        
1441
 
        set_global_myname(myhostname());
1442
 
        string_set(&Globals.szNetbiosName,global_myname());
1443
 
 
1444
 
        set_global_myworkgroup(WORKGROUP);
1445
 
        string_set(&Globals.szWorkgroup, lp_workgroup());
1446
 
        
1447
 
        string_set(&Globals.szPasswdProgram, "");
1448
 
        string_set(&Globals.szPidDir, dyn_PIDDIR);
1449
 
        string_set(&Globals.szLockDir, dyn_LOCKDIR);
1450
 
        string_set(&Globals.szSocketAddress, "0.0.0.0");
1451
 
        pstrcpy(s, "Samba ");
1452
 
        pstrcat(s, SAMBA_VERSION_STRING);
1453
 
        string_set(&Globals.szServerString, s);
1454
 
        slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1455
 
                 DEFAULT_MINOR_VERSION);
1456
 
        string_set(&Globals.szAnnounceVersion, s);
1457
 
#ifdef DEVELOPER
1458
 
        string_set(&Globals.szPanicAction, "/bin/sleep 999999999");
1459
 
#endif
1460
 
 
1461
 
        pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1462
 
 
1463
 
        string_set(&Globals.szLogonDrive, "");
1464
 
        /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1465
 
        string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1466
 
        string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1467
 
 
1468
 
        string_set(&Globals.szNameResolveOrder, "lmhosts wins host bcast");
1469
 
        string_set(&Globals.szPasswordServer, "*");
1470
 
 
1471
 
        Globals.AlgorithmicRidBase = BASE_RID;
1472
 
 
1473
 
        Globals.bLoadPrinters = True;
1474
 
        Globals.PrintcapCacheTime = 750;        /* 12.5 minutes */
1475
 
 
1476
 
        /* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
1477
 
        /* Discovered by 2 days of pain by Don McCall @ HP :-). */
1478
 
        Globals.max_xmit = 0x4104;
1479
 
        Globals.max_mux = 50;   /* This is *needed* for profile support. */
1480
 
        Globals.lpqcachetime = 30;      /* changed to handle large print servers better -- jerry */
1481
 
        Globals.bDisableSpoolss = False;
1482
 
        Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1483
 
        Globals.pwordlevel = 0;
1484
 
        Globals.unamelevel = 0;
1485
 
        Globals.deadtime = 0;
1486
 
        Globals.bLargeReadwrite = True;
1487
 
        Globals.max_log_size = 5000;
1488
 
        Globals.max_open_files = MAX_OPEN_FILES;
1489
 
        Globals.open_files_db_hash_size = SMB_OPEN_DATABASE_TDB_HASH_SIZE;
1490
 
        Globals.maxprotocol = PROTOCOL_NT1;
1491
 
        Globals.minprotocol = PROTOCOL_CORE;
1492
 
        Globals.security = SEC_USER;
1493
 
        Globals.paranoid_server_security = True;
1494
 
        Globals.bEncryptPasswords = True;
1495
 
        Globals.bUpdateEncrypt = False;
1496
 
        Globals.clientSchannel = Auto;
1497
 
        Globals.serverSchannel = Auto;
1498
 
        Globals.bReadRaw = True;
1499
 
        Globals.bWriteRaw = True;
1500
 
        Globals.bReadbmpx = False;
1501
 
        Globals.bNullPasswords = False;
1502
 
        Globals.bObeyPamRestrictions = False;
1503
 
        Globals.syslog = 1;
1504
 
        Globals.bSyslogOnly = False;
1505
 
        Globals.bTimestampLogs = True;
1506
 
        string_set(&Globals.szLogLevel, "0");
1507
 
        Globals.bDebugHiresTimestamp = False;
1508
 
        Globals.bDebugPid = False;
1509
 
        Globals.bDebugUid = False;
1510
 
        Globals.bEnableCoreFiles = True;
1511
 
        Globals.max_ttl = 60 * 60 * 24 * 3;     /* 3 days default. */
1512
 
        Globals.max_wins_ttl = 60 * 60 * 24 * 6;        /* 6 days default. */
1513
 
        Globals.min_wins_ttl = 60 * 60 * 6;     /* 6 hours default. */
1514
 
        Globals.machine_password_timeout = 60 * 60 * 24 * 7;    /* 7 days default. */
1515
 
        Globals.bKernelChangeNotify = True;     /* On if we have it. */
1516
 
        Globals.bFamChangeNotify = True;        /* On if we have it. */
1517
 
        Globals.lm_announce = 2;        /* = Auto: send only if LM clients found */
1518
 
        Globals.lm_interval = 60;
1519
 
        Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1520
 
#if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1521
 
        Globals.bNISHomeMap = False;
1522
 
#ifdef WITH_NISPLUS_HOME
1523
 
        string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1524
 
#else
1525
 
        string_set(&Globals.szNISHomeMapName, "auto.home");
1526
 
#endif
1527
 
#endif
1528
 
        Globals.bTimeServer = False;
1529
 
        Globals.bBindInterfacesOnly = False;
1530
 
        Globals.bUnixPasswdSync = False;
1531
 
        Globals.bPamPasswordChange = False;
1532
 
        Globals.bPasswdChatDebug = False;
1533
 
        Globals.iPasswdChatTimeout = 2; /* 2 second default. */
1534
 
        Globals.bNTPipeSupport = True;  /* Do NT pipes by default. */
1535
 
        Globals.bNTStatusSupport = True; /* Use NT status by default. */
1536
 
        Globals.bStatCache = True;      /* use stat cache by default */
1537
 
        Globals.iMaxStatCacheSize = 0;  /* unlimited size in kb by default. */
1538
 
        Globals.restrict_anonymous = 0;
1539
 
        Globals.bClientLanManAuth = True;       /* Do use the LanMan hash if it is available */
1540
 
        Globals.bClientPlaintextAuth = True;    /* Do use a plaintext password if is requested by the server */
1541
 
        Globals.bLanmanAuth = True;     /* Do use the LanMan hash if it is available */
1542
 
        Globals.bNTLMAuth = True;       /* Do use NTLMv1 if it is available (otherwise NTLMv2) */
1543
 
        Globals.bClientNTLMv2Auth = False; /* Client should not use NTLMv2, as we can't tell that the server supports it. */
1544
 
        /* Note, that we will use NTLM2 session security (which is different), if it is available */
1545
 
 
1546
 
        Globals.map_to_guest = 0;       /* By Default, "Never" */
1547
 
        Globals.oplock_break_wait_time = 0;     /* By Default, 0 msecs. */
1548
 
        Globals.enhanced_browsing = True; 
1549
 
        Globals.iLockSpinCount = 3; /* Try 3 times. */
1550
 
        Globals.iLockSpinTime = 10; /* usec. */
1551
 
#ifdef MMAP_BLACKLIST
1552
 
        Globals.bUseMmap = False;
1553
 
#else
1554
 
        Globals.bUseMmap = True;
1555
 
#endif
1556
 
        Globals.bUnixExtensions = True;
1557
 
        Globals.bResetOnZeroVC = False;
1558
 
 
1559
 
        /* hostname lookups can be very expensive and are broken on
1560
 
           a large number of sites (tridge) */
1561
 
        Globals.bHostnameLookups = False;
1562
 
 
1563
 
        string_set(&Globals.szPassdbBackend, "smbpasswd");
1564
 
        string_set(&Globals.szLdapSuffix, "");
1565
 
        string_set(&Globals.szLdapMachineSuffix, "");
1566
 
        string_set(&Globals.szLdapUserSuffix, "");
1567
 
        string_set(&Globals.szLdapGroupSuffix, "");
1568
 
        string_set(&Globals.szLdapIdmapSuffix, "");
1569
 
 
1570
 
        string_set(&Globals.szLdapAdminDn, "");
1571
 
        Globals.ldap_ssl = LDAP_SSL_ON;
1572
 
        Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
1573
 
        Globals.ldap_delete_dn = False;
1574
 
        Globals.ldap_replication_sleep = 1000; /* wait 1 sec for replication */
1575
 
        Globals.ldap_timeout = LDAP_CONNECT_DEFAULT_TIMEOUT;
1576
 
        Globals.ldap_page_size = LDAP_PAGE_SIZE;
1577
 
 
1578
 
        /* This is what we tell the afs client. in reality we set the token 
1579
 
         * to never expire, though, when this runs out the afs client will 
1580
 
         * forget the token. Set to 0 to get NEVERDATE.*/
1581
 
        Globals.iAfsTokenLifetime = 604800;
1582
 
 
1583
 
/* these parameters are set to defaults that are more appropriate
1584
 
   for the increasing samba install base:
1585
 
 
1586
 
   as a member of the workgroup, that will possibly become a
1587
 
   _local_ master browser (lm = True).  this is opposed to a forced
1588
 
   local master browser startup (pm = True).
1589
 
 
1590
 
   doesn't provide WINS server service by default (wsupp = False),
1591
 
   and doesn't provide domain master browser services by default, either.
1592
 
 
1593
 
*/
1594
 
 
1595
 
        Globals.bMsAddPrinterWizard = True;
1596
 
        Globals.bPreferredMaster = Auto;        /* depending on bDomainMaster */
1597
 
        Globals.os_level = 20;
1598
 
        Globals.bLocalMaster = True;
1599
 
        Globals.bDomainMaster = Auto;   /* depending on bDomainLogons */
1600
 
        Globals.bDomainLogons = False;
1601
 
        Globals.bBrowseList = True;
1602
 
        Globals.bWINSsupport = False;
1603
 
        Globals.bWINSproxy = False;
1604
 
 
1605
 
        Globals.bDNSproxy = True;
1606
 
 
1607
 
        /* this just means to use them if they exist */
1608
 
        Globals.bKernelOplocks = True;
1609
 
 
1610
 
        Globals.bAllowTrustedDomains = True;
1611
 
 
1612
 
        string_set(&Globals.szTemplateShell, "/bin/false");
1613
 
        string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1614
 
        string_set(&Globals.szWinbindSeparator, "\\");
1615
 
        string_set(&Globals.szCupsServer, "");
1616
 
        string_set(&Globals.szIPrintServer, "");
1617
 
 
1618
 
        Globals.winbind_cache_time = 300;       /* 5 minutes */
1619
 
        Globals.bWinbindEnumUsers = False;
1620
 
        Globals.bWinbindEnumGroups = False;
1621
 
        Globals.bWinbindUseDefaultDomain = False;
1622
 
        Globals.bWinbindTrustedDomainsOnly = False;
1623
 
        Globals.bWinbindNestedGroups = True;
1624
 
        Globals.szWinbindNssInfo = str_list_make("template", NULL);
1625
 
        Globals.bWinbindRefreshTickets = False;
1626
 
        Globals.bWinbindOfflineLogon = False;
1627
 
 
1628
 
        Globals.bPassdbExpandExplicit = False;
1629
 
 
1630
 
        Globals.name_cache_timeout = 660; /* In seconds */
1631
 
 
1632
 
        Globals.bUseSpnego = True;
1633
 
        Globals.bClientUseSpnego = True;
1634
 
 
1635
 
        Globals.client_signing = Auto;
1636
 
        Globals.server_signing = False;
1637
 
 
1638
 
        Globals.bDeferSharingViolations = True;
1639
 
        string_set(&Globals.smb_ports, SMB_PORTS);
1640
 
 
1641
 
        Globals.bEnablePrivileges = True;
1642
 
        Globals.bHostMSDfs        = True;
1643
 
        Globals.bASUSupport       = False;
1644
 
        
1645
 
        /* User defined shares. */
1646
 
        pstrcpy(s, dyn_LOCKDIR);
1647
 
        pstrcat(s, "/usershares");
1648
 
        string_set(&Globals.szUsersharePath, s);
1649
 
        string_set(&Globals.szUsershareTemplateShare, "");
1650
 
        Globals.iUsershareMaxShares = 0;
1651
 
        /* By default disallow sharing of directories not owned by the sharer. */
1652
 
        Globals.bUsershareOwnerOnly = True;
1653
 
        /* By default disallow guest access to usershares. */
1654
 
        Globals.bUsershareAllowGuests = False;
1655
 
}
1656
 
 
1657
 
static TALLOC_CTX *lp_talloc;
1658
 
 
1659
 
/******************************************************************* a
1660
 
 Free up temporary memory - called from the main loop.
1661
 
********************************************************************/
1662
 
 
1663
 
void lp_TALLOC_FREE(void)
1664
 
{
1665
 
        if (!lp_talloc)
1666
 
                return;
1667
 
        TALLOC_FREE(lp_talloc);
1668
 
        lp_talloc = NULL;
1669
 
}
1670
 
 
1671
 
TALLOC_CTX *tmp_talloc_ctx(void)
1672
 
{
1673
 
        if (lp_talloc == NULL) {
1674
 
                lp_talloc = talloc_init("tmp_talloc_ctx");
1675
 
        }
1676
 
 
1677
 
        if (lp_talloc == NULL) {
1678
 
                smb_panic("Could not create temporary talloc context\n");
1679
 
        }
1680
 
 
1681
 
        return lp_talloc;
1682
 
}
1683
 
 
1684
 
/*******************************************************************
1685
 
 Convenience routine to grab string parameters into temporary memory
1686
 
 and run standard_sub_basic on them. The buffers can be written to by
1687
 
 callers without affecting the source string.
1688
 
********************************************************************/
1689
 
 
1690
 
static char *lp_string(const char *s)
1691
 
{
1692
 
        char *ret, *tmpstr;
1693
 
 
1694
 
        /* The follow debug is useful for tracking down memory problems
1695
 
           especially if you have an inner loop that is calling a lp_*()
1696
 
           function that returns a string.  Perhaps this debug should be
1697
 
           present all the time? */
1698
 
 
1699
 
#if 0
1700
 
        DEBUG(10, ("lp_string(%s)\n", s));
1701
 
#endif
1702
 
 
1703
 
        if (!lp_talloc)
1704
 
                lp_talloc = talloc_init("lp_talloc");
1705
 
 
1706
 
        tmpstr = alloc_sub_basic(get_current_username(),
1707
 
                                 current_user_info.domain, s);
1708
 
        if (trim_char(tmpstr, '\"', '\"')) {
1709
 
                if (strchr(tmpstr,'\"') != NULL) {
1710
 
                        SAFE_FREE(tmpstr);
1711
 
                        tmpstr = alloc_sub_basic(get_current_username(),
1712
 
                                                 current_user_info.domain, s);
1713
 
                }
1714
 
        }
1715
 
        ret = talloc_strdup(lp_talloc, tmpstr);
1716
 
        SAFE_FREE(tmpstr);
1717
 
                        
1718
 
        return (ret);
1719
 
}
1720
 
 
1721
 
/*
1722
 
   In this section all the functions that are used to access the 
1723
 
   parameters from the rest of the program are defined 
1724
 
*/
1725
 
 
1726
 
#define FN_GLOBAL_STRING(fn_name,ptr) \
1727
 
 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1728
 
#define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
1729
 
 const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
1730
 
#define FN_GLOBAL_LIST(fn_name,ptr) \
1731
 
 const char **fn_name(void) {return(*(const char ***)(ptr));}
1732
 
#define FN_GLOBAL_BOOL(fn_name,ptr) \
1733
 
 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1734
 
#define FN_GLOBAL_CHAR(fn_name,ptr) \
1735
 
 char fn_name(void) {return(*(char *)(ptr));}
1736
 
#define FN_GLOBAL_INTEGER(fn_name,ptr) \
1737
 
 int fn_name(void) {return(*(int *)(ptr));}
1738
 
 
1739
 
#define FN_LOCAL_STRING(fn_name,val) \
1740
 
 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1741
 
#define FN_LOCAL_CONST_STRING(fn_name,val) \
1742
 
 const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1743
 
#define FN_LOCAL_LIST(fn_name,val) \
1744
 
 const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1745
 
#define FN_LOCAL_BOOL(fn_name,val) \
1746
 
 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1747
 
#define FN_LOCAL_INTEGER(fn_name,val) \
1748
 
 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1749
 
 
1750
 
#define FN_LOCAL_PARM_BOOL(fn_name,val) \
1751
 
 BOOL fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
1752
 
#define FN_LOCAL_PARM_STRING(fn_name,val) \
1753
 
 char *fn_name(const struct share_params *p) {return(lp_string((LP_SNUM_OK(p->service) && ServicePtrs[(p->service)]->val) ? ServicePtrs[(p->service)]->val : sDefault.val));}
1754
 
#define FN_LOCAL_CHAR(fn_name,val) \
1755
 
 char fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
1756
 
 
1757
 
FN_GLOBAL_STRING(lp_smb_ports, &Globals.smb_ports)
1758
 
FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
1759
 
FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
1760
 
FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
1761
 
FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1762
 
FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1763
 
FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1764
 
FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
1765
 
FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1766
 
FN_GLOBAL_INTEGER(lp_printcap_cache_time, &Globals.PrintcapCacheTime)
1767
 
FN_GLOBAL_STRING(lp_addport_cmd, &Globals.szAddPortCommand)
1768
 
FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1769
 
FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1770
 
FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1771
 
FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
1772
 
FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1773
 
FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
1774
 
FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
1775
 
FN_GLOBAL_INTEGER(lp_mangle_prefix, &Globals.mangle_prefix)
1776
 
FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1777
 
FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1778
 
FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
1779
 
FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1780
 
FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1781
 
FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1782
 
FN_GLOBAL_STRING(lp_get_quota_command, &Globals.szGetQuota)
1783
 
FN_GLOBAL_STRING(lp_set_quota_command, &Globals.szSetQuota)
1784
 
FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1785
 
FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1786
 
FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1787
 
FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1788
 
FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1789
 
FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
1790
 
FN_GLOBAL_CONST_STRING(lp_afs_username_map, &Globals.szAfsUsernameMap)
1791
 
FN_GLOBAL_INTEGER(lp_afs_token_lifetime, &Globals.iAfsTokenLifetime)
1792
 
FN_GLOBAL_STRING(lp_log_nt_token_command, &Globals.szLogNtTokenCommand)
1793
 
FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1794
 
FN_GLOBAL_CONST_STRING(lp_logon_script, &Globals.szLogonScript)
1795
 
FN_GLOBAL_CONST_STRING(lp_logon_path, &Globals.szLogonPath)
1796
 
FN_GLOBAL_CONST_STRING(lp_logon_drive, &Globals.szLogonDrive)
1797
 
FN_GLOBAL_CONST_STRING(lp_logon_home, &Globals.szLogonHome)
1798
 
FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1799
 
FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1800
 
FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
1801
 
FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
1802
 
FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1803
 
FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1804
 
static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1805
 
FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
1806
 
FN_GLOBAL_STRING(lp_passdb_backend, &Globals.szPassdbBackend)
1807
 
FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules)
1808
 
FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1809
 
FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1810
 
FN_GLOBAL_STRING(lp_renameuser_script, &Globals.szRenameUserScript)
1811
 
FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1812
 
 
1813
 
FN_GLOBAL_CONST_STRING(lp_guestaccount, &Globals.szGuestaccount)
1814
 
FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
1815
 
FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
1816
 
FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
1817
 
FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserFromGroupScript)
1818
 
FN_GLOBAL_STRING(lp_setprimarygroup_script, &Globals.szSetPrimaryGroupScript)
1819
 
 
1820
 
FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
1821
 
 
1822
 
FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript)
1823
 
FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript)
1824
 
FN_GLOBAL_STRING(lp_username_map_script, &Globals.szUsernameMapScript)
1825
 
 
1826
 
FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript)
1827
 
 
1828
 
FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1829
 
FN_GLOBAL_CONST_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1830
 
FN_GLOBAL_CONST_STRING(lp_template_shell, &Globals.szTemplateShell)
1831
 
FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1832
 
FN_GLOBAL_INTEGER(lp_acl_compatibility, &Globals.iAclCompat)
1833
 
FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1834
 
FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1835
 
FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
1836
 
FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only, &Globals.bWinbindTrustedDomainsOnly)
1837
 
FN_GLOBAL_BOOL(lp_winbind_nested_groups, &Globals.bWinbindNestedGroups)
1838
 
FN_GLOBAL_BOOL(lp_winbind_refresh_tickets, &Globals.bWinbindRefreshTickets)
1839
 
FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon)
1840
 
 
1841
 
FN_GLOBAL_LIST(lp_idmap_backend, &Globals.szIdmapBackend)
1842
 
FN_GLOBAL_BOOL(lp_passdb_expand_explicit, &Globals.bPassdbExpandExplicit)
1843
 
 
1844
 
FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1845
 
FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
1846
 
FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
1847
 
FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
1848
 
FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
1849
 
FN_GLOBAL_INTEGER(lp_ldap_replication_sleep, &Globals.ldap_replication_sleep)
1850
 
FN_GLOBAL_INTEGER(lp_ldap_timeout, &Globals.ldap_timeout)
1851
 
FN_GLOBAL_INTEGER(lp_ldap_page_size, &Globals.ldap_page_size)
1852
 
FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
1853
 
FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
1854
 
FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
1855
 
FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
1856
 
FN_GLOBAL_LIST(lp_usershare_prefix_allow_list, &Globals.szUsersharePrefixAllowList)
1857
 
FN_GLOBAL_LIST(lp_usershare_prefix_deny_list, &Globals.szUsersharePrefixDenyList)
1858
 
 
1859
 
FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
1860
 
 
1861
 
FN_GLOBAL_BOOL(lp_usershare_allow_guests, &Globals.bUsershareAllowGuests)
1862
 
FN_GLOBAL_BOOL(lp_usershare_owner_only, &Globals.bUsershareOwnerOnly)
1863
 
FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
1864
 
FN_GLOBAL_BOOL(lp_reset_on_zero_vc, &Globals.bResetOnZeroVC)
1865
 
FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1866
 
FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1867
 
FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1868
 
FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1869
 
FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1870
 
FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1871
 
FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1872
 
FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1873
 
FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1874
 
FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1875
 
FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1876
 
FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1877
 
FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1878
 
FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
1879
 
FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1880
 
FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1881
 
FN_GLOBAL_INTEGER(lp_client_schannel, &Globals.clientSchannel)
1882
 
FN_GLOBAL_INTEGER(lp_server_schannel, &Globals.serverSchannel)
1883
 
FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1884
 
FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1885
 
FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1886
 
FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1887
 
FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1888
 
FN_GLOBAL_BOOL(lp_enable_core_files, &Globals.bEnableCoreFiles)
1889
 
FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1890
 
FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1891
 
static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1892
 
FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1893
 
FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
1894
 
FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1895
 
FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1896
 
FN_GLOBAL_INTEGER(lp_passwd_chat_timeout, &Globals.iPasswdChatTimeout)
1897
 
FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1898
 
FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
1899
 
FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1900
 
FN_GLOBAL_INTEGER(lp_max_stat_cache_size, &Globals.iMaxStatCacheSize)
1901
 
FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1902
 
FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
1903
 
FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1904
 
FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
1905
 
FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
1906
 
FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
1907
 
FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
1908
 
FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1909
 
FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1910
 
FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1911
 
FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
1912
 
FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
1913
 
FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
1914
 
FN_GLOBAL_BOOL(lp_client_use_spnego, &Globals.bClientUseSpnego)
1915
 
FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
1916
 
FN_GLOBAL_BOOL(lp_kernel_change_notify, &Globals.bKernelChangeNotify)
1917
 
FN_GLOBAL_BOOL(lp_fam_change_notify, &Globals.bFamChangeNotify)
1918
 
FN_GLOBAL_BOOL(lp_use_kerberos_keytab, &Globals.bUseKerberosKeytab)
1919
 
FN_GLOBAL_BOOL(lp_defer_sharing_violations, &Globals.bDeferSharingViolations)
1920
 
FN_GLOBAL_BOOL(lp_enable_privileges, &Globals.bEnablePrivileges)
1921
 
FN_GLOBAL_BOOL(lp_enable_asu_support, &Globals.bASUSupport)
1922
 
FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1923
 
FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1924
 
FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1925
 
FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1926
 
FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1927
 
FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1928
 
FN_GLOBAL_INTEGER(lp_open_files_db_hash_size, &Globals.open_files_db_hash_size)
1929
 
FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1930
 
FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1931
 
FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1932
 
FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1933
 
FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1934
 
FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1935
 
FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1936
 
FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1937
 
FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
1938
 
FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
1939
 
FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1940
 
FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1941
 
FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
1942
 
FN_GLOBAL_INTEGER(_lp_disable_spoolss, &Globals.bDisableSpoolss)
1943
 
FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1944
 
static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1945
 
FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1946
 
FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1947
 
FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1948
 
FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1949
 
FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1950
 
FN_GLOBAL_INTEGER(lp_lock_spin_count, &Globals.iLockSpinCount)
1951
 
FN_GLOBAL_INTEGER(lp_lock_sleep_time, &Globals.iLockSpinTime)
1952
 
FN_GLOBAL_INTEGER(lp_usershare_max_shares, &Globals.iUsershareMaxShares)
1953
 
 
1954
 
FN_LOCAL_STRING(lp_preexec, szPreExec)
1955
 
FN_LOCAL_STRING(lp_postexec, szPostExec)
1956
 
FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1957
 
FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1958
 
FN_LOCAL_STRING(lp_servicename, szService)
1959
 
FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
1960
 
FN_LOCAL_STRING(lp_pathname, szPath)
1961
 
FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1962
 
FN_LOCAL_STRING(lp_username, szUsername)
1963
 
FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
1964
 
FN_LOCAL_LIST(lp_valid_users, szValidUsers)
1965
 
FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
1966
 
FN_GLOBAL_LIST(lp_svcctl_list, &Globals.szServicesList)
1967
 
FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
1968
 
FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
1969
 
FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer)
1970
 
FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1971
 
FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1972
 
FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1973
 
FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1974
 
FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1975
 
FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1976
 
FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1977
 
static FN_LOCAL_STRING(_lp_printername, szPrintername)
1978
 
FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
1979
 
FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
1980
 
FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1981
 
FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1982
 
FN_LOCAL_STRING(lp_comment, comment)
1983
 
FN_LOCAL_STRING(lp_force_user, force_user)
1984
 
FN_LOCAL_STRING(lp_force_group, force_group)
1985
 
FN_LOCAL_LIST(lp_readlist, readlist)
1986
 
FN_LOCAL_LIST(lp_writelist, writelist)
1987
 
FN_LOCAL_LIST(lp_printer_admin, printer_admin)
1988
 
FN_LOCAL_STRING(lp_fstype, fstype)
1989
 
FN_LOCAL_LIST(lp_vfs_objects, szVfsObjects)
1990
 
FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
1991
 
static FN_LOCAL_STRING(lp_volume, volume)
1992
 
FN_LOCAL_PARM_STRING(lp_mangled_map, szMangledMap)
1993
 
FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1994
 
FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1995
 
FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1996
 
FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1997
 
FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
1998
 
FN_LOCAL_STRING(lp_dfree_command, szDfree)
1999
 
FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
2000
 
FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
2001
 
FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
2002
 
FN_LOCAL_INTEGER(lp_casesensitive, iCaseSensitive)
2003
 
FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
2004
 
FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
2005
 
FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
2006
 
FN_LOCAL_BOOL(lp_hide_special_files, bHideSpecialFiles)
2007
 
FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
2008
 
FN_LOCAL_BOOL(lp_hideunwriteable_files, bHideUnWriteableFiles)
2009
 
FN_LOCAL_BOOL(lp_browseable, bBrowseable)
2010
 
FN_LOCAL_BOOL(lp_readonly, bRead_only)
2011
 
FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
2012
 
FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
2013
 
FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
2014
 
FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
2015
 
FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
2016
 
FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
2017
 
FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
2018
 
FN_LOCAL_BOOL(lp_dmapi_support, bDmapiSupport)
2019
 
FN_LOCAL_BOOL(lp_locking, bLocking)
2020
 
FN_LOCAL_INTEGER(lp_strict_locking, iStrictLocking)
2021
 
FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
2022
 
FN_LOCAL_BOOL(lp_share_modes, bShareModes)
2023
 
FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
2024
 
FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
2025
 
FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
2026
 
FN_LOCAL_PARM_BOOL(lp_manglednames, bMangledNames)
2027
 
FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
2028
 
FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
2029
 
FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
2030
 
FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
2031
 
FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
2032
 
FN_LOCAL_BOOL(lp_map_system, bMap_system)
2033
 
FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
2034
 
FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
2035
 
FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
2036
 
FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
2037
 
FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
2038
 
FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
2039
 
FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
2040
 
FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
2041
 
FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
2042
 
FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
2043
 
FN_LOCAL_BOOL(lp_inherit_owner, bInheritOwner)
2044
 
FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
2045
 
FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
2046
 
FN_LOCAL_BOOL(lp_force_printername, bForcePrintername)
2047
 
FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
2048
 
FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
2049
 
FN_LOCAL_BOOL(lp_ea_support, bEASupport)
2050
 
FN_LOCAL_BOOL(_lp_use_sendfile, bUseSendfile)
2051
 
FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
2052
 
FN_LOCAL_BOOL(lp_map_acl_inherit, bMap_acl_inherit)
2053
 
FN_LOCAL_BOOL(lp_afs_share, bAfs_Share)
2054
 
FN_LOCAL_BOOL(lp_acl_check_permissions, bAclCheckPermissions)
2055
 
FN_LOCAL_BOOL(lp_acl_group_control, bAclGroupControl)
2056
 
FN_LOCAL_BOOL(lp_acl_map_full_control, bAclMapFullControl)
2057
 
FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
2058
 
FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
2059
 
FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
2060
 
FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
2061
 
FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
2062
 
FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
2063
 
FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
2064
 
FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
2065
 
FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
2066
 
FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
2067
 
FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
2068
 
FN_LOCAL_INTEGER(lp_printing, iPrinting)
2069
 
FN_LOCAL_INTEGER(lp_max_reported_jobs, iMaxReportedPrintJobs)
2070
 
FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
2071
 
FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
2072
 
FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
2073
 
FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
2074
 
FN_LOCAL_INTEGER(lp_dfree_cache_time, iDfreeCacheTime)
2075
 
FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size)
2076
 
FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
2077
 
FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
2078
 
FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
2079
 
FN_LOCAL_INTEGER(lp_change_notify_timeout, ichange_notify_timeout)
2080
 
FN_LOCAL_CHAR(lp_magicchar, magic_char)
2081
 
FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
2082
 
FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)
2083
 
FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
2084
 
FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
2085
 
FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
2086
 
FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
2087
 
 
2088
 
/* local prototypes */
2089
 
 
2090
 
static int map_parameter(const char *pszParmName);
2091
 
static BOOL set_boolean(BOOL *pb, const char *pszParmValue);
2092
 
static int getservicebyname(const char *pszServiceName,
2093
 
                            service * pserviceDest);
2094
 
static void copy_service(service * pserviceDest,
2095
 
                         service * pserviceSource, BOOL *pcopymapDest);
2096
 
static BOOL service_ok(int iService);
2097
 
static BOOL do_parameter(const char *pszParmName, const char *pszParmValue);
2098
 
static BOOL do_section(const char *pszSectionName);
2099
 
static void init_copymap(service * pservice);
2100
 
static BOOL hash_a_service(const char *name, int number);
2101
 
static void free_service_byindex(int iService);
2102
 
static char * canonicalize_servicename(const char *name);
2103
 
 
2104
 
/* This is a helper function for parametrical options support. */
2105
 
/* It returns a pointer to parametrical option value if it exists or NULL otherwise */
2106
 
/* Actual parametrical functions are quite simple */
2107
 
static param_opt_struct *get_parametrics(int snum, const char *type, const char *option)
2108
 
{
2109
 
        BOOL global_section = False;
2110
 
        char* param_key;
2111
 
        param_opt_struct *data;
2112
 
        
2113
 
        if (snum >= iNumServices) return NULL;
2114
 
        
2115
 
        if (snum < 0) { 
2116
 
                data = Globals.param_opt;
2117
 
                global_section = True;
2118
 
        } else {
2119
 
                data = ServicePtrs[snum]->param_opt;
2120
 
        }
2121
 
    
2122
 
        asprintf(&param_key, "%s:%s", type, option);
2123
 
        if (!param_key) {
2124
 
                DEBUG(0,("asprintf failed!\n"));
2125
 
                return NULL;
2126
 
        }
2127
 
 
2128
 
        while (data) {
2129
 
                if (strcmp(data->key, param_key) == 0) {
2130
 
                        string_free(&param_key);
2131
 
                        return data;
2132
 
                }
2133
 
                data = data->next;
2134
 
        }
2135
 
 
2136
 
        if (!global_section) {
2137
 
                /* Try to fetch the same option but from globals */
2138
 
                /* but only if we are not already working with Globals */
2139
 
                data = Globals.param_opt;
2140
 
                while (data) {
2141
 
                        if (strcmp(data->key, param_key) == 0) {
2142
 
                                string_free(&param_key);
2143
 
                                return data;
2144
 
                        }
2145
 
                        data = data->next;
2146
 
                }
2147
 
        }
2148
 
 
2149
 
        string_free(&param_key);
2150
 
        
2151
 
        return NULL;
2152
 
}
2153
 
 
2154
 
 
2155
 
#define MISSING_PARAMETER(name) \
2156
 
    DEBUG(0, ("%s(): value is NULL or empty!\n", #name))
2157
 
 
2158
 
/*******************************************************************
2159
 
convenience routine to return int parameters.
2160
 
********************************************************************/
2161
 
static int lp_int(const char *s)
2162
 
{
2163
 
 
2164
 
        if (!s || !*s) {
2165
 
                MISSING_PARAMETER(lp_int);
2166
 
                return (-1);
2167
 
        }
2168
 
 
2169
 
        return atoi(s); 
2170
 
}
2171
 
 
2172
 
/*******************************************************************
2173
 
convenience routine to return unsigned long parameters.
2174
 
********************************************************************/
2175
 
static unsigned long lp_ulong(const char *s)
2176
 
{
2177
 
 
2178
 
        if (!s || !*s) {
2179
 
                MISSING_PARAMETER(lp_ulong);
2180
 
                return (0);
2181
 
        }
2182
 
 
2183
 
        return strtoul(s, NULL, 10);
2184
 
}
2185
 
 
2186
 
/*******************************************************************
2187
 
convenience routine to return boolean parameters.
2188
 
********************************************************************/
2189
 
static BOOL lp_bool(const char *s)
2190
 
{
2191
 
        BOOL ret = False;
2192
 
 
2193
 
        if (!s || !*s) {
2194
 
                MISSING_PARAMETER(lp_bool);
2195
 
                return False;
2196
 
        }
2197
 
        
2198
 
        if (!set_boolean(&ret,s)) {
2199
 
                DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
2200
 
                return False;
2201
 
        }
2202
 
 
2203
 
        return ret;
2204
 
}
2205
 
 
2206
 
/*******************************************************************
2207
 
convenience routine to return enum parameters.
2208
 
********************************************************************/
2209
 
static int lp_enum(const char *s,const struct enum_list *_enum)
2210
 
{
2211
 
        int i;
2212
 
 
2213
 
        if (!s || !*s || !_enum) {
2214
 
                MISSING_PARAMETER(lp_enum);
2215
 
                return (-1);
2216
 
        }
2217
 
        
2218
 
        for (i=0; _enum[i].name; i++) {
2219
 
                if (strequal(_enum[i].name,s))
2220
 
                        return _enum[i].value;
2221
 
        }
2222
 
 
2223
 
        DEBUG(0,("lp_enum(%s,enum): value is not in enum_list!\n",s));
2224
 
        return (-1);
2225
 
}
2226
 
 
2227
 
#undef MISSING_PARAMETER
2228
 
 
2229
 
/* DO NOT USE lp_parm_string ANYMORE!!!!
2230
 
 * use lp_parm_const_string or lp_parm_talloc_string
2231
 
 *
2232
 
 * lp_parm_string is only used to let old modules find this symbol
2233
 
 */
2234
 
#undef lp_parm_string
2235
 
 char *lp_parm_string(const char *servicename, const char *type, const char *option)
2236
 
{
2237
 
        return lp_parm_talloc_string(lp_servicenumber(servicename), type, option, NULL);
2238
 
}
2239
 
 
2240
 
/* Return parametric option from a given service. Type is a part of option before ':' */
2241
 
/* Parametric option has following syntax: 'Type: option = value' */
2242
 
/* the returned value is talloced in lp_talloc */
2243
 
char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def)
2244
 
{
2245
 
        param_opt_struct *data = get_parametrics(snum, type, option);
2246
 
        
2247
 
        if (data == NULL||data->value==NULL) {
2248
 
                if (def) {
2249
 
                        return lp_string(def);
2250
 
                } else {
2251
 
                        return NULL;
2252
 
                }
2253
 
        }
2254
 
 
2255
 
        return lp_string(data->value);
2256
 
}
2257
 
 
2258
 
/* Return parametric option from a given service. Type is a part of option before ':' */
2259
 
/* Parametric option has following syntax: 'Type: option = value' */
2260
 
const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def)
2261
 
{
2262
 
        param_opt_struct *data = get_parametrics(snum, type, option);
2263
 
        
2264
 
        if (data == NULL||data->value==NULL)
2265
 
                return def;
2266
 
                
2267
 
        return data->value;
2268
 
}
2269
 
 
2270
 
/* Return parametric option from a given service. Type is a part of option before ':' */
2271
 
/* Parametric option has following syntax: 'Type: option = value' */
2272
 
 
2273
 
const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def)
2274
 
{
2275
 
        param_opt_struct *data = get_parametrics(snum, type, option);
2276
 
 
2277
 
        if (data == NULL||data->value==NULL)
2278
 
                return (const char **)def;
2279
 
                
2280
 
        if (data->list==NULL) {
2281
 
                data->list = str_list_make(data->value, NULL);
2282
 
        }
2283
 
 
2284
 
        return (const char **)data->list;
2285
 
}
2286
 
 
2287
 
/* Return parametric option from a given service. Type is a part of option before ':' */
2288
 
/* Parametric option has following syntax: 'Type: option = value' */
2289
 
 
2290
 
int lp_parm_int(int snum, const char *type, const char *option, int def)
2291
 
{
2292
 
        param_opt_struct *data = get_parametrics(snum, type, option);
2293
 
        
2294
 
        if (data && data->value && *data->value)
2295
 
                return lp_int(data->value);
2296
 
 
2297
 
        return def;
2298
 
}
2299
 
 
2300
 
/* Return parametric option from a given service. Type is a part of option before ':' */
2301
 
/* Parametric option has following syntax: 'Type: option = value' */
2302
 
 
2303
 
unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsigned long def)
2304
 
{
2305
 
        param_opt_struct *data = get_parametrics(snum, type, option);
2306
 
        
2307
 
        if (data && data->value && *data->value)
2308
 
                return lp_ulong(data->value);
2309
 
 
2310
 
        return def;
2311
 
}
2312
 
 
2313
 
/* Return parametric option from a given service. Type is a part of option before ':' */
2314
 
/* Parametric option has following syntax: 'Type: option = value' */
2315
 
 
2316
 
BOOL lp_parm_bool(int snum, const char *type, const char *option, BOOL def)
2317
 
{
2318
 
        param_opt_struct *data = get_parametrics(snum, type, option);
2319
 
        
2320
 
        if (data && data->value && *data->value)
2321
 
                return lp_bool(data->value);
2322
 
 
2323
 
        return def;
2324
 
}
2325
 
 
2326
 
/* Return parametric option from a given service. Type is a part of option before ':' */
2327
 
/* Parametric option has following syntax: 'Type: option = value' */
2328
 
 
2329
 
int lp_parm_enum(int snum, const char *type, const char *option,
2330
 
                 const struct enum_list *_enum, int def)
2331
 
{
2332
 
        param_opt_struct *data = get_parametrics(snum, type, option);
2333
 
        
2334
 
        if (data && data->value && *data->value && _enum)
2335
 
                return lp_enum(data->value, _enum);
2336
 
 
2337
 
        return def;
2338
 
}
2339
 
 
2340
 
 
2341
 
/***************************************************************************
2342
 
 Initialise a service to the defaults.
2343
 
***************************************************************************/
2344
 
 
2345
 
static void init_service(service * pservice)
2346
 
{
2347
 
        memset((char *)pservice, '\0', sizeof(service));
2348
 
        copy_service(pservice, &sDefault, NULL);
2349
 
}
2350
 
 
2351
 
/***************************************************************************
2352
 
 Free the dynamically allocated parts of a service struct.
2353
 
***************************************************************************/
2354
 
 
2355
 
static void free_service(service *pservice)
2356
 
{
2357
 
        int i;
2358
 
        param_opt_struct *data, *pdata;
2359
 
        if (!pservice)
2360
 
                return;
2361
 
 
2362
 
        if (pservice->szService)
2363
 
                DEBUG(5, ("free_service: Freeing service %s\n",
2364
 
                       pservice->szService));
2365
 
 
2366
 
        string_free(&pservice->szService);
2367
 
        SAFE_FREE(pservice->copymap);
2368
 
 
2369
 
        for (i = 0; parm_table[i].label; i++) {
2370
 
                if ((parm_table[i].type == P_STRING ||
2371
 
                     parm_table[i].type == P_USTRING) &&
2372
 
                    parm_table[i].p_class == P_LOCAL)
2373
 
                        string_free((char **)
2374
 
                                    (((char *)pservice) +
2375
 
                                     PTR_DIFF(parm_table[i].ptr, &sDefault)));
2376
 
                else if (parm_table[i].type == P_LIST &&
2377
 
                         parm_table[i].p_class == P_LOCAL)
2378
 
                             str_list_free((char ***)
2379
 
                                            (((char *)pservice) +
2380
 
                                             PTR_DIFF(parm_table[i].ptr, &sDefault)));
2381
 
        }
2382
 
 
2383
 
        data = pservice->param_opt;
2384
 
        if (data)
2385
 
                DEBUG(5,("Freeing parametrics:\n"));
2386
 
        while (data) {
2387
 
                DEBUG(5,("[%s = %s]\n", data->key, data->value));
2388
 
                string_free(&data->key);
2389
 
                string_free(&data->value);
2390
 
                str_list_free(&data->list);
2391
 
                pdata = data->next;
2392
 
                SAFE_FREE(data);
2393
 
                data = pdata;
2394
 
        }
2395
 
 
2396
 
        ZERO_STRUCTP(pservice);
2397
 
}
2398
 
 
2399
 
 
2400
 
/***************************************************************************
2401
 
 remove a service indexed in the ServicePtrs array from the ServiceHash
2402
 
 and free the dynamically allocated parts
2403
 
***************************************************************************/
2404
 
 
2405
 
static void free_service_byindex(int idx)
2406
 
{
2407
 
        if ( !LP_SNUM_OK(idx) ) 
2408
 
                return;
2409
 
 
2410
 
        ServicePtrs[idx]->valid = False;
2411
 
        invalid_services[num_invalid_services++] = idx;
2412
 
 
2413
 
        /* we have to cleanup the hash record */
2414
 
 
2415
 
        if (ServicePtrs[idx]->szService) {
2416
 
                char *canon_name = canonicalize_servicename( ServicePtrs[idx]->szService );
2417
 
                
2418
 
                tdb_delete_bystring(ServiceHash, canon_name );
2419
 
        }
2420
 
 
2421
 
        free_service(ServicePtrs[idx]);
2422
 
}
2423
 
 
2424
 
/***************************************************************************
2425
 
 Add a new service to the services array initialising it with the given 
2426
 
 service. 
2427
 
***************************************************************************/
2428
 
 
2429
 
static int add_a_service(const service *pservice, const char *name)
2430
 
{
2431
 
        int i;
2432
 
        service tservice;
2433
 
        int num_to_alloc = iNumServices + 1;
2434
 
        param_opt_struct *data, *pdata;
2435
 
 
2436
 
        tservice = *pservice;
2437
 
 
2438
 
        /* it might already exist */
2439
 
        if (name) {
2440
 
                i = getservicebyname(name, NULL);
2441
 
                if (i >= 0) {
2442
 
                        /* Clean all parametric options for service */
2443
 
                        /* They will be added during parsing again */
2444
 
                        data = ServicePtrs[i]->param_opt;
2445
 
                        while (data) {
2446
 
                                string_free(&data->key);
2447
 
                                string_free(&data->value);
2448
 
                                str_list_free(&data->list);
2449
 
                                pdata = data->next;
2450
 
                                SAFE_FREE(data);
2451
 
                                data = pdata;
2452
 
                        }
2453
 
                        ServicePtrs[i]->param_opt = NULL;
2454
 
                        return (i);
2455
 
                }
2456
 
        }
2457
 
 
2458
 
        /* find an invalid one */
2459
 
        i = iNumServices;
2460
 
        if (num_invalid_services > 0) {
2461
 
                i = invalid_services[--num_invalid_services];
2462
 
        }
2463
 
 
2464
 
        /* if not, then create one */
2465
 
        if (i == iNumServices) {
2466
 
                service **tsp;
2467
 
                int *tinvalid;
2468
 
                
2469
 
                tsp = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(ServicePtrs, service *, num_to_alloc);
2470
 
                if (tsp == NULL) {
2471
 
                        DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
2472
 
                        return (-1);
2473
 
                }
2474
 
                ServicePtrs = tsp;
2475
 
                ServicePtrs[iNumServices] = SMB_MALLOC_P(service);
2476
 
                if (!ServicePtrs[iNumServices]) {
2477
 
                        DEBUG(0,("add_a_service: out of memory!\n"));
2478
 
                        return (-1);
2479
 
                }
2480
 
                iNumServices++;
2481
 
 
2482
 
                /* enlarge invalid_services here for now... */
2483
 
                tinvalid = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(invalid_services, int,
2484
 
                                             num_to_alloc);
2485
 
                if (tinvalid == NULL) {
2486
 
                        DEBUG(0,("add_a_service: failed to enlarge "
2487
 
                                 "invalid_services!\n"));
2488
 
                        return (-1);
2489
 
                }
2490
 
                invalid_services = tinvalid;
2491
 
        } else {
2492
 
                free_service_byindex(i);
2493
 
        }
2494
 
 
2495
 
        ServicePtrs[i]->valid = True;
2496
 
 
2497
 
        init_service(ServicePtrs[i]);
2498
 
        copy_service(ServicePtrs[i], &tservice, NULL);
2499
 
        if (name)
2500
 
                string_set(&ServicePtrs[i]->szService, name);
2501
 
                
2502
 
        DEBUG(8,("add_a_service: Creating snum = %d for %s\n", 
2503
 
                i, ServicePtrs[i]->szService));
2504
 
 
2505
 
        if (!hash_a_service(ServicePtrs[i]->szService, i)) {
2506
 
                return (-1);
2507
 
        }
2508
 
                
2509
 
        return (i);
2510
 
}
2511
 
 
2512
 
/***************************************************************************
2513
 
  Convert a string to uppercase and remove whitespaces.
2514
 
***************************************************************************/
2515
 
 
2516
 
static char *canonicalize_servicename(const char *src)
2517
 
{
2518
 
        static fstring canon; /* is fstring large enough? */
2519
 
 
2520
 
        if ( !src ) {
2521
 
                DEBUG(0,("canonicalize_servicename: NULL source name!\n"));
2522
 
                return NULL;
2523
 
        }
2524
 
 
2525
 
        fstrcpy( canon, src );
2526
 
        strlower_m( canon );
2527
 
 
2528
 
        return canon;
2529
 
}
2530
 
 
2531
 
/***************************************************************************
2532
 
  Add a name/index pair for the services array to the hash table.
2533
 
***************************************************************************/
2534
 
 
2535
 
static BOOL hash_a_service(const char *name, int idx)
2536
 
{
2537
 
        char *canon_name;
2538
 
 
2539
 
        if ( !ServiceHash ) {
2540
 
                DEBUG(10,("hash_a_service: creating tdb servicehash\n"));
2541
 
                ServiceHash = tdb_open("servicehash", 1031, TDB_INTERNAL, 
2542
 
                                        (O_RDWR|O_CREAT), 0600);
2543
 
                if ( !ServiceHash ) {
2544
 
                        DEBUG(0,("hash_a_service: open tdb servicehash failed!\n"));
2545
 
                        return False;
2546
 
                }
2547
 
        }
2548
 
 
2549
 
        DEBUG(10,("hash_a_service: hashing index %d for service name %s\n",
2550
 
                idx, name));
2551
 
 
2552
 
        if ( !(canon_name = canonicalize_servicename( name )) )
2553
 
                return False;
2554
 
 
2555
 
        tdb_store_int32(ServiceHash, canon_name, idx);
2556
 
 
2557
 
        return True;
2558
 
}
2559
 
 
2560
 
/***************************************************************************
2561
 
 Add a new home service, with the specified home directory, defaults coming 
2562
 
 from service ifrom.
2563
 
***************************************************************************/
2564
 
 
2565
 
BOOL lp_add_home(const char *pszHomename, int iDefaultService, 
2566
 
                 const char *user, const char *pszHomedir)
2567
 
{
2568
 
        int i;
2569
 
        pstring newHomedir;
2570
 
 
2571
 
        i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
2572
 
 
2573
 
        if (i < 0)
2574
 
                return (False);
2575
 
 
2576
 
        if (!(*(ServicePtrs[iDefaultService]->szPath))
2577
 
            || strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(GLOBAL_SECTION_SNUM))) {
2578
 
                pstrcpy(newHomedir, pszHomedir);
2579
 
                string_set(&ServicePtrs[i]->szPath, newHomedir);
2580
 
        } 
2581
 
 
2582
 
        if (!(*(ServicePtrs[i]->comment))) {
2583
 
                pstring comment;
2584
 
                slprintf(comment, sizeof(comment) - 1,
2585
 
                         "Home directory of %s", user);
2586
 
                string_set(&ServicePtrs[i]->comment, comment);
2587
 
        }
2588
 
 
2589
 
        /* set the browseable flag from the global default */
2590
 
 
2591
 
        ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2592
 
 
2593
 
        ServicePtrs[i]->autoloaded = True;
2594
 
 
2595
 
        DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename, 
2596
 
               user, ServicePtrs[i]->szPath ));
2597
 
        
2598
 
        return (True);
2599
 
}
2600
 
 
2601
 
/***************************************************************************
2602
 
 Add a new service, based on an old one.
2603
 
***************************************************************************/
2604
 
 
2605
 
int lp_add_service(const char *pszService, int iDefaultService)
2606
 
{
2607
 
        return (add_a_service(ServicePtrs[iDefaultService], pszService));
2608
 
}
2609
 
 
2610
 
/***************************************************************************
2611
 
 Add the IPC service.
2612
 
***************************************************************************/
2613
 
 
2614
 
static BOOL lp_add_ipc(const char *ipc_name, BOOL guest_ok)
2615
 
{
2616
 
        pstring comment;
2617
 
        int i = add_a_service(&sDefault, ipc_name);
2618
 
 
2619
 
        if (i < 0)
2620
 
                return (False);
2621
 
 
2622
 
        slprintf(comment, sizeof(comment) - 1,
2623
 
                 "IPC Service (%s)", Globals.szServerString);
2624
 
 
2625
 
        string_set(&ServicePtrs[i]->szPath, tmpdir());
2626
 
        string_set(&ServicePtrs[i]->szUsername, "");
2627
 
        string_set(&ServicePtrs[i]->comment, comment);
2628
 
        string_set(&ServicePtrs[i]->fstype, "IPC");
2629
 
        ServicePtrs[i]->iMaxConnections = 0;
2630
 
        ServicePtrs[i]->bAvailable = True;
2631
 
        ServicePtrs[i]->bRead_only = True;
2632
 
        ServicePtrs[i]->bGuest_only = False;
2633
 
        ServicePtrs[i]->bGuest_ok = guest_ok;
2634
 
        ServicePtrs[i]->bPrint_ok = False;
2635
 
        ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2636
 
 
2637
 
        DEBUG(3, ("adding IPC service\n"));
2638
 
 
2639
 
        return (True);
2640
 
}
2641
 
 
2642
 
/***************************************************************************
2643
 
 Add a new printer service, with defaults coming from service iFrom.
2644
 
***************************************************************************/
2645
 
 
2646
 
BOOL lp_add_printer(const char *pszPrintername, int iDefaultService)
2647
 
{
2648
 
        const char *comment = "From Printcap";
2649
 
        int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
2650
 
 
2651
 
        if (i < 0)
2652
 
                return (False);
2653
 
 
2654
 
        /* note that we do NOT default the availability flag to True - */
2655
 
        /* we take it from the default service passed. This allows all */
2656
 
        /* dynamic printers to be disabled by disabling the [printers] */
2657
 
        /* entry (if/when the 'available' keyword is implemented!).    */
2658
 
 
2659
 
        /* the printer name is set to the service name. */
2660
 
        string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
2661
 
        string_set(&ServicePtrs[i]->comment, comment);
2662
 
 
2663
 
        /* set the browseable flag from the gloabl default */
2664
 
        ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2665
 
 
2666
 
        /* Printers cannot be read_only. */
2667
 
        ServicePtrs[i]->bRead_only = False;
2668
 
        /* No share modes on printer services. */
2669
 
        ServicePtrs[i]->bShareModes = False;
2670
 
        /* No oplocks on printer services. */
2671
 
        ServicePtrs[i]->bOpLocks = False;
2672
 
        /* Printer services must be printable. */
2673
 
        ServicePtrs[i]->bPrint_ok = True;
2674
 
        
2675
 
        DEBUG(3, ("adding printer service %s\n", pszPrintername));
2676
 
 
2677
 
        return (True);
2678
 
}
2679
 
 
2680
 
/***************************************************************************
2681
 
 Map a parameter's string representation to something we can use. 
2682
 
 Returns False if the parameter string is not recognised, else TRUE.
2683
 
***************************************************************************/
2684
 
 
2685
 
static int map_parameter(const char *pszParmName)
2686
 
{
2687
 
        int iIndex;
2688
 
 
2689
 
        if (*pszParmName == '-')
2690
 
                return (-1);
2691
 
 
2692
 
        for (iIndex = 0; parm_table[iIndex].label; iIndex++)
2693
 
                if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
2694
 
                        return (iIndex);
2695
 
 
2696
 
        /* Warn only if it isn't parametric option */
2697
 
        if (strchr(pszParmName, ':') == NULL)
2698
 
                DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
2699
 
        /* We do return 'fail' for parametric options as well because they are
2700
 
           stored in different storage
2701
 
         */
2702
 
        return (-1);
2703
 
}
2704
 
 
2705
 
/***************************************************************************
2706
 
 Show all parameter's name, type, [values,] and flags.
2707
 
***************************************************************************/
2708
 
 
2709
 
void show_parameter_list(void)
2710
 
{
2711
 
        int classIndex, parmIndex, enumIndex, flagIndex;
2712
 
        BOOL hadFlag;
2713
 
        const char *section_names[] = { "local", "global", NULL};
2714
 
        const char *type[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
2715
 
                "P_OCTAL", "P_LIST", "P_STRING", "P_USTRING", "P_GSTRING",
2716
 
                "P_UGSTRING", "P_ENUM", "P_SEP"};
2717
 
        unsigned flags[] = { FLAG_BASIC, FLAG_SHARE, FLAG_PRINT, FLAG_GLOBAL,
2718
 
                FLAG_WIZARD, FLAG_ADVANCED, FLAG_DEVELOPER, FLAG_DEPRECATED,
2719
 
                FLAG_HIDE, FLAG_DOS_STRING};
2720
 
        const char *flag_names[] = { "FLAG_BASIC", "FLAG_SHARE", "FLAG_PRINT",
2721
 
                "FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
2722
 
                "FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL};
2723
 
 
2724
 
        for ( classIndex=0; section_names[classIndex]; classIndex++) {
2725
 
                printf("[%s]\n", section_names[classIndex]);
2726
 
                for (parmIndex = 0; parm_table[parmIndex].label; parmIndex++) {
2727
 
                        if (parm_table[parmIndex].p_class == classIndex) {
2728
 
                                printf("%s=%s", 
2729
 
                                        parm_table[parmIndex].label,
2730
 
                                        type[parm_table[parmIndex].type]);
2731
 
                                switch (parm_table[parmIndex].type) {
2732
 
                                case P_ENUM:
2733
 
                                        printf(",");
2734
 
                                        for (enumIndex=0; parm_table[parmIndex].enum_list[enumIndex].name; enumIndex++)
2735
 
                                                printf("%s%s",
2736
 
                                                        enumIndex ? "|" : "",
2737
 
                                                        parm_table[parmIndex].enum_list[enumIndex].name);
2738
 
                                        break;
2739
 
                                default:
2740
 
                                        break;
2741
 
                                }
2742
 
                                printf(",");
2743
 
                                hadFlag = False;
2744
 
                                for ( flagIndex=0; flag_names[flagIndex]; flagIndex++ ) {
2745
 
                                        if (parm_table[parmIndex].flags & flags[flagIndex]) {
2746
 
                                                printf("%s%s",
2747
 
                                                        hadFlag ? "|" : "",
2748
 
                                                        flag_names[flagIndex]);
2749
 
                                                hadFlag = True;
2750
 
                                        }
2751
 
                                }
2752
 
                                printf("\n");
2753
 
                        }
2754
 
                }
2755
 
        }
2756
 
}
2757
 
 
2758
 
/***************************************************************************
2759
 
 Set a boolean variable from the text value stored in the passed string.
2760
 
 Returns True in success, False if the passed string does not correctly 
2761
 
 represent a boolean.
2762
 
***************************************************************************/
2763
 
 
2764
 
static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
2765
 
{
2766
 
        BOOL bRetval;
2767
 
 
2768
 
        bRetval = True;
2769
 
        if (strwicmp(pszParmValue, "yes") == 0 ||
2770
 
            strwicmp(pszParmValue, "true") == 0 ||
2771
 
            strwicmp(pszParmValue, "1") == 0)
2772
 
                *pb = True;
2773
 
        else if (strwicmp(pszParmValue, "no") == 0 ||
2774
 
                    strwicmp(pszParmValue, "False") == 0 ||
2775
 
                    strwicmp(pszParmValue, "0") == 0)
2776
 
                *pb = False;
2777
 
        else {
2778
 
                DEBUG(0,
2779
 
                      ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
2780
 
                       pszParmValue));
2781
 
                bRetval = False;
2782
 
        }
2783
 
        return (bRetval);
2784
 
}
2785
 
 
2786
 
/***************************************************************************
2787
 
Find a service by name. Otherwise works like get_service.
2788
 
***************************************************************************/
2789
 
 
2790
 
static int getservicebyname(const char *pszServiceName, service * pserviceDest)
2791
 
{
2792
 
        int iService = -1;
2793
 
        char *canon_name;
2794
 
 
2795
 
        if (ServiceHash != NULL) {
2796
 
                if ( !(canon_name = canonicalize_servicename( pszServiceName )) )
2797
 
                        return -1;
2798
 
 
2799
 
                iService = tdb_fetch_int32(ServiceHash, canon_name );
2800
 
 
2801
 
                if (LP_SNUM_OK(iService)) {
2802
 
                        if (pserviceDest != NULL) {
2803
 
                                copy_service(pserviceDest, ServicePtrs[iService], NULL);
2804
 
                        }
2805
 
                } else {
2806
 
                        iService = -1;
2807
 
                }
2808
 
        }
2809
 
 
2810
 
        return (iService);
2811
 
}
2812
 
 
2813
 
/***************************************************************************
2814
 
 Copy a service structure to another.
2815
 
 If pcopymapDest is NULL then copy all fields
2816
 
***************************************************************************/
2817
 
 
2818
 
static void copy_service(service * pserviceDest, service * pserviceSource, BOOL *pcopymapDest)
2819
 
{
2820
 
        int i;
2821
 
        BOOL bcopyall = (pcopymapDest == NULL);
2822
 
        param_opt_struct *data, *pdata, *paramo;
2823
 
        BOOL not_added;
2824
 
 
2825
 
        for (i = 0; parm_table[i].label; i++)
2826
 
                if (parm_table[i].ptr && parm_table[i].p_class == P_LOCAL &&
2827
 
                    (bcopyall || pcopymapDest[i])) {
2828
 
                        void *def_ptr = parm_table[i].ptr;
2829
 
                        void *src_ptr =
2830
 
                                ((char *)pserviceSource) + PTR_DIFF(def_ptr,
2831
 
                                                                    &sDefault);
2832
 
                        void *dest_ptr =
2833
 
                                ((char *)pserviceDest) + PTR_DIFF(def_ptr,
2834
 
                                                                  &sDefault);
2835
 
 
2836
 
                        switch (parm_table[i].type) {
2837
 
                                case P_BOOL:
2838
 
                                case P_BOOLREV:
2839
 
                                        *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
2840
 
                                        break;
2841
 
 
2842
 
                                case P_INTEGER:
2843
 
                                case P_ENUM:
2844
 
                                case P_OCTAL:
2845
 
                                        *(int *)dest_ptr = *(int *)src_ptr;
2846
 
                                        break;
2847
 
 
2848
 
                                case P_CHAR:
2849
 
                                        *(char *)dest_ptr = *(char *)src_ptr;
2850
 
                                        break;
2851
 
 
2852
 
                                case P_STRING:
2853
 
                                        string_set((char **)dest_ptr,
2854
 
                                                   *(char **)src_ptr);
2855
 
                                        break;
2856
 
 
2857
 
                                case P_USTRING:
2858
 
                                        string_set((char **)dest_ptr,
2859
 
                                                   *(char **)src_ptr);
2860
 
                                        strupper_m(*(char **)dest_ptr);
2861
 
                                        break;
2862
 
                                case P_LIST:
2863
 
                                        str_list_free((char ***)dest_ptr);
2864
 
                                        str_list_copy((char ***)dest_ptr, *(const char ***)src_ptr);
2865
 
                                        break;
2866
 
                                default:
2867
 
                                        break;
2868
 
                        }
2869
 
                }
2870
 
 
2871
 
        if (bcopyall) {
2872
 
                init_copymap(pserviceDest);
2873
 
                if (pserviceSource->copymap)
2874
 
                        memcpy((void *)pserviceDest->copymap,
2875
 
                               (void *)pserviceSource->copymap,
2876
 
                               sizeof(BOOL) * NUMPARAMETERS);
2877
 
        }
2878
 
        
2879
 
        data = pserviceSource->param_opt;
2880
 
        while (data) {
2881
 
                not_added = True;
2882
 
                pdata = pserviceDest->param_opt;
2883
 
                /* Traverse destination */
2884
 
                while (pdata) {
2885
 
                        /* If we already have same option, override it */
2886
 
                        if (strcmp(pdata->key, data->key) == 0) {
2887
 
                                string_free(&pdata->value);
2888
 
                                str_list_free(&data->list);
2889
 
                                pdata->value = SMB_STRDUP(data->value);
2890
 
                                not_added = False;
2891
 
                                break;
2892
 
                        }
2893
 
                        pdata = pdata->next;
2894
 
                }
2895
 
                if (not_added) {
2896
 
                    paramo = SMB_XMALLOC_P(param_opt_struct);
2897
 
                    paramo->key = SMB_STRDUP(data->key);
2898
 
                    paramo->value = SMB_STRDUP(data->value);
2899
 
                    paramo->list = NULL;
2900
 
                    DLIST_ADD(pserviceDest->param_opt, paramo);
2901
 
                }
2902
 
                data = data->next;
2903
 
        }
2904
 
}
2905
 
 
2906
 
/***************************************************************************
2907
 
Check a service for consistency. Return False if the service is in any way
2908
 
incomplete or faulty, else True.
2909
 
***************************************************************************/
2910
 
 
2911
 
static BOOL service_ok(int iService)
2912
 
{
2913
 
        BOOL bRetval;
2914
 
 
2915
 
        bRetval = True;
2916
 
        if (ServicePtrs[iService]->szService[0] == '\0') {
2917
 
                DEBUG(0, ("The following message indicates an internal error:\n"));
2918
 
                DEBUG(0, ("No service name in service entry.\n"));
2919
 
                bRetval = False;
2920
 
        }
2921
 
 
2922
 
        /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2923
 
        /* I can't see why you'd want a non-printable printer service...        */
2924
 
        if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
2925
 
                if (!ServicePtrs[iService]->bPrint_ok) {
2926
 
                        DEBUG(0, ("WARNING: [%s] service MUST be printable!\n",
2927
 
                               ServicePtrs[iService]->szService));
2928
 
                        ServicePtrs[iService]->bPrint_ok = True;
2929
 
                }
2930
 
                /* [printers] service must also be non-browsable. */
2931
 
                if (ServicePtrs[iService]->bBrowseable)
2932
 
                        ServicePtrs[iService]->bBrowseable = False;
2933
 
        }
2934
 
 
2935
 
        if (ServicePtrs[iService]->szPath[0] == '\0' &&
2936
 
            strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0 &&
2937
 
            ServicePtrs[iService]->szMSDfsProxy[0] == '\0'
2938
 
            ) {
2939
 
                DEBUG(0, ("WARNING: No path in service %s - making it unavailable!\n",
2940
 
                        ServicePtrs[iService]->szService));
2941
 
                ServicePtrs[iService]->bAvailable = False;
2942
 
        }
2943
 
 
2944
 
        /* If a service is flagged unavailable, log the fact at level 0. */
2945
 
        if (!ServicePtrs[iService]->bAvailable)
2946
 
                DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2947
 
                          ServicePtrs[iService]->szService));
2948
 
 
2949
 
        return (bRetval);
2950
 
}
2951
 
 
2952
 
static struct file_lists {
2953
 
        struct file_lists *next;
2954
 
        char *name;
2955
 
        char *subfname;
2956
 
        time_t modtime;
2957
 
} *file_lists = NULL;
2958
 
 
2959
 
/*******************************************************************
2960
 
 Keep a linked list of all config files so we know when one has changed 
2961
 
 it's date and needs to be reloaded.
2962
 
********************************************************************/
2963
 
 
2964
 
static void add_to_file_list(const char *fname, const char *subfname)
2965
 
{
2966
 
        struct file_lists *f = file_lists;
2967
 
 
2968
 
        while (f) {
2969
 
                if (f->name && !strcmp(f->name, fname))
2970
 
                        break;
2971
 
                f = f->next;
2972
 
        }
2973
 
 
2974
 
        if (!f) {
2975
 
                f = SMB_MALLOC_P(struct file_lists);
2976
 
                if (!f)
2977
 
                        return;
2978
 
                f->next = file_lists;
2979
 
                f->name = SMB_STRDUP(fname);
2980
 
                if (!f->name) {
2981
 
                        SAFE_FREE(f);
2982
 
                        return;
2983
 
                }
2984
 
                f->subfname = SMB_STRDUP(subfname);
2985
 
                if (!f->subfname) {
2986
 
                        SAFE_FREE(f);
2987
 
                        return;
2988
 
                }
2989
 
                file_lists = f;
2990
 
                f->modtime = file_modtime(subfname);
2991
 
        } else {
2992
 
                time_t t = file_modtime(subfname);
2993
 
                if (t)
2994
 
                        f->modtime = t;
2995
 
        }
2996
 
}
2997
 
 
2998
 
/*******************************************************************
2999
 
 Check if a config file has changed date.
3000
 
********************************************************************/
3001
 
 
3002
 
BOOL lp_file_list_changed(void)
3003
 
{
3004
 
        struct file_lists *f = file_lists;
3005
 
 
3006
 
        DEBUG(6, ("lp_file_list_changed()\n"));
3007
 
 
3008
 
        while (f) {
3009
 
                pstring n2;
3010
 
                time_t mod_time;
3011
 
 
3012
 
                pstrcpy(n2, f->name);
3013
 
                standard_sub_basic( get_current_username(),
3014
 
                                    current_user_info.domain,
3015
 
                                    n2, sizeof(n2) );
3016
 
 
3017
 
                DEBUGADD(6, ("file %s -> %s  last mod_time: %s\n",
3018
 
                             f->name, n2, ctime(&f->modtime)));
3019
 
 
3020
 
                mod_time = file_modtime(n2);
3021
 
 
3022
 
                if (mod_time && ((f->modtime != mod_time) || (f->subfname == NULL) || (strcmp(n2, f->subfname) != 0))) {
3023
 
                        DEBUGADD(6,
3024
 
                                 ("file %s modified: %s\n", n2,
3025
 
                                  ctime(&mod_time)));
3026
 
                        f->modtime = mod_time;
3027
 
                        SAFE_FREE(f->subfname);
3028
 
                        f->subfname = SMB_STRDUP(n2);
3029
 
                        return (True);
3030
 
                }
3031
 
                f = f->next;
3032
 
        }
3033
 
        return (False);
3034
 
}
3035
 
 
3036
 
/***************************************************************************
3037
 
 Run standard_sub_basic on netbios name... needed because global_myname
3038
 
 is not accessed through any lp_ macro.
3039
 
 Note: We must *NOT* use string_set() here as ptr points to global_myname.
3040
 
***************************************************************************/
3041
 
 
3042
 
static BOOL handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
3043
 
{
3044
 
        BOOL ret;
3045
 
        pstring netbios_name;
3046
 
 
3047
 
        pstrcpy(netbios_name, pszParmValue);
3048
 
 
3049
 
        standard_sub_basic(get_current_username(), current_user_info.domain,
3050
 
                           netbios_name, sizeof(netbios_name));
3051
 
 
3052
 
        ret = set_global_myname(netbios_name);
3053
 
        string_set(&Globals.szNetbiosName,global_myname());
3054
 
        
3055
 
        DEBUG(4, ("handle_netbios_name: set global_myname to: %s\n",
3056
 
               global_myname()));
3057
 
 
3058
 
        return ret;
3059
 
}
3060
 
 
3061
 
static BOOL handle_charset(int snum, const char *pszParmValue, char **ptr)
3062
 
{
3063
 
        if (strcmp(*ptr, pszParmValue) != 0) {
3064
 
                string_set(ptr, pszParmValue);
3065
 
                init_iconv();
3066
 
        }
3067
 
        return True;
3068
 
}
3069
 
 
3070
 
 
3071
 
 
3072
 
static BOOL handle_workgroup(int snum, const char *pszParmValue, char **ptr)
3073
 
{
3074
 
        BOOL ret;
3075
 
        
3076
 
        ret = set_global_myworkgroup(pszParmValue);
3077
 
        string_set(&Globals.szWorkgroup,lp_workgroup());
3078
 
        
3079
 
        return ret;
3080
 
}
3081
 
 
3082
 
static BOOL handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
3083
 
{
3084
 
        BOOL ret;
3085
 
        
3086
 
        ret = set_global_scope(pszParmValue);
3087
 
        string_set(&Globals.szNetbiosScope,global_scope());
3088
 
 
3089
 
        return ret;
3090
 
}
3091
 
 
3092
 
static BOOL handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
3093
 
{
3094
 
        str_list_free(&Globals.szNetbiosAliases);
3095
 
        Globals.szNetbiosAliases = str_list_make(pszParmValue, NULL);
3096
 
        return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
3097
 
}
3098
 
 
3099
 
/***************************************************************************
3100
 
 Handle the include operation.
3101
 
***************************************************************************/
3102
 
 
3103
 
static BOOL handle_include(int snum, const char *pszParmValue, char **ptr)
3104
 
{
3105
 
        pstring fname;
3106
 
        pstrcpy(fname, pszParmValue);
3107
 
 
3108
 
        standard_sub_basic(get_current_username(), current_user_info.domain,
3109
 
                           fname,sizeof(fname));
3110
 
 
3111
 
        add_to_file_list(pszParmValue, fname);
3112
 
 
3113
 
        string_set(ptr, fname);
3114
 
 
3115
 
        if (file_exist(fname, NULL))
3116
 
                return (pm_process(fname, do_section, do_parameter));
3117
 
 
3118
 
        DEBUG(2, ("Can't find include file %s\n", fname));
3119
 
 
3120
 
        return (False);
3121
 
}
3122
 
 
3123
 
/***************************************************************************
3124
 
 Handle the interpretation of the copy parameter.
3125
 
***************************************************************************/
3126
 
 
3127
 
static BOOL handle_copy(int snum, const char *pszParmValue, char **ptr)
3128
 
{
3129
 
        BOOL bRetval;
3130
 
        int iTemp;
3131
 
        service serviceTemp;
3132
 
 
3133
 
        string_set(ptr, pszParmValue);
3134
 
 
3135
 
        init_service(&serviceTemp);
3136
 
 
3137
 
        bRetval = False;
3138
 
 
3139
 
        DEBUG(3, ("Copying service from service %s\n", pszParmValue));
3140
 
 
3141
 
        if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0) {
3142
 
                if (iTemp == iServiceIndex) {
3143
 
                        DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue));
3144
 
                } else {
3145
 
                        copy_service(ServicePtrs[iServiceIndex],
3146
 
                                     &serviceTemp,
3147
 
                                     ServicePtrs[iServiceIndex]->copymap);
3148
 
                        bRetval = True;
3149
 
                }
3150
 
        } else {
3151
 
                DEBUG(0, ("Unable to copy service - source not found: %s\n", pszParmValue));
3152
 
                bRetval = False;
3153
 
        }
3154
 
 
3155
 
        free_service(&serviceTemp);
3156
 
        return (bRetval);
3157
 
}
3158
 
 
3159
 
/***************************************************************************
3160
 
 Handle idmap/non unix account uid and gid allocation parameters.  The format of these
3161
 
 parameters is:
3162
 
 
3163
 
 [global]
3164
 
 
3165
 
        idmap uid = 1000-1999
3166
 
        idmap gid = 700-899
3167
 
 
3168
 
 We only do simple parsing checks here.  The strings are parsed into useful
3169
 
 structures in the idmap daemon code.
3170
 
 
3171
 
***************************************************************************/
3172
 
 
3173
 
/* Some lp_ routines to return idmap [ug]id information */
3174
 
 
3175
 
static uid_t idmap_uid_low, idmap_uid_high;
3176
 
static gid_t idmap_gid_low, idmap_gid_high;
3177
 
 
3178
 
BOOL lp_idmap_uid(uid_t *low, uid_t *high)
3179
 
{
3180
 
        if (idmap_uid_low == 0 || idmap_uid_high == 0)
3181
 
                return False;
3182
 
 
3183
 
        if (low)
3184
 
                *low = idmap_uid_low;
3185
 
 
3186
 
        if (high)
3187
 
                *high = idmap_uid_high;
3188
 
 
3189
 
        return True;
3190
 
}
3191
 
 
3192
 
BOOL lp_idmap_gid(gid_t *low, gid_t *high)
3193
 
{
3194
 
        if (idmap_gid_low == 0 || idmap_gid_high == 0)
3195
 
                return False;
3196
 
 
3197
 
        if (low)
3198
 
                *low = idmap_gid_low;
3199
 
 
3200
 
        if (high)
3201
 
                *high = idmap_gid_high;
3202
 
 
3203
 
        return True;
3204
 
}
3205
 
 
3206
 
/* Do some simple checks on "idmap [ug]id" parameter values */
3207
 
 
3208
 
static BOOL handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
3209
 
{
3210
 
        uint32 low, high;
3211
 
 
3212
 
        if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
3213
 
                return False;
3214
 
 
3215
 
        /* Parse OK */
3216
 
 
3217
 
        string_set(ptr, pszParmValue);
3218
 
 
3219
 
        idmap_uid_low = low;
3220
 
        idmap_uid_high = high;
3221
 
 
3222
 
        return True;
3223
 
}
3224
 
 
3225
 
static BOOL handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
3226
 
{
3227
 
        uint32 low, high;
3228
 
 
3229
 
        if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
3230
 
                return False;
3231
 
 
3232
 
        /* Parse OK */
3233
 
 
3234
 
        string_set(ptr, pszParmValue);
3235
 
 
3236
 
        idmap_gid_low = low;
3237
 
        idmap_gid_high = high;
3238
 
 
3239
 
        return True;
3240
 
}
3241
 
 
3242
 
/***************************************************************************
3243
 
 Handle the DEBUG level list.
3244
 
***************************************************************************/
3245
 
 
3246
 
static BOOL handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
3247
 
{
3248
 
        pstring pszParmValue;
3249
 
 
3250
 
        pstrcpy(pszParmValue, pszParmValueIn);
3251
 
        string_set(ptr, pszParmValueIn);
3252
 
        return debug_parse_levels( pszParmValue );
3253
 
}
3254
 
 
3255
 
/***************************************************************************
3256
 
 Handle ldap suffixes - default to ldapsuffix if sub-suffixes are not defined.
3257
 
***************************************************************************/
3258
 
 
3259
 
static const char *append_ldap_suffix( const char *str )
3260
 
{
3261
 
        const char *suffix_string;
3262
 
 
3263
 
 
3264
 
        if (!lp_talloc)
3265
 
                lp_talloc = talloc_init("lp_talloc");
3266
 
 
3267
 
        suffix_string = talloc_asprintf( lp_talloc, "%s,%s", str, Globals.szLdapSuffix );
3268
 
        if ( !suffix_string ) {
3269
 
                DEBUG(0,("append_ldap_suffix: talloc_asprintf() failed!\n"));
3270
 
                return "";
3271
 
        }
3272
 
 
3273
 
        return suffix_string;
3274
 
}
3275
 
 
3276
 
const char *lp_ldap_machine_suffix(void)
3277
 
{
3278
 
        if (Globals.szLdapMachineSuffix[0])
3279
 
                return append_ldap_suffix(Globals.szLdapMachineSuffix);
3280
 
 
3281
 
        return lp_string(Globals.szLdapSuffix);
3282
 
}
3283
 
 
3284
 
const char *lp_ldap_user_suffix(void)
3285
 
{
3286
 
        if (Globals.szLdapUserSuffix[0])
3287
 
                return append_ldap_suffix(Globals.szLdapUserSuffix);
3288
 
 
3289
 
        return lp_string(Globals.szLdapSuffix);
3290
 
}
3291
 
 
3292
 
const char *lp_ldap_group_suffix(void)
3293
 
{
3294
 
        if (Globals.szLdapGroupSuffix[0])
3295
 
                return append_ldap_suffix(Globals.szLdapGroupSuffix);
3296
 
 
3297
 
        return lp_string(Globals.szLdapSuffix);
3298
 
}
3299
 
 
3300
 
const char *lp_ldap_idmap_suffix(void)
3301
 
{
3302
 
        if (Globals.szLdapIdmapSuffix[0])
3303
 
                return append_ldap_suffix(Globals.szLdapIdmapSuffix);
3304
 
 
3305
 
        return lp_string(Globals.szLdapSuffix);
3306
 
}
3307
 
 
3308
 
/****************************************************************************
3309
 
 set the value for a P_ENUM
3310
 
 ***************************************************************************/
3311
 
 
3312
 
static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue,
3313
 
                              int *ptr )
3314
 
{
3315
 
        int i;
3316
 
 
3317
 
        for (i = 0; parm->enum_list[i].name; i++) {
3318
 
                if ( strequal(pszParmValue, parm->enum_list[i].name)) {
3319
 
                        *ptr = parm->enum_list[i].value;
3320
 
                        break;
3321
 
                }
3322
 
        }
3323
 
}
3324
 
 
3325
 
/***************************************************************************
3326
 
***************************************************************************/
3327
 
 
3328
 
static BOOL handle_printing(int snum, const char *pszParmValue, char **ptr)
3329
 
{
3330
 
        static int parm_num = -1;
3331
 
        service *s;
3332
 
 
3333
 
        if ( parm_num == -1 )
3334
 
                parm_num = map_parameter( "printing" );
3335
 
 
3336
 
        lp_set_enum_parm( &parm_table[parm_num], pszParmValue, (int*)ptr );
3337
 
 
3338
 
        if ( snum < 0 )
3339
 
                s = &sDefault;
3340
 
        else
3341
 
                s = ServicePtrs[snum];
3342
 
 
3343
 
        init_printer_values( s );
3344
 
 
3345
 
        return True;
3346
 
}
3347
 
 
3348
 
 
3349
 
/***************************************************************************
3350
 
 Initialise a copymap.
3351
 
***************************************************************************/
3352
 
 
3353
 
static void init_copymap(service * pservice)
3354
 
{
3355
 
        int i;
3356
 
        SAFE_FREE(pservice->copymap);
3357
 
        pservice->copymap = SMB_MALLOC_ARRAY(BOOL,NUMPARAMETERS);
3358
 
        if (!pservice->copymap)
3359
 
                DEBUG(0,
3360
 
                      ("Couldn't allocate copymap!! (size %d)\n",
3361
 
                       (int)NUMPARAMETERS));
3362
 
        else
3363
 
                for (i = 0; i < NUMPARAMETERS; i++)
3364
 
                        pservice->copymap[i] = True;
3365
 
}
3366
 
 
3367
 
/***************************************************************************
3368
 
 Return the local pointer to a parameter given the service number and the 
3369
 
 pointer into the default structure.
3370
 
***************************************************************************/
3371
 
 
3372
 
void *lp_local_ptr(int snum, void *ptr)
3373
 
{
3374
 
        return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
3375
 
}
3376
 
 
3377
 
/***************************************************************************
3378
 
 Process a parameter for a particular service number. If snum < 0
3379
 
 then assume we are in the globals.
3380
 
***************************************************************************/
3381
 
 
3382
 
BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
3383
 
{
3384
 
        int parmnum, i, slen;
3385
 
        void *parm_ptr = NULL;  /* where we are going to store the result */
3386
 
        void *def_ptr = NULL;
3387
 
        pstring param_key;
3388
 
        char *sep;
3389
 
        param_opt_struct *paramo, *data;
3390
 
        BOOL not_added;
3391
 
 
3392
 
        parmnum = map_parameter(pszParmName);
3393
 
 
3394
 
        if (parmnum < 0) {
3395
 
                if ((sep=strchr(pszParmName, ':')) != NULL) {
3396
 
                        *sep = '\0';
3397
 
                        ZERO_STRUCT(param_key);
3398
 
                        pstr_sprintf(param_key, "%s:", pszParmName);
3399
 
                        slen = strlen(param_key);
3400
 
                        pstrcat(param_key, sep+1);
3401
 
                        trim_char(param_key+slen, ' ', ' ');
3402
 
                        not_added = True;
3403
 
                        data = (snum < 0) ? Globals.param_opt : 
3404
 
                                ServicePtrs[snum]->param_opt;
3405
 
                        /* Traverse destination */
3406
 
                        while (data) {
3407
 
                                /* If we already have same option, override it */
3408
 
                                if (strcmp(data->key, param_key) == 0) {
3409
 
                                        string_free(&data->value);
3410
 
                                        str_list_free(&data->list);
3411
 
                                        data->value = SMB_STRDUP(pszParmValue);
3412
 
                                        not_added = False;
3413
 
                                        break;
3414
 
                                }
3415
 
                                data = data->next;
3416
 
                        }
3417
 
                        if (not_added) {
3418
 
                                paramo = SMB_XMALLOC_P(param_opt_struct);
3419
 
                                paramo->key = SMB_STRDUP(param_key);
3420
 
                                paramo->value = SMB_STRDUP(pszParmValue);
3421
 
                                paramo->list = NULL;
3422
 
                                if (snum < 0) {
3423
 
                                        DLIST_ADD(Globals.param_opt, paramo);
3424
 
                                } else {
3425
 
                                        DLIST_ADD(ServicePtrs[snum]->param_opt, paramo);
3426
 
                                }
3427
 
                        }
3428
 
 
3429
 
                        *sep = ':';
3430
 
                        return (True);
3431
 
                }
3432
 
                DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName));
3433
 
                return (True);
3434
 
        }
3435
 
 
3436
 
        if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
3437
 
                DEBUG(1, ("WARNING: The \"%s\" option is deprecated\n",
3438
 
                          pszParmName));
3439
 
        }
3440
 
 
3441
 
        def_ptr = parm_table[parmnum].ptr;
3442
 
 
3443
 
        /* we might point at a service, the default service or a global */
3444
 
        if (snum < 0) {
3445
 
                parm_ptr = def_ptr;
3446
 
        } else {
3447
 
                if (parm_table[parmnum].p_class == P_GLOBAL) {
3448
 
                        DEBUG(0,
3449
 
                              ("Global parameter %s found in service section!\n",
3450
 
                               pszParmName));
3451
 
                        return (True);
3452
 
                }
3453
 
                parm_ptr =
3454
 
                        ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
3455
 
                                                            &sDefault);
3456
 
        }
3457
 
 
3458
 
        if (snum >= 0) {
3459
 
                if (!ServicePtrs[snum]->copymap)
3460
 
                        init_copymap(ServicePtrs[snum]);
3461
 
 
3462
 
                /* this handles the aliases - set the copymap for other entries with
3463
 
                   the same data pointer */
3464
 
                for (i = 0; parm_table[i].label; i++)
3465
 
                        if (parm_table[i].ptr == parm_table[parmnum].ptr)
3466
 
                                ServicePtrs[snum]->copymap[i] = False;
3467
 
        }
3468
 
 
3469
 
        /* if it is a special case then go ahead */
3470
 
        if (parm_table[parmnum].special) {
3471
 
                parm_table[parmnum].special(snum, pszParmValue, (char **)parm_ptr);
3472
 
                return (True);
3473
 
        }
3474
 
 
3475
 
        /* now switch on the type of variable it is */
3476
 
        switch (parm_table[parmnum].type)
3477
 
        {
3478
 
                case P_BOOL:
3479
 
                        *(BOOL *)parm_ptr = lp_bool(pszParmValue);
3480
 
                        break;
3481
 
 
3482
 
                case P_BOOLREV:
3483
 
                        *(BOOL *)parm_ptr = !lp_bool(pszParmValue);
3484
 
                        break;
3485
 
 
3486
 
                case P_INTEGER:
3487
 
                        *(int *)parm_ptr = lp_int(pszParmValue);
3488
 
                        break;
3489
 
 
3490
 
                case P_CHAR:
3491
 
                        *(char *)parm_ptr = *pszParmValue;
3492
 
                        break;
3493
 
 
3494
 
                case P_OCTAL:
3495
 
                        i = sscanf(pszParmValue, "%o", (int *)parm_ptr);
3496
 
                        if ( i != 1 ) {
3497
 
                            DEBUG ( 0, ("Invalid octal number %s\n", pszParmName ));
3498
 
                        }
3499
 
                        break;
3500
 
 
3501
 
                case P_LIST:
3502
 
                        str_list_free((char ***)parm_ptr);
3503
 
                        *(char ***)parm_ptr = str_list_make(pszParmValue, NULL);
3504
 
                        break;
3505
 
 
3506
 
                case P_STRING:
3507
 
                        string_set((char **)parm_ptr, pszParmValue);
3508
 
                        break;
3509
 
 
3510
 
                case P_USTRING:
3511
 
                        string_set((char **)parm_ptr, pszParmValue);
3512
 
                        strupper_m(*(char **)parm_ptr);
3513
 
                        break;
3514
 
 
3515
 
                case P_GSTRING:
3516
 
                        pstrcpy((char *)parm_ptr, pszParmValue);
3517
 
                        break;
3518
 
 
3519
 
                case P_UGSTRING:
3520
 
                        pstrcpy((char *)parm_ptr, pszParmValue);
3521
 
                        strupper_m((char *)parm_ptr);
3522
 
                        break;
3523
 
 
3524
 
                case P_ENUM:
3525
 
                        lp_set_enum_parm( &parm_table[parmnum], pszParmValue, (int*)parm_ptr );
3526
 
                        break;
3527
 
                case P_SEP:
3528
 
                        break;
3529
 
        }
3530
 
 
3531
 
        return (True);
3532
 
}
3533
 
 
3534
 
/***************************************************************************
3535
 
 Process a parameter.
3536
 
***************************************************************************/
3537
 
 
3538
 
static BOOL do_parameter(const char *pszParmName, const char *pszParmValue)
3539
 
{
3540
 
        if (!bInGlobalSection && bGlobalOnly)
3541
 
                return (True);
3542
 
 
3543
 
        DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
3544
 
 
3545
 
        return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
3546
 
                                pszParmName, pszParmValue));
3547
 
}
3548
 
 
3549
 
/***************************************************************************
3550
 
 Print a parameter of the specified type.
3551
 
***************************************************************************/
3552
 
 
3553
 
static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
3554
 
{
3555
 
        int i;
3556
 
        switch (p->type)
3557
 
        {
3558
 
                case P_ENUM:
3559
 
                        for (i = 0; p->enum_list[i].name; i++) {
3560
 
                                if (*(int *)ptr == p->enum_list[i].value) {
3561
 
                                        fprintf(f, "%s",
3562
 
                                                p->enum_list[i].name);
3563
 
                                        break;
3564
 
                                }
3565
 
                        }
3566
 
                        break;
3567
 
 
3568
 
                case P_BOOL:
3569
 
                        fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
3570
 
                        break;
3571
 
 
3572
 
                case P_BOOLREV:
3573
 
                        fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
3574
 
                        break;
3575
 
 
3576
 
                case P_INTEGER:
3577
 
                        fprintf(f, "%d", *(int *)ptr);
3578
 
                        break;
3579
 
 
3580
 
                case P_CHAR:
3581
 
                        fprintf(f, "%c", *(char *)ptr);
3582
 
                        break;
3583
 
 
3584
 
                case P_OCTAL:
3585
 
                        fprintf(f, "%s", octal_string(*(int *)ptr));
3586
 
                        break;
3587
 
 
3588
 
                case P_LIST:
3589
 
                        if ((char ***)ptr && *(char ***)ptr) {
3590
 
                                char **list = *(char ***)ptr;
3591
 
                                
3592
 
                                for (; *list; list++) {
3593
 
                                        /* surround strings with whitespace in double quotes */
3594
 
                                        if ( strchr_m( *list, ' ' ) )
3595
 
                                                fprintf(f, "\"%s\"%s", *list, ((*(list+1))?", ":""));
3596
 
                                        else
3597
 
                                                fprintf(f, "%s%s", *list, ((*(list+1))?", ":""));
3598
 
                                }
3599
 
                        }
3600
 
                        break;
3601
 
 
3602
 
                case P_GSTRING:
3603
 
                case P_UGSTRING:
3604
 
                        if ((char *)ptr) {
3605
 
                                fprintf(f, "%s", (char *)ptr);
3606
 
                        }
3607
 
                        break;
3608
 
 
3609
 
                case P_STRING:
3610
 
                case P_USTRING:
3611
 
                        if (*(char **)ptr) {
3612
 
                                fprintf(f, "%s", *(char **)ptr);
3613
 
                        }
3614
 
                        break;
3615
 
                case P_SEP:
3616
 
                        break;
3617
 
        }
3618
 
}
3619
 
 
3620
 
/***************************************************************************
3621
 
 Check if two parameters are equal.
3622
 
***************************************************************************/
3623
 
 
3624
 
static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
3625
 
{
3626
 
        switch (type) {
3627
 
                case P_BOOL:
3628
 
                case P_BOOLREV:
3629
 
                        return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
3630
 
 
3631
 
                case P_INTEGER:
3632
 
                case P_ENUM:
3633
 
                case P_OCTAL:
3634
 
                        return (*((int *)ptr1) == *((int *)ptr2));
3635
 
 
3636
 
                case P_CHAR:
3637
 
                        return (*((char *)ptr1) == *((char *)ptr2));
3638
 
                
3639
 
                case P_LIST:
3640
 
                        return str_list_compare(*(char ***)ptr1, *(char ***)ptr2);
3641
 
 
3642
 
                case P_GSTRING:
3643
 
                case P_UGSTRING:
3644
 
                {
3645
 
                        char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
3646
 
                        if (p1 && !*p1)
3647
 
                                p1 = NULL;
3648
 
                        if (p2 && !*p2)
3649
 
                                p2 = NULL;
3650
 
                        return (p1 == p2 || strequal(p1, p2));
3651
 
                }
3652
 
                case P_STRING:
3653
 
                case P_USTRING:
3654
 
                {
3655
 
                        char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
3656
 
                        if (p1 && !*p1)
3657
 
                                p1 = NULL;
3658
 
                        if (p2 && !*p2)
3659
 
                                p2 = NULL;
3660
 
                        return (p1 == p2 || strequal(p1, p2));
3661
 
                }
3662
 
                case P_SEP:
3663
 
                        break;
3664
 
        }
3665
 
        return (False);
3666
 
}
3667
 
 
3668
 
/***************************************************************************
3669
 
 Initialize any local varients in the sDefault table.
3670
 
***************************************************************************/
3671
 
 
3672
 
void init_locals(void)
3673
 
{
3674
 
        /* None as yet. */
3675
 
}
3676
 
 
3677
 
/***************************************************************************
3678
 
 Process a new section (service). At this stage all sections are services.
3679
 
 Later we'll have special sections that permit server parameters to be set.
3680
 
 Returns True on success, False on failure. 
3681
 
***************************************************************************/
3682
 
 
3683
 
static BOOL do_section(const char *pszSectionName)
3684
 
{
3685
 
        BOOL bRetval;
3686
 
        BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
3687
 
                         (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
3688
 
        bRetval = False;
3689
 
 
3690
 
        /* if we were in a global section then do the local inits */
3691
 
        if (bInGlobalSection && !isglobal)
3692
 
                init_locals();
3693
 
 
3694
 
        /* if we've just struck a global section, note the fact. */
3695
 
        bInGlobalSection = isglobal;
3696
 
 
3697
 
        /* check for multiple global sections */
3698
 
        if (bInGlobalSection) {
3699
 
                DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
3700
 
                return (True);
3701
 
        }
3702
 
 
3703
 
        if (!bInGlobalSection && bGlobalOnly)
3704
 
                return (True);
3705
 
 
3706
 
        /* if we have a current service, tidy it up before moving on */
3707
 
        bRetval = True;
3708
 
 
3709
 
        if (iServiceIndex >= 0)
3710
 
                bRetval = service_ok(iServiceIndex);
3711
 
 
3712
 
        /* if all is still well, move to the next record in the services array */
3713
 
        if (bRetval) {
3714
 
                /* We put this here to avoid an odd message order if messages are */
3715
 
                /* issued by the post-processing of a previous section. */
3716
 
                DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
3717
 
 
3718
 
                if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
3719
 
                    < 0) {
3720
 
                        DEBUG(0, ("Failed to add a new service\n"));
3721
 
                        return (False);
3722
 
                }
3723
 
        }
3724
 
 
3725
 
        return (bRetval);
3726
 
}
3727
 
 
3728
 
 
3729
 
/***************************************************************************
3730
 
 Determine if a partcular base parameter is currentl set to the default value.
3731
 
***************************************************************************/
3732
 
 
3733
 
static BOOL is_default(int i)
3734
 
{
3735
 
        if (!defaults_saved)
3736
 
                return False;
3737
 
        switch (parm_table[i].type) {
3738
 
                case P_LIST:
3739
 
                        return str_list_compare (parm_table[i].def.lvalue, 
3740
 
                                                *(char ***)parm_table[i].ptr);
3741
 
                case P_STRING:
3742
 
                case P_USTRING:
3743
 
                        return strequal(parm_table[i].def.svalue,
3744
 
                                        *(char **)parm_table[i].ptr);
3745
 
                case P_GSTRING:
3746
 
                case P_UGSTRING:
3747
 
                        return strequal(parm_table[i].def.svalue,
3748
 
                                        (char *)parm_table[i].ptr);
3749
 
                case P_BOOL:
3750
 
                case P_BOOLREV:
3751
 
                        return parm_table[i].def.bvalue ==
3752
 
                                *(BOOL *)parm_table[i].ptr;
3753
 
                case P_CHAR:
3754
 
                        return parm_table[i].def.cvalue ==
3755
 
                                *(char *)parm_table[i].ptr;
3756
 
                case P_INTEGER:
3757
 
                case P_OCTAL:
3758
 
                case P_ENUM:
3759
 
                        return parm_table[i].def.ivalue ==
3760
 
                                *(int *)parm_table[i].ptr;
3761
 
                case P_SEP:
3762
 
                        break;
3763
 
        }
3764
 
        return False;
3765
 
}
3766
 
 
3767
 
/***************************************************************************
3768
 
Display the contents of the global structure.
3769
 
***************************************************************************/
3770
 
 
3771
 
static void dump_globals(FILE *f)
3772
 
{
3773
 
        int i;
3774
 
        param_opt_struct *data;
3775
 
        
3776
 
        fprintf(f, "[global]\n");
3777
 
 
3778
 
        for (i = 0; parm_table[i].label; i++)
3779
 
                if (parm_table[i].p_class == P_GLOBAL &&
3780
 
                    parm_table[i].ptr &&
3781
 
                    (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
3782
 
                        if (defaults_saved && is_default(i))
3783
 
                                continue;
3784
 
                        fprintf(f, "\t%s = ", parm_table[i].label);
3785
 
                        print_parameter(&parm_table[i], parm_table[i].ptr, f);
3786
 
                        fprintf(f, "\n");
3787
 
        }
3788
 
        if (Globals.param_opt != NULL) {
3789
 
                data = Globals.param_opt;
3790
 
                while(data) {
3791
 
                        fprintf(f, "\t%s = %s\n", data->key, data->value);
3792
 
                        data = data->next;
3793
 
                }
3794
 
        }
3795
 
 
3796
 
}
3797
 
 
3798
 
/***************************************************************************
3799
 
 Return True if a local parameter is currently set to the global default.
3800
 
***************************************************************************/
3801
 
 
3802
 
BOOL lp_is_default(int snum, struct parm_struct *parm)
3803
 
{
3804
 
        int pdiff = PTR_DIFF(parm->ptr, &sDefault);
3805
 
 
3806
 
        return equal_parameter(parm->type,
3807
 
                               ((char *)ServicePtrs[snum]) + pdiff,
3808
 
                               ((char *)&sDefault) + pdiff);
3809
 
}
3810
 
 
3811
 
/***************************************************************************
3812
 
 Display the contents of a single services record.
3813
 
***************************************************************************/
3814
 
 
3815
 
static void dump_a_service(service * pService, FILE * f)
3816
 
{
3817
 
        int i;
3818
 
        param_opt_struct *data;
3819
 
        
3820
 
        if (pService != &sDefault)
3821
 
                fprintf(f, "[%s]\n", pService->szService);
3822
 
 
3823
 
        for (i = 0; parm_table[i].label; i++) {
3824
 
 
3825
 
                if (parm_table[i].p_class == P_LOCAL &&
3826
 
                    parm_table[i].ptr &&
3827
 
                    (*parm_table[i].label != '-') &&
3828
 
                    (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) 
3829
 
                {
3830
 
                
3831
 
                        int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
3832
 
 
3833
 
                        if (pService == &sDefault) {
3834
 
                                if (defaults_saved && is_default(i))
3835
 
                                        continue;
3836
 
                        } else {
3837
 
                                if (equal_parameter(parm_table[i].type,
3838
 
                                                    ((char *)pService) +
3839
 
                                                    pdiff,
3840
 
                                                    ((char *)&sDefault) +
3841
 
                                                    pdiff))
3842
 
                                        continue;
3843
 
                        }
3844
 
 
3845
 
                        fprintf(f, "\t%s = ", parm_table[i].label);
3846
 
                        print_parameter(&parm_table[i],
3847
 
                                        ((char *)pService) + pdiff, f);
3848
 
                        fprintf(f, "\n");
3849
 
                }
3850
 
        }
3851
 
 
3852
 
                if (pService->param_opt != NULL) {
3853
 
                        data = pService->param_opt;
3854
 
                        while(data) {
3855
 
                                fprintf(f, "\t%s = %s\n", data->key, data->value);
3856
 
                                data = data->next;
3857
 
                        }
3858
 
                }
3859
 
}
3860
 
 
3861
 
/***************************************************************************
3862
 
 Display the contents of a parameter of a single services record.
3863
 
***************************************************************************/
3864
 
 
3865
 
BOOL dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
3866
 
{
3867
 
        service * pService = ServicePtrs[snum];
3868
 
        int i;
3869
 
        BOOL result = False;
3870
 
        parm_class p_class;
3871
 
        unsigned flag = 0;
3872
 
        fstring local_parm_name;
3873
 
        char *parm_opt;
3874
 
        const char *parm_opt_value;
3875
 
 
3876
 
        /* check for parametrical option */
3877
 
        fstrcpy( local_parm_name, parm_name);
3878
 
        parm_opt = strchr( local_parm_name, ':');
3879
 
 
3880
 
        if (parm_opt) {
3881
 
                *parm_opt = '\0';
3882
 
                parm_opt++;
3883
 
                if (strlen(parm_opt)) {
3884
 
                        parm_opt_value = lp_parm_const_string( snum,
3885
 
                                local_parm_name, parm_opt, NULL);
3886
 
                        if (parm_opt_value) {
3887
 
                                printf( "%s\n", parm_opt_value);
3888
 
                                result = True;
3889
 
                        }
3890
 
                }
3891
 
                return result;
3892
 
        }
3893
 
 
3894
 
        /* check for a key and print the value */
3895
 
        if (isGlobal) {
3896
 
                p_class = P_GLOBAL;
3897
 
                flag = FLAG_GLOBAL;
3898
 
        } else
3899
 
                p_class = P_LOCAL;
3900
 
 
3901
 
        for (i = 0; parm_table[i].label; i++) {
3902
 
                if (strwicmp(parm_table[i].label, parm_name) == 0 &&
3903
 
                    (parm_table[i].p_class == p_class || parm_table[i].flags & flag) &&
3904
 
                    parm_table[i].ptr &&
3905
 
                    (*parm_table[i].label != '-') &&
3906
 
                    (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) 
3907
 
                {
3908
 
                        void *ptr;
3909
 
 
3910
 
                        if (isGlobal)
3911
 
                                ptr = parm_table[i].ptr;
3912
 
                        else
3913
 
                                ptr = ((char *)pService) +
3914
 
                                        PTR_DIFF(parm_table[i].ptr, &sDefault);
3915
 
 
3916
 
                        print_parameter(&parm_table[i],
3917
 
                                        ptr, f);
3918
 
                        fprintf(f, "\n");
3919
 
                        result = True;
3920
 
                        break;
3921
 
                }
3922
 
        }
3923
 
 
3924
 
        return result;
3925
 
}
3926
 
 
3927
 
/***************************************************************************
3928
 
 Return info about the next service  in a service. snum==GLOBAL_SECTION_SNUM gives the globals.
3929
 
 Return NULL when out of parameters.
3930
 
***************************************************************************/
3931
 
 
3932
 
struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
3933
 
{
3934
 
        if (snum < 0) {
3935
 
                /* do the globals */
3936
 
                for (; parm_table[*i].label; (*i)++) {
3937
 
                        if (parm_table[*i].p_class == P_SEPARATOR)
3938
 
                                return &parm_table[(*i)++];
3939
 
 
3940
 
                        if (!parm_table[*i].ptr
3941
 
                            || (*parm_table[*i].label == '-'))
3942
 
                                continue;
3943
 
 
3944
 
                        if ((*i) > 0
3945
 
                            && (parm_table[*i].ptr ==
3946
 
                                parm_table[(*i) - 1].ptr))
3947
 
                                continue;
3948
 
 
3949
 
                        return &parm_table[(*i)++];
3950
 
                }
3951
 
        } else {
3952
 
                service *pService = ServicePtrs[snum];
3953
 
 
3954
 
                for (; parm_table[*i].label; (*i)++) {
3955
 
                        if (parm_table[*i].p_class == P_SEPARATOR)
3956
 
                                return &parm_table[(*i)++];
3957
 
 
3958
 
                        if (parm_table[*i].p_class == P_LOCAL &&
3959
 
                            parm_table[*i].ptr &&
3960
 
                            (*parm_table[*i].label != '-') &&
3961
 
                            ((*i) == 0 ||
3962
 
                             (parm_table[*i].ptr !=
3963
 
                              parm_table[(*i) - 1].ptr)))
3964
 
                        {
3965
 
                                int pdiff =
3966
 
                                        PTR_DIFF(parm_table[*i].ptr,
3967
 
                                                 &sDefault);
3968
 
 
3969
 
                                if (allparameters ||
3970
 
                                    !equal_parameter(parm_table[*i].type,
3971
 
                                                     ((char *)pService) +
3972
 
                                                     pdiff,
3973
 
                                                     ((char *)&sDefault) +
3974
 
                                                     pdiff))
3975
 
                                {
3976
 
                                        return &parm_table[(*i)++];
3977
 
                                }
3978
 
                        }
3979
 
                }
3980
 
        }
3981
 
 
3982
 
        return NULL;
3983
 
}
3984
 
 
3985
 
 
3986
 
#if 0
3987
 
/***************************************************************************
3988
 
 Display the contents of a single copy structure.
3989
 
***************************************************************************/
3990
 
static void dump_copy_map(BOOL *pcopymap)
3991
 
{
3992
 
        int i;
3993
 
        if (!pcopymap)
3994
 
                return;
3995
 
 
3996
 
        printf("\n\tNon-Copied parameters:\n");
3997
 
 
3998
 
        for (i = 0; parm_table[i].label; i++)
3999
 
                if (parm_table[i].p_class == P_LOCAL &&
4000
 
                    parm_table[i].ptr && !pcopymap[i] &&
4001
 
                    (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
4002
 
                {
4003
 
                        printf("\t\t%s\n", parm_table[i].label);
4004
 
                }
4005
 
}
4006
 
#endif
4007
 
 
4008
 
/***************************************************************************
4009
 
 Return TRUE if the passed service number is within range.
4010
 
***************************************************************************/
4011
 
 
4012
 
BOOL lp_snum_ok(int iService)
4013
 
{
4014
 
        return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
4015
 
}
4016
 
 
4017
 
/***************************************************************************
4018
 
 Auto-load some home services.
4019
 
***************************************************************************/
4020
 
 
4021
 
static void lp_add_auto_services(char *str)
4022
 
{
4023
 
        char *s;
4024
 
        char *p;
4025
 
        int homes;
4026
 
 
4027
 
        if (!str)
4028
 
                return;
4029
 
 
4030
 
        s = SMB_STRDUP(str);
4031
 
        if (!s)
4032
 
                return;
4033
 
 
4034
 
        homes = lp_servicenumber(HOMES_NAME);
4035
 
 
4036
 
        for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP)) {
4037
 
                char *home = get_user_home_dir(p);
4038
 
 
4039
 
                if (lp_servicenumber(p) >= 0)
4040
 
                        continue;
4041
 
 
4042
 
                if (home && homes >= 0)
4043
 
                        lp_add_home(p, homes, p, home);
4044
 
        }
4045
 
        SAFE_FREE(s);
4046
 
}
4047
 
 
4048
 
/***************************************************************************
4049
 
 Auto-load one printer.
4050
 
***************************************************************************/
4051
 
 
4052
 
void lp_add_one_printer(char *name, char *comment)
4053
 
{
4054
 
        int printers = lp_servicenumber(PRINTERS_NAME);
4055
 
        int i;
4056
 
 
4057
 
        if (lp_servicenumber(name) < 0) {
4058
 
                lp_add_printer(name, printers);
4059
 
                if ((i = lp_servicenumber(name)) >= 0) {
4060
 
                        string_set(&ServicePtrs[i]->comment, comment);
4061
 
                        ServicePtrs[i]->autoloaded = True;
4062
 
                }
4063
 
        }
4064
 
}
4065
 
 
4066
 
/***************************************************************************
4067
 
 Have we loaded a services file yet?
4068
 
***************************************************************************/
4069
 
 
4070
 
BOOL lp_loaded(void)
4071
 
{
4072
 
        return (bLoaded);
4073
 
}
4074
 
 
4075
 
/***************************************************************************
4076
 
 Unload unused services.
4077
 
***************************************************************************/
4078
 
 
4079
 
void lp_killunused(BOOL (*snumused) (int))
4080
 
{
4081
 
        int i;
4082
 
        for (i = 0; i < iNumServices; i++) {
4083
 
                if (!VALID(i))
4084
 
                        continue;
4085
 
 
4086
 
                /* don't kill autoloaded or usershare services */
4087
 
                if ( ServicePtrs[i]->autoloaded ||
4088
 
                                ServicePtrs[i]->usershare == USERSHARE_VALID) {
4089
 
                        continue;
4090
 
                }
4091
 
 
4092
 
                if (!snumused || !snumused(i)) {
4093
 
                        free_service_byindex(i);
4094
 
                }
4095
 
        }
4096
 
}
4097
 
 
4098
 
/***************************************************************************
4099
 
 Unload a service.
4100
 
***************************************************************************/
4101
 
 
4102
 
void lp_killservice(int iServiceIn)
4103
 
{
4104
 
        if (VALID(iServiceIn)) {
4105
 
                free_service_byindex(iServiceIn);
4106
 
        }
4107
 
}
4108
 
 
4109
 
/***************************************************************************
4110
 
 Save the curent values of all global and sDefault parameters into the 
4111
 
 defaults union. This allows swat and testparm to show only the
4112
 
 changed (ie. non-default) parameters.
4113
 
***************************************************************************/
4114
 
 
4115
 
static void lp_save_defaults(void)
4116
 
{
4117
 
        int i;
4118
 
        for (i = 0; parm_table[i].label; i++) {
4119
 
                if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
4120
 
                        continue;
4121
 
                switch (parm_table[i].type) {
4122
 
                        case P_LIST:
4123
 
                                str_list_copy(&(parm_table[i].def.lvalue),
4124
 
                                            *(const char ***)parm_table[i].ptr);
4125
 
                                break;
4126
 
                        case P_STRING:
4127
 
                        case P_USTRING:
4128
 
                                if (parm_table[i].ptr) {
4129
 
                                        parm_table[i].def.svalue = SMB_STRDUP(*(char **)parm_table[i].ptr);
4130
 
                                } else {
4131
 
                                        parm_table[i].def.svalue = NULL;
4132
 
                                }
4133
 
                                break;
4134
 
                        case P_GSTRING:
4135
 
                        case P_UGSTRING:
4136
 
                                if (parm_table[i].ptr) {
4137
 
                                        parm_table[i].def.svalue = SMB_STRDUP((char *)parm_table[i].ptr);
4138
 
                                } else {
4139
 
                                        parm_table[i].def.svalue = NULL;
4140
 
                                }
4141
 
                                break;
4142
 
                        case P_BOOL:
4143
 
                        case P_BOOLREV:
4144
 
                                parm_table[i].def.bvalue =
4145
 
                                        *(BOOL *)parm_table[i].ptr;
4146
 
                                break;
4147
 
                        case P_CHAR:
4148
 
                                parm_table[i].def.cvalue =
4149
 
                                        *(char *)parm_table[i].ptr;
4150
 
                                break;
4151
 
                        case P_INTEGER:
4152
 
                        case P_OCTAL:
4153
 
                        case P_ENUM:
4154
 
                                parm_table[i].def.ivalue =
4155
 
                                        *(int *)parm_table[i].ptr;
4156
 
                                break;
4157
 
                        case P_SEP:
4158
 
                                break;
4159
 
                }
4160
 
        }
4161
 
        defaults_saved = True;
4162
 
}
4163
 
 
4164
 
/*******************************************************************
4165
 
 Set the server type we will announce as via nmbd.
4166
 
********************************************************************/
4167
 
 
4168
 
static const struct srv_role_tab {
4169
 
        uint32 role;
4170
 
        const char *role_str;
4171
 
} srv_role_tab [] = {
4172
 
        { ROLE_STANDALONE, "ROLE_STANDALONE" },
4173
 
        { ROLE_DOMAIN_MEMBER, "ROLE_DOMAIN_MEMBER" },
4174
 
        { ROLE_DOMAIN_BDC, "ROLE_DOMAIN_BDC" },
4175
 
        { ROLE_DOMAIN_PDC, "ROLE_DOMAIN_PDC" },
4176
 
        { 0, NULL }
4177
 
};
4178
 
 
4179
 
const char* server_role_str(uint32 role)
4180
 
{
4181
 
        int i = 0;
4182
 
        for (i=0; srv_role_tab[i].role_str; i++) {
4183
 
                if (role == srv_role_tab[i].role) {
4184
 
                        return srv_role_tab[i].role_str;
4185
 
                }
4186
 
        }
4187
 
        return NULL;
4188
 
}
4189
 
 
4190
 
static void set_server_role(void)
4191
 
{
4192
 
        server_role = ROLE_STANDALONE;
4193
 
 
4194
 
        switch (lp_security()) {
4195
 
                case SEC_SHARE:
4196
 
                        if (lp_domain_logons())
4197
 
                                DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
4198
 
                        break;
4199
 
                case SEC_SERVER:
4200
 
                        if (lp_domain_logons())
4201
 
                                DEBUG(0, ("Server's Role (logon server) conflicts with server-level security\n"));
4202
 
                        /* this used to be considered ROLE_DOMAIN_MEMBER but that's just wrong */
4203
 
                        server_role = ROLE_STANDALONE;
4204
 
                        break;
4205
 
                case SEC_DOMAIN:
4206
 
                        if (lp_domain_logons()) {
4207
 
                                DEBUG(1, ("Server's Role (logon server) NOT ADVISED with domain-level security\n"));
4208
 
                                server_role = ROLE_DOMAIN_BDC;
4209
 
                                break;
4210
 
                        }
4211
 
                        server_role = ROLE_DOMAIN_MEMBER;
4212
 
                        break;
4213
 
                case SEC_ADS:
4214
 
                        if (lp_domain_logons()) {
4215
 
                                server_role = ROLE_DOMAIN_PDC;
4216
 
                                break;
4217
 
                        }
4218
 
                        server_role = ROLE_DOMAIN_MEMBER;
4219
 
                        break;
4220
 
                case SEC_USER:
4221
 
                        if (lp_domain_logons()) {
4222
 
 
4223
 
                                if (Globals.bDomainMaster) /* auto or yes */ 
4224
 
                                        server_role = ROLE_DOMAIN_PDC;
4225
 
                                else
4226
 
                                        server_role = ROLE_DOMAIN_BDC;
4227
 
                        }
4228
 
                        break;
4229
 
                default:
4230
 
                        DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
4231
 
                        break;
4232
 
        }
4233
 
 
4234
 
        DEBUG(10, ("set_server_role: role = %s\n", server_role_str(server_role)));
4235
 
}
4236
 
 
4237
 
/***********************************************************
4238
 
 If we should send plaintext/LANMAN passwords in the clinet
4239
 
************************************************************/
4240
 
 
4241
 
static void set_allowed_client_auth(void)
4242
 
{
4243
 
        if (Globals.bClientNTLMv2Auth) {
4244
 
                Globals.bClientLanManAuth = False;
4245
 
        }
4246
 
        if (!Globals.bClientLanManAuth) {
4247
 
                Globals.bClientPlaintextAuth = False;
4248
 
        }
4249
 
}
4250
 
 
4251
 
/***************************************************************************
4252
 
 JRA.
4253
 
 The following code allows smbd to read a user defined share file.
4254
 
 Yes, this is my intent. Yes, I'm comfortable with that...
4255
 
 
4256
 
 THE FOLLOWING IS SECURITY CRITICAL CODE.
4257
 
 
4258
 
 It washes your clothes, it cleans your house, it guards you while you sleep...
4259
 
 Do not f%^k with it....
4260
 
***************************************************************************/
4261
 
 
4262
 
#define MAX_USERSHARE_FILE_SIZE (10*1024)
4263
 
 
4264
 
/***************************************************************************
4265
 
 Check allowed stat state of a usershare file.
4266
 
 Ensure we print out who is dicking with us so the admin can
4267
 
 get their sorry ass fired.
4268
 
***************************************************************************/
4269
 
 
4270
 
static BOOL check_usershare_stat(const char *fname, SMB_STRUCT_STAT *psbuf)
4271
 
{
4272
 
        if (!S_ISREG(psbuf->st_mode)) {
4273
 
                DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
4274
 
                        "not a regular file\n",
4275
 
                        fname, (unsigned int)psbuf->st_uid ));
4276
 
                return False;
4277
 
        }
4278
 
 
4279
 
        /* Ensure this doesn't have the other write bit set. */
4280
 
        if (psbuf->st_mode & S_IWOTH) {
4281
 
                DEBUG(0,("check_usershare_stat: file %s owned by uid %u allows "
4282
 
                        "public write. Refusing to allow as a usershare file.\n",
4283
 
                        fname, (unsigned int)psbuf->st_uid ));
4284
 
                return False;
4285
 
        }
4286
 
 
4287
 
        /* Should be 10k or less. */
4288
 
        if (psbuf->st_size > MAX_USERSHARE_FILE_SIZE) {
4289
 
                DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
4290
 
                        "too large (%u) to be a user share file.\n",
4291
 
                        fname, (unsigned int)psbuf->st_uid,
4292
 
                        (unsigned int)psbuf->st_size ));
4293
 
                return False;
4294
 
        }
4295
 
 
4296
 
        return True;
4297
 
}
4298
 
 
4299
 
/***************************************************************************
4300
 
 Parse the contents of a usershare file.
4301
 
***************************************************************************/
4302
 
 
4303
 
enum usershare_err parse_usershare_file(TALLOC_CTX *ctx, 
4304
 
                        SMB_STRUCT_STAT *psbuf,
4305
 
                        const char *servicename,
4306
 
                        int snum,
4307
 
                        char **lines,
4308
 
                        int numlines,
4309
 
                        pstring sharepath,
4310
 
                        pstring comment,
4311
 
                        SEC_DESC **ppsd,
4312
 
                        BOOL *pallow_guest)
4313
 
{
4314
 
        const char **prefixallowlist = lp_usershare_prefix_allow_list();
4315
 
        const char **prefixdenylist = lp_usershare_prefix_deny_list();
4316
 
        int us_vers;
4317
 
        SMB_STRUCT_DIR *dp;
4318
 
        SMB_STRUCT_STAT sbuf;
4319
 
 
4320
 
        *pallow_guest = False;
4321
 
 
4322
 
        if (numlines < 4) {
4323
 
                return USERSHARE_MALFORMED_FILE;
4324
 
        }
4325
 
 
4326
 
        if (strcmp(lines[0], "#VERSION 1") == 0) {
4327
 
                us_vers = 1;
4328
 
        } else if (strcmp(lines[0], "#VERSION 2") == 0) {
4329
 
                us_vers = 2;
4330
 
                if (numlines < 5) {
4331
 
                        return USERSHARE_MALFORMED_FILE;
4332
 
                }
4333
 
        } else {
4334
 
                return USERSHARE_BAD_VERSION;
4335
 
        }
4336
 
 
4337
 
        if (strncmp(lines[1], "path=", 5) != 0) {
4338
 
                return USERSHARE_MALFORMED_PATH;
4339
 
        }
4340
 
 
4341
 
        pstrcpy(sharepath, &lines[1][5]);
4342
 
        trim_string(sharepath, " ", " ");
4343
 
 
4344
 
        if (strncmp(lines[2], "comment=", 8) != 0) {
4345
 
                return USERSHARE_MALFORMED_COMMENT_DEF;
4346
 
        }
4347
 
 
4348
 
        pstrcpy(comment, &lines[2][8]);
4349
 
        trim_string(comment, " ", " ");
4350
 
        trim_char(comment, '"', '"');
4351
 
 
4352
 
        if (strncmp(lines[3], "usershare_acl=", 14) != 0) {
4353
 
                return USERSHARE_MALFORMED_ACL_DEF;
4354
 
        }
4355
 
 
4356
 
        if (!parse_usershare_acl(ctx, &lines[3][14], ppsd)) {
4357
 
                return USERSHARE_ACL_ERR;
4358
 
        }
4359
 
 
4360
 
        if (us_vers == 2) {
4361
 
                if (strncmp(lines[4], "guest_ok=", 9) != 0) {
4362
 
                        return USERSHARE_MALFORMED_ACL_DEF;
4363
 
                }
4364
 
                if (lines[4][9] == 'y') {
4365
 
                        *pallow_guest = True;
4366
 
                }
4367
 
        }
4368
 
 
4369
 
        if (snum != -1 && (strcmp(sharepath, ServicePtrs[snum]->szPath) == 0)) {
4370
 
                /* Path didn't change, no checks needed. */
4371
 
                return USERSHARE_OK;
4372
 
        }
4373
 
 
4374
 
        /* The path *must* be absolute. */
4375
 
        if (sharepath[0] != '/') {
4376
 
                DEBUG(2,("parse_usershare_file: share %s: path %s is not an absolute path.\n",
4377
 
                        servicename, sharepath));
4378
 
                return USERSHARE_PATH_NOT_ABSOLUTE;
4379
 
        }
4380
 
 
4381
 
        /* If there is a usershare prefix deny list ensure one of these paths
4382
 
           doesn't match the start of the user given path. */
4383
 
        if (prefixdenylist) {
4384
 
                int i;
4385
 
                for ( i=0; prefixdenylist[i]; i++ ) {
4386
 
                        DEBUG(10,("parse_usershare_file: share %s : checking prefixdenylist[%d]='%s' against %s\n",
4387
 
                                servicename, i, prefixdenylist[i], sharepath ));
4388
 
                        if (memcmp( sharepath, prefixdenylist[i], strlen(prefixdenylist[i])) == 0) {
4389
 
                                DEBUG(2,("parse_usershare_file: share %s path %s starts with one of the "
4390
 
                                        "usershare prefix deny list entries.\n",
4391
 
                                        servicename, sharepath));
4392
 
                                return USERSHARE_PATH_IS_DENIED;
4393
 
                        }
4394
 
                }
4395
 
        }
4396
 
 
4397
 
        /* If there is a usershare prefix allow list ensure one of these paths
4398
 
           does match the start of the user given path. */
4399
 
 
4400
 
        if (prefixallowlist) {
4401
 
                int i;
4402
 
                for ( i=0; prefixallowlist[i]; i++ ) {
4403
 
                        DEBUG(10,("parse_usershare_file: share %s checking prefixallowlist[%d]='%s' against %s\n",
4404
 
                                servicename, i, prefixallowlist[i], sharepath ));
4405
 
                        if (memcmp( sharepath, prefixallowlist[i], strlen(prefixallowlist[i])) == 0) {
4406
 
                                break;
4407
 
                        }
4408
 
                }
4409
 
                if (prefixallowlist[i] == NULL) {
4410
 
                        DEBUG(2,("parse_usershare_file: share %s path %s doesn't start with one of the "
4411
 
                                "usershare prefix allow list entries.\n",
4412
 
                                servicename, sharepath));
4413
 
                        return USERSHARE_PATH_NOT_ALLOWED;
4414
 
                }
4415
 
        }
4416
 
 
4417
 
        /* Ensure this is pointing to a directory. */
4418
 
        dp = sys_opendir(sharepath);
4419
 
 
4420
 
        if (!dp) {
4421
 
                DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
4422
 
                        servicename, sharepath));
4423
 
                return USERSHARE_PATH_NOT_DIRECTORY;
4424
 
        }
4425
 
 
4426
 
        /* Ensure the owner of the usershare file has permission to share
4427
 
           this directory. */
4428
 
 
4429
 
        if (sys_stat(sharepath, &sbuf) == -1) {
4430
 
                DEBUG(2,("parse_usershare_file: share %s : stat failed on path %s. %s\n",
4431
 
                        servicename, sharepath, strerror(errno) ));
4432
 
                sys_closedir(dp);
4433
 
                return USERSHARE_POSIX_ERR;
4434
 
        }
4435
 
 
4436
 
        sys_closedir(dp);
4437
 
 
4438
 
        if (!S_ISDIR(sbuf.st_mode)) {
4439
 
                DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
4440
 
                        servicename, sharepath ));
4441
 
                return USERSHARE_PATH_NOT_DIRECTORY;
4442
 
        }
4443
 
 
4444
 
        /* Check if sharing is restricted to owner-only. */
4445
 
        /* psbuf is the stat of the usershare definition file,
4446
 
           sbuf is the stat of the target directory to be shared. */
4447
 
 
4448
 
        if (lp_usershare_owner_only()) {
4449
 
                /* root can share anything. */
4450
 
                if ((psbuf->st_uid != 0) && (sbuf.st_uid != psbuf->st_uid)) {
4451
 
                        return USERSHARE_PATH_NOT_ALLOWED;
4452
 
                }
4453
 
        }
4454
 
 
4455
 
        return USERSHARE_OK;
4456
 
}
4457
 
 
4458
 
/***************************************************************************
4459
 
 Deal with a usershare file.
4460
 
 Returns:
4461
 
        >= 0 - snum
4462
 
        -1 - Bad name, invalid contents.
4463
 
           - service name already existed and not a usershare, problem
4464
 
            with permissions to share directory etc.
4465
 
***************************************************************************/
4466
 
 
4467
 
static int process_usershare_file(const char *dir_name, const char *file_name, int snum_template)
4468
 
{
4469
 
        SMB_STRUCT_STAT sbuf;
4470
 
        SMB_STRUCT_STAT lsbuf;
4471
 
        pstring fname;
4472
 
        pstring sharepath;
4473
 
        pstring comment;
4474
 
        fstring service_name;
4475
 
        char **lines = NULL;
4476
 
        int numlines = 0;
4477
 
        int fd = -1;
4478
 
        int iService = -1;
4479
 
        TALLOC_CTX *ctx = NULL;
4480
 
        SEC_DESC *psd = NULL;
4481
 
        BOOL guest_ok = False;
4482
 
 
4483
 
        /* Ensure share name doesn't contain invalid characters. */
4484
 
        if (!validate_net_name(file_name, INVALID_SHARENAME_CHARS, strlen(file_name))) {
4485
 
                DEBUG(0,("process_usershare_file: share name %s contains "
4486
 
                        "invalid characters (any of %s)\n",
4487
 
                        file_name, INVALID_SHARENAME_CHARS ));
4488
 
                return -1;
4489
 
        }
4490
 
 
4491
 
        fstrcpy(service_name, file_name);
4492
 
 
4493
 
        pstrcpy(fname, dir_name);
4494
 
        pstrcat(fname, "/");
4495
 
        pstrcat(fname, file_name);
4496
 
 
4497
 
        /* Minimize the race condition by doing an lstat before we
4498
 
           open and fstat. Ensure this isn't a symlink link. */
4499
 
 
4500
 
        if (sys_lstat(fname, &lsbuf) != 0) {
4501
 
                DEBUG(0,("process_usershare_file: stat of %s failed. %s\n",
4502
 
                        fname, strerror(errno) ));
4503
 
                return -1;
4504
 
        }
4505
 
 
4506
 
        /* This must be a regular file, not a symlink, directory or
4507
 
           other strange filetype. */
4508
 
        if (!check_usershare_stat(fname, &lsbuf)) {
4509
 
                return -1;
4510
 
        }
4511
 
 
4512
 
        /* See if there is already a servicenum for this name. */
4513
 
        /* tdb_fetch_int32 returns -1 if not found. */
4514
 
        iService = (int)tdb_fetch_int32(ServiceHash, canonicalize_servicename(service_name) );
4515
 
 
4516
 
        if (iService != -1 && ServicePtrs[iService]->usershare_last_mod == lsbuf.st_mtime) {
4517
 
                /* Nothing changed - Mark valid and return. */
4518
 
                DEBUG(10,("process_usershare_file: service %s not changed.\n",
4519
 
                        service_name ));
4520
 
                ServicePtrs[iService]->usershare = USERSHARE_VALID;
4521
 
                return iService;
4522
 
        }
4523
 
 
4524
 
        /* Try and open the file read only - no symlinks allowed. */
4525
 
#ifdef O_NOFOLLOW
4526
 
        fd = sys_open(fname, O_RDONLY|O_NOFOLLOW, 0);
4527
 
#else
4528
 
        fd = sys_open(fname, O_RDONLY, 0);
4529
 
#endif
4530
 
 
4531
 
        if (fd == -1) {
4532
 
                DEBUG(0,("process_usershare_file: unable to open %s. %s\n",
4533
 
                        fname, strerror(errno) ));
4534
 
                return -1;
4535
 
        }
4536
 
 
4537
 
        /* Now fstat to be *SURE* it's a regular file. */
4538
 
        if (sys_fstat(fd, &sbuf) != 0) {
4539
 
                close(fd);
4540
 
                DEBUG(0,("process_usershare_file: fstat of %s failed. %s\n",
4541
 
                        fname, strerror(errno) ));
4542
 
                return -1;
4543
 
        }
4544
 
 
4545
 
        /* Is it the same dev/inode as was lstated ? */
4546
 
        if (lsbuf.st_dev != sbuf.st_dev || lsbuf.st_ino != sbuf.st_ino) {
4547
 
                close(fd);
4548
 
                DEBUG(0,("process_usershare_file: fstat of %s is a different file from lstat. "
4549
 
                        "Symlink spoofing going on ?\n", fname ));
4550
 
                return -1;
4551
 
        }
4552
 
 
4553
 
        /* This must be a regular file, not a symlink, directory or
4554
 
           other strange filetype. */
4555
 
        if (!check_usershare_stat(fname, &sbuf)) {
4556
 
                return -1;
4557
 
        }
4558
 
 
4559
 
        lines = fd_lines_load(fd, &numlines, MAX_USERSHARE_FILE_SIZE);
4560
 
 
4561
 
        close(fd);
4562
 
        if (lines == NULL) {
4563
 
                DEBUG(0,("process_usershare_file: loading file %s owned by %u failed.\n",
4564
 
                        fname, (unsigned int)sbuf.st_uid ));
4565
 
                return -1;
4566
 
        }
4567
 
 
4568
 
        /* Should we allow printers to be shared... ? */
4569
 
        ctx = talloc_init("usershare_sd_xctx");
4570
 
        if (!ctx) {
4571
 
                SAFE_FREE(lines);
4572
 
                return 1;
4573
 
        }
4574
 
 
4575
 
        if (parse_usershare_file(ctx, &sbuf, service_name,
4576
 
                        iService, lines, numlines, sharepath,
4577
 
                        comment, &psd, &guest_ok) != USERSHARE_OK) {
4578
 
                talloc_destroy(ctx);
4579
 
                SAFE_FREE(lines);
4580
 
                return -1;
4581
 
        }
4582
 
 
4583
 
        SAFE_FREE(lines);
4584
 
 
4585
 
        /* Everything ok - add the service possibly using a template. */
4586
 
        if (iService < 0) {
4587
 
                const service *sp = &sDefault;
4588
 
                if (snum_template != -1) {
4589
 
                        sp = ServicePtrs[snum_template];
4590
 
                }
4591
 
 
4592
 
                if ((iService = add_a_service(sp, service_name)) < 0) {
4593
 
                        DEBUG(0, ("process_usershare_file: Failed to add "
4594
 
                                "new service %s\n", service_name));
4595
 
                        talloc_destroy(ctx);
4596
 
                        return -1;
4597
 
                }
4598
 
 
4599
 
                /* Read only is controlled by usershare ACL below. */
4600
 
                ServicePtrs[iService]->bRead_only = False;
4601
 
        }
4602
 
 
4603
 
        /* Write the ACL of the new/modified share. */
4604
 
        if (!set_share_security(ctx, service_name, psd)) {
4605
 
                 DEBUG(0, ("process_usershare_file: Failed to set share "
4606
 
                        "security for user share %s\n",
4607
 
                        service_name ));
4608
 
                lp_remove_service(iService);
4609
 
                talloc_destroy(ctx);
4610
 
                return -1;
4611
 
        }
4612
 
 
4613
 
        talloc_destroy(ctx);
4614
 
 
4615
 
        /* If from a template it may be marked invalid. */
4616
 
        ServicePtrs[iService]->valid = True;
4617
 
 
4618
 
        /* Set the service as a valid usershare. */
4619
 
        ServicePtrs[iService]->usershare = USERSHARE_VALID;
4620
 
 
4621
 
        /* Set guest access. */
4622
 
        if (lp_usershare_allow_guests()) {
4623
 
                ServicePtrs[iService]->bGuest_ok = guest_ok;
4624
 
        }
4625
 
 
4626
 
        /* And note when it was loaded. */
4627
 
        ServicePtrs[iService]->usershare_last_mod = sbuf.st_mtime;
4628
 
        string_set(&ServicePtrs[iService]->szPath, sharepath);
4629
 
        string_set(&ServicePtrs[iService]->comment, comment);
4630
 
 
4631
 
        return iService;
4632
 
}
4633
 
 
4634
 
/***************************************************************************
4635
 
 Checks if a usershare entry has been modified since last load.
4636
 
***************************************************************************/
4637
 
 
4638
 
static BOOL usershare_exists(int iService, time_t *last_mod)
4639
 
{
4640
 
        SMB_STRUCT_STAT lsbuf;
4641
 
        const char *usersharepath = Globals.szUsersharePath;
4642
 
        pstring fname;
4643
 
 
4644
 
        pstrcpy(fname, usersharepath);
4645
 
        pstrcat(fname, "/");
4646
 
        pstrcat(fname, ServicePtrs[iService]->szService);
4647
 
 
4648
 
        if (sys_lstat(fname, &lsbuf) != 0) {
4649
 
                return False;
4650
 
        }
4651
 
 
4652
 
        if (!S_ISREG(lsbuf.st_mode)) {
4653
 
                return False;
4654
 
        }
4655
 
 
4656
 
        *last_mod = lsbuf.st_mtime;
4657
 
        return True;
4658
 
}
4659
 
 
4660
 
/***************************************************************************
4661
 
 Load a usershare service by name. Returns a valid servicenumber or -1.
4662
 
***************************************************************************/
4663
 
 
4664
 
int load_usershare_service(const char *servicename)
4665
 
{
4666
 
        SMB_STRUCT_STAT sbuf;
4667
 
        const char *usersharepath = Globals.szUsersharePath;
4668
 
        int max_user_shares = Globals.iUsershareMaxShares;
4669
 
        int snum_template = -1;
4670
 
 
4671
 
        if (*usersharepath == 0 ||  max_user_shares == 0) {
4672
 
                return -1;
4673
 
        }
4674
 
 
4675
 
        if (sys_stat(usersharepath, &sbuf) != 0) {
4676
 
                DEBUG(0,("load_usershare_service: stat of %s failed. %s\n",
4677
 
                        usersharepath, strerror(errno) ));
4678
 
                return -1;
4679
 
        }
4680
 
 
4681
 
        if (!S_ISDIR(sbuf.st_mode)) {
4682
 
                DEBUG(0,("load_usershare_service: %s is not a directory.\n",
4683
 
                        usersharepath ));
4684
 
                return -1;
4685
 
        }
4686
 
 
4687
 
        /*
4688
 
         * This directory must be owned by root, and have the 't' bit set.
4689
 
         * It also must not be writable by "other".
4690
 
         */
4691
 
 
4692
 
#ifdef S_ISVTX
4693
 
        if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
4694
 
#else
4695
 
        if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
4696
 
#endif
4697
 
                DEBUG(0,("load_usershare_service: directory %s is not owned by root "
4698
 
                        "or does not have the sticky bit 't' set or is writable by anyone.\n",
4699
 
                        usersharepath ));
4700
 
                return -1;
4701
 
        }
4702
 
 
4703
 
        /* Ensure the template share exists if it's set. */
4704
 
        if (Globals.szUsershareTemplateShare[0]) {
4705
 
                /* We can't use lp_servicenumber here as we are recommending that
4706
 
                   template shares have -valid=False set. */
4707
 
                for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
4708
 
                        if (ServicePtrs[snum_template]->szService &&
4709
 
                                        strequal(ServicePtrs[snum_template]->szService,
4710
 
                                                Globals.szUsershareTemplateShare)) {
4711
 
                                break;
4712
 
                        }
4713
 
                }
4714
 
 
4715
 
                if (snum_template == -1) {
4716
 
                        DEBUG(0,("load_usershare_service: usershare template share %s "
4717
 
                                "does not exist.\n",
4718
 
                                Globals.szUsershareTemplateShare ));
4719
 
                        return -1;
4720
 
                }
4721
 
        }
4722
 
 
4723
 
        return process_usershare_file(usersharepath, servicename, snum_template);
4724
 
}
4725
 
 
4726
 
/***************************************************************************
4727
 
 Load all user defined shares from the user share directory.
4728
 
 We only do this if we're enumerating the share list.
4729
 
 This is the function that can delete usershares that have
4730
 
 been removed.
4731
 
***************************************************************************/
4732
 
 
4733
 
int load_usershare_shares(void)
4734
 
{
4735
 
        SMB_STRUCT_DIR *dp;
4736
 
        SMB_STRUCT_STAT sbuf;
4737
 
        SMB_STRUCT_DIRENT *de;
4738
 
        int num_usershares = 0;
4739
 
        int max_user_shares = Globals.iUsershareMaxShares;
4740
 
        unsigned int num_dir_entries, num_bad_dir_entries, num_tmp_dir_entries;
4741
 
        unsigned int allowed_bad_entries = ((2*max_user_shares)/10);
4742
 
        unsigned int allowed_tmp_entries = ((2*max_user_shares)/10);
4743
 
        int iService;
4744
 
        int snum_template = -1;
4745
 
        const char *usersharepath = Globals.szUsersharePath;
4746
 
        int ret = lp_numservices();
4747
 
 
4748
 
        if (max_user_shares == 0 || *usersharepath == '\0') {
4749
 
                return lp_numservices();
4750
 
        }
4751
 
 
4752
 
        if (sys_stat(usersharepath, &sbuf) != 0) {
4753
 
                DEBUG(0,("load_usershare_shares: stat of %s failed. %s\n",
4754
 
                        usersharepath, strerror(errno) ));
4755
 
                return ret;
4756
 
        }
4757
 
 
4758
 
        /*
4759
 
         * This directory must be owned by root, and have the 't' bit set.
4760
 
         * It also must not be writable by "other".
4761
 
         */
4762
 
 
4763
 
#ifdef S_ISVTX
4764
 
        if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
4765
 
#else
4766
 
        if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
4767
 
#endif
4768
 
                DEBUG(0,("load_usershare_shares: directory %s is not owned by root "
4769
 
                        "or does not have the sticky bit 't' set or is writable by anyone.\n",
4770
 
                        usersharepath ));
4771
 
                return ret;
4772
 
        }
4773
 
 
4774
 
        /* Ensure the template share exists if it's set. */
4775
 
        if (Globals.szUsershareTemplateShare[0]) {
4776
 
                /* We can't use lp_servicenumber here as we are recommending that
4777
 
                   template shares have -valid=False set. */
4778
 
                for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
4779
 
                        if (ServicePtrs[snum_template]->szService &&
4780
 
                                        strequal(ServicePtrs[snum_template]->szService,
4781
 
                                                Globals.szUsershareTemplateShare)) {
4782
 
                                break;
4783
 
                        }
4784
 
                }
4785
 
 
4786
 
                if (snum_template == -1) {
4787
 
                        DEBUG(0,("load_usershare_shares: usershare template share %s "
4788
 
                                "does not exist.\n",
4789
 
                                Globals.szUsershareTemplateShare ));
4790
 
                        return ret;
4791
 
                }
4792
 
        }
4793
 
 
4794
 
        /* Mark all existing usershares as pending delete. */
4795
 
        for (iService = iNumServices - 1; iService >= 0; iService--) {
4796
 
                if (VALID(iService) && ServicePtrs[iService]->usershare) {
4797
 
                        ServicePtrs[iService]->usershare = USERSHARE_PENDING_DELETE;
4798
 
                }
4799
 
        }
4800
 
 
4801
 
        dp = sys_opendir(usersharepath);
4802
 
        if (!dp) {
4803
 
                DEBUG(0,("load_usershare_shares:: failed to open directory %s. %s\n",
4804
 
                        usersharepath, strerror(errno) ));
4805
 
                return ret;
4806
 
        }
4807
 
 
4808
 
        for (num_dir_entries = 0, num_bad_dir_entries = 0, num_tmp_dir_entries = 0;
4809
 
                        (de = sys_readdir(dp));
4810
 
                        num_dir_entries++ ) {
4811
 
                int r;
4812
 
                const char *n = de->d_name;
4813
 
 
4814
 
                /* Ignore . and .. */
4815
 
                if (*n == '.') {
4816
 
                        if ((n[1] == '\0') || (n[1] == '.' && n[2] == '\0')) {
4817
 
                                continue;
4818
 
                        }
4819
 
                }
4820
 
 
4821
 
                if (n[0] == ':') {
4822
 
                        /* Temporary file used when creating a share. */
4823
 
                        num_tmp_dir_entries++;
4824
 
                }
4825
 
 
4826
 
                /* Allow 20% tmp entries. */
4827
 
                if (num_tmp_dir_entries > allowed_tmp_entries) {
4828
 
                        DEBUG(0,("load_usershare_shares: too many temp entries (%u) "
4829
 
                                "in directory %s\n",
4830
 
                                num_tmp_dir_entries, usersharepath));
4831
 
                        break;
4832
 
                }
4833
 
 
4834
 
                r = process_usershare_file(usersharepath, n, snum_template);
4835
 
                if (r == 0) {
4836
 
                        /* Update the services count. */
4837
 
                        num_usershares++;
4838
 
                        if (num_usershares >= max_user_shares) {
4839
 
                                DEBUG(0,("load_usershare_shares: max user shares reached "
4840
 
                                        "on file %s in directory %s\n",
4841
 
                                        n, usersharepath ));
4842
 
                                break;
4843
 
                        }
4844
 
                } else if (r == -1) {
4845
 
                        num_bad_dir_entries++;
4846
 
                }
4847
 
 
4848
 
                /* Allow 20% bad entries. */
4849
 
                if (num_bad_dir_entries > allowed_bad_entries) {
4850
 
                        DEBUG(0,("load_usershare_shares: too many bad entries (%u) "
4851
 
                                "in directory %s\n",
4852
 
                                num_bad_dir_entries, usersharepath));
4853
 
                        break;
4854
 
                }
4855
 
 
4856
 
                /* Allow 20% bad entries. */
4857
 
                if (num_dir_entries > max_user_shares + allowed_bad_entries) {
4858
 
                        DEBUG(0,("load_usershare_shares: too many total entries (%u) "
4859
 
                        "in directory %s\n",
4860
 
                        num_dir_entries, usersharepath));
4861
 
                        break;
4862
 
                }
4863
 
        }
4864
 
 
4865
 
        sys_closedir(dp);
4866
 
 
4867
 
        /* Sweep through and delete any non-refreshed usershares that are
4868
 
           not currently in use. */
4869
 
        for (iService = iNumServices - 1; iService >= 0; iService--) {
4870
 
                if (VALID(iService) && (ServicePtrs[iService]->usershare == USERSHARE_PENDING_DELETE)) {
4871
 
                        if (conn_snum_used(iService)) {
4872
 
                                continue;
4873
 
                        }
4874
 
                        /* Remove from the share ACL db. */
4875
 
                        DEBUG(10,("load_usershare_shares: Removing deleted usershare %s\n",
4876
 
                                lp_servicename(iService) ));
4877
 
                        delete_share_security(iService);
4878
 
                        free_service_byindex(iService);
4879
 
                }
4880
 
        }
4881
 
 
4882
 
        return lp_numservices();
4883
 
}
4884
 
 
4885
 
/********************************************************
4886
 
 Destroy global resources allocated in this file
4887
 
********************************************************/
4888
 
 
4889
 
void gfree_loadparm(void)
4890
 
{
4891
 
        struct file_lists *f;
4892
 
        struct file_lists *next;
4893
 
        int i;
4894
 
 
4895
 
        lp_TALLOC_FREE();
4896
 
 
4897
 
        /* Free the file lists */
4898
 
 
4899
 
        f = file_lists;
4900
 
        while( f ) {
4901
 
                next = f->next;
4902
 
                SAFE_FREE( f->name );
4903
 
                SAFE_FREE( f->subfname );
4904
 
                SAFE_FREE( f );
4905
 
                f = next;
4906
 
        }
4907
 
 
4908
 
        /* Free resources allocated to services */
4909
 
 
4910
 
        for ( i = 0; i < iNumServices; i++ ) {
4911
 
                if ( VALID(i) ) {
4912
 
                        free_service_byindex(i);
4913
 
                }
4914
 
        }
4915
 
 
4916
 
        SAFE_FREE( ServicePtrs );
4917
 
        iNumServices = 0;
4918
 
 
4919
 
        /* Now release all resources allocated to global
4920
 
           parameters and the default service */
4921
 
 
4922
 
        for (i = 0; parm_table[i].label; i++) 
4923
 
        {
4924
 
                if ( parm_table[i].type == P_STRING 
4925
 
                        || parm_table[i].type == P_USTRING ) 
4926
 
                {
4927
 
                        string_free( (char**)parm_table[i].ptr );
4928
 
                }
4929
 
                else if (parm_table[i].type == P_LIST) {
4930
 
                        str_list_free( (char***)parm_table[i].ptr );
4931
 
                }
4932
 
        }
4933
 
}
4934
 
 
4935
 
/***************************************************************************
4936
 
 Load the services array from the services file. Return True on success, 
4937
 
 False on failure.
4938
 
***************************************************************************/
4939
 
 
4940
 
BOOL lp_load(const char *pszFname,
4941
 
             BOOL global_only,
4942
 
             BOOL save_defaults,
4943
 
             BOOL add_ipc,
4944
 
             BOOL initialize_globals)
4945
 
{
4946
 
        pstring n2;
4947
 
        BOOL bRetval;
4948
 
        param_opt_struct *data, *pdata;
4949
 
 
4950
 
        pstrcpy(n2, pszFname);
4951
 
        
4952
 
        standard_sub_basic( get_current_username(), current_user_info.domain,
4953
 
                            n2,sizeof(n2) );
4954
 
 
4955
 
        add_to_file_list(pszFname, n2);
4956
 
 
4957
 
        bRetval = False;
4958
 
 
4959
 
        DEBUG(3, ("lp_load: refreshing parameters\n"));
4960
 
        
4961
 
        bInGlobalSection = True;
4962
 
        bGlobalOnly = global_only;
4963
 
 
4964
 
        init_globals(! initialize_globals);
4965
 
        debug_init();
4966
 
 
4967
 
        if (save_defaults) {
4968
 
                init_locals();
4969
 
                lp_save_defaults();
4970
 
        }
4971
 
 
4972
 
        if (Globals.param_opt != NULL) {
4973
 
                data = Globals.param_opt;
4974
 
                while (data) {
4975
 
                        string_free(&data->key);
4976
 
                        string_free(&data->value);
4977
 
                        str_list_free(&data->list);
4978
 
                        pdata = data->next;
4979
 
                        SAFE_FREE(data);
4980
 
                        data = pdata;
4981
 
                }
4982
 
                Globals.param_opt = NULL;
4983
 
        }
4984
 
        
4985
 
        /* We get sections first, so have to start 'behind' to make up */
4986
 
        iServiceIndex = -1;
4987
 
        bRetval = pm_process(n2, do_section, do_parameter);
4988
 
 
4989
 
        /* finish up the last section */
4990
 
        DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
4991
 
        if (bRetval)
4992
 
                if (iServiceIndex >= 0)
4993
 
                        bRetval = service_ok(iServiceIndex);
4994
 
 
4995
 
        lp_add_auto_services(lp_auto_services());
4996
 
 
4997
 
        if (add_ipc) {
4998
 
                /* When 'restrict anonymous = 2' guest connections to ipc$
4999
 
                   are denied */
5000
 
                lp_add_ipc("IPC$", (lp_restrict_anonymous() < 2));
5001
 
                if ( lp_enable_asu_support() )
5002
 
                        lp_add_ipc("ADMIN$", False);
5003
 
        }
5004
 
 
5005
 
        set_server_role();
5006
 
        set_default_server_announce_type();
5007
 
        set_allowed_client_auth();
5008
 
 
5009
 
        bLoaded = True;
5010
 
 
5011
 
        /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
5012
 
        /* if bWINSsupport is true and we are in the client            */
5013
 
        if (in_client && Globals.bWINSsupport) {
5014
 
                lp_do_parameter(GLOBAL_SECTION_SNUM, "wins server", "127.0.0.1");
5015
 
        }
5016
 
 
5017
 
        init_iconv();
5018
 
 
5019
 
        return (bRetval);
5020
 
}
5021
 
 
5022
 
/***************************************************************************
5023
 
 Reset the max number of services.
5024
 
***************************************************************************/
5025
 
 
5026
 
void lp_resetnumservices(void)
5027
 
{
5028
 
        iNumServices = 0;
5029
 
}
5030
 
 
5031
 
/***************************************************************************
5032
 
 Return the max number of services.
5033
 
***************************************************************************/
5034
 
 
5035
 
int lp_numservices(void)
5036
 
{
5037
 
        return (iNumServices);
5038
 
}
5039
 
 
5040
 
/***************************************************************************
5041
 
Display the contents of the services array in human-readable form.
5042
 
***************************************************************************/
5043
 
 
5044
 
void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
5045
 
{
5046
 
        int iService;
5047
 
 
5048
 
        if (show_defaults)
5049
 
                defaults_saved = False;
5050
 
 
5051
 
        dump_globals(f);
5052
 
 
5053
 
        dump_a_service(&sDefault, f);
5054
 
 
5055
 
        for (iService = 0; iService < maxtoprint; iService++) {
5056
 
                fprintf(f,"\n");
5057
 
                lp_dump_one(f, show_defaults, iService);
5058
 
        }
5059
 
}
5060
 
 
5061
 
/***************************************************************************
5062
 
Display the contents of one service in human-readable form.
5063
 
***************************************************************************/
5064
 
 
5065
 
void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
5066
 
{
5067
 
        if (VALID(snum)) {
5068
 
                if (ServicePtrs[snum]->szService[0] == '\0')
5069
 
                        return;
5070
 
                dump_a_service(ServicePtrs[snum], f);
5071
 
        }
5072
 
}
5073
 
 
5074
 
/***************************************************************************
5075
 
Return the number of the service with the given name, or -1 if it doesn't
5076
 
exist. Note that this is a DIFFERENT ANIMAL from the internal function
5077
 
getservicebyname()! This works ONLY if all services have been loaded, and
5078
 
does not copy the found service.
5079
 
***************************************************************************/
5080
 
 
5081
 
int lp_servicenumber(const char *pszServiceName)
5082
 
{
5083
 
        int iService;
5084
 
        fstring serviceName;
5085
 
        
5086
 
        if (!pszServiceName) {
5087
 
                return GLOBAL_SECTION_SNUM;
5088
 
        }
5089
 
        
5090
 
        for (iService = iNumServices - 1; iService >= 0; iService--) {
5091
 
                if (VALID(iService) && ServicePtrs[iService]->szService) {
5092
 
                        /*
5093
 
                         * The substitution here is used to support %U is
5094
 
                         * service names
5095
 
                         */
5096
 
                        fstrcpy(serviceName, ServicePtrs[iService]->szService);
5097
 
                        standard_sub_basic(get_current_username(),
5098
 
                                           current_user_info.domain,
5099
 
                                           serviceName,sizeof(serviceName));
5100
 
                        if (strequal(serviceName, pszServiceName)) {
5101
 
                                break;
5102
 
                        }
5103
 
                }
5104
 
        }
5105
 
 
5106
 
        if (iService >= 0 && ServicePtrs[iService]->usershare == USERSHARE_VALID) {
5107
 
                time_t last_mod;
5108
 
 
5109
 
                if (!usershare_exists(iService, &last_mod)) {
5110
 
                        /* Remove the share security tdb entry for it. */
5111
 
                        delete_share_security(iService);
5112
 
                        /* Remove it from the array. */
5113
 
                        free_service_byindex(iService);
5114
 
                        /* Doesn't exist anymore. */
5115
 
                        return GLOBAL_SECTION_SNUM;
5116
 
                }
5117
 
 
5118
 
                /* Has it been modified ? If so delete and reload. */
5119
 
                if (ServicePtrs[iService]->usershare_last_mod < last_mod) {
5120
 
                        /* Remove it from the array. */
5121
 
                        free_service_byindex(iService);
5122
 
                        /* and now reload it. */
5123
 
                        iService = load_usershare_service(pszServiceName);
5124
 
                }
5125
 
        }
5126
 
 
5127
 
        if (iService < 0) {
5128
 
                DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
5129
 
                return GLOBAL_SECTION_SNUM;
5130
 
        }
5131
 
 
5132
 
        return (iService);
5133
 
}
5134
 
 
5135
 
BOOL share_defined(const char *service_name)
5136
 
{
5137
 
        return (lp_servicenumber(service_name) != -1);
5138
 
}
5139
 
 
5140
 
/*******************************************************************
5141
 
 A useful volume label function. 
5142
 
********************************************************************/
5143
 
 
5144
 
char *volume_label(int snum)
5145
 
{
5146
 
        char *ret = lp_volume(snum);
5147
 
        if (!*ret)
5148
 
                return lp_servicename(snum);
5149
 
        return (ret);
5150
 
}
5151
 
 
5152
 
 
5153
 
/*******************************************************************
5154
 
 Set the server type we will announce as via nmbd.
5155
 
********************************************************************/
5156
 
 
5157
 
static void set_default_server_announce_type(void)
5158
 
{
5159
 
        default_server_announce = 0;
5160
 
        default_server_announce |= SV_TYPE_WORKSTATION;
5161
 
        default_server_announce |= SV_TYPE_SERVER;
5162
 
        default_server_announce |= SV_TYPE_SERVER_UNIX;
5163
 
 
5164
 
        /* note that the flag should be set only if we have a 
5165
 
           printer service but nmbd doesn't actually load the 
5166
 
           services so we can't tell   --jerry */
5167
 
 
5168
 
        default_server_announce |= SV_TYPE_PRINTQ_SERVER;
5169
 
 
5170
 
        switch (lp_announce_as()) {
5171
 
                case ANNOUNCE_AS_NT_SERVER:
5172
 
                        default_server_announce |= SV_TYPE_SERVER_NT;
5173
 
                        /* fall through... */
5174
 
                case ANNOUNCE_AS_NT_WORKSTATION:
5175
 
                        default_server_announce |= SV_TYPE_NT;
5176
 
                        break;
5177
 
                case ANNOUNCE_AS_WIN95:
5178
 
                        default_server_announce |= SV_TYPE_WIN95_PLUS;
5179
 
                        break;
5180
 
                case ANNOUNCE_AS_WFW:
5181
 
                        default_server_announce |= SV_TYPE_WFW;
5182
 
                        break;
5183
 
                default:
5184
 
                        break;
5185
 
        }
5186
 
 
5187
 
        switch (lp_server_role()) {
5188
 
                case ROLE_DOMAIN_MEMBER:
5189
 
                        default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
5190
 
                        break;
5191
 
                case ROLE_DOMAIN_PDC:
5192
 
                        default_server_announce |= SV_TYPE_DOMAIN_CTRL;
5193
 
                        break;
5194
 
                case ROLE_DOMAIN_BDC:
5195
 
                        default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
5196
 
                        break;
5197
 
                case ROLE_STANDALONE:
5198
 
                default:
5199
 
                        break;
5200
 
        }
5201
 
        if (lp_time_server())
5202
 
                default_server_announce |= SV_TYPE_TIME_SOURCE;
5203
 
 
5204
 
        if (lp_host_msdfs())
5205
 
                default_server_announce |= SV_TYPE_DFS_SERVER;
5206
 
}
5207
 
 
5208
 
/***********************************************************
5209
 
 returns role of Samba server
5210
 
************************************************************/
5211
 
 
5212
 
int lp_server_role(void)
5213
 
{
5214
 
        return server_role;
5215
 
}
5216
 
 
5217
 
/***********************************************************
5218
 
 If we are PDC then prefer us as DMB
5219
 
************************************************************/
5220
 
 
5221
 
BOOL lp_domain_master(void)
5222
 
{
5223
 
        if (Globals.bDomainMaster == Auto)
5224
 
                return (lp_server_role() == ROLE_DOMAIN_PDC);
5225
 
 
5226
 
        return Globals.bDomainMaster;
5227
 
}
5228
 
 
5229
 
/***********************************************************
5230
 
 If we are DMB then prefer us as LMB
5231
 
************************************************************/
5232
 
 
5233
 
BOOL lp_preferred_master(void)
5234
 
{
5235
 
        if (Globals.bPreferredMaster == Auto)
5236
 
                return (lp_local_master() && lp_domain_master());
5237
 
 
5238
 
        return Globals.bPreferredMaster;
5239
 
}
5240
 
 
5241
 
/*******************************************************************
5242
 
 Remove a service.
5243
 
********************************************************************/
5244
 
 
5245
 
void lp_remove_service(int snum)
5246
 
{
5247
 
        ServicePtrs[snum]->valid = False;
5248
 
        invalid_services[num_invalid_services++] = snum;
5249
 
}
5250
 
 
5251
 
/*******************************************************************
5252
 
 Copy a service.
5253
 
********************************************************************/
5254
 
 
5255
 
void lp_copy_service(int snum, const char *new_name)
5256
 
{
5257
 
        do_section(new_name);
5258
 
        if (snum >= 0) {
5259
 
                snum = lp_servicenumber(new_name);
5260
 
                if (snum >= 0)
5261
 
                        lp_do_parameter(snum, "copy", lp_servicename(snum));
5262
 
        }
5263
 
}
5264
 
 
5265
 
 
5266
 
/*******************************************************************
5267
 
 Get the default server type we will announce as via nmbd.
5268
 
********************************************************************/
5269
 
 
5270
 
int lp_default_server_announce(void)
5271
 
{
5272
 
        return default_server_announce;
5273
 
}
5274
 
 
5275
 
/*******************************************************************
5276
 
 Split the announce version into major and minor numbers.
5277
 
********************************************************************/
5278
 
 
5279
 
int lp_major_announce_version(void)
5280
 
{
5281
 
        static BOOL got_major = False;
5282
 
        static int major_version = DEFAULT_MAJOR_VERSION;
5283
 
        char *vers;
5284
 
        char *p;
5285
 
 
5286
 
        if (got_major)
5287
 
                return major_version;
5288
 
 
5289
 
        got_major = True;
5290
 
        if ((vers = lp_announce_version()) == NULL)
5291
 
                return major_version;
5292
 
 
5293
 
        if ((p = strchr_m(vers, '.')) == 0)
5294
 
                return major_version;
5295
 
 
5296
 
        *p = '\0';
5297
 
        major_version = atoi(vers);
5298
 
        return major_version;
5299
 
}
5300
 
 
5301
 
int lp_minor_announce_version(void)
5302
 
{
5303
 
        static BOOL got_minor = False;
5304
 
        static int minor_version = DEFAULT_MINOR_VERSION;
5305
 
        char *vers;
5306
 
        char *p;
5307
 
 
5308
 
        if (got_minor)
5309
 
                return minor_version;
5310
 
 
5311
 
        got_minor = True;
5312
 
        if ((vers = lp_announce_version()) == NULL)
5313
 
                return minor_version;
5314
 
 
5315
 
        if ((p = strchr_m(vers, '.')) == 0)
5316
 
                return minor_version;
5317
 
 
5318
 
        p++;
5319
 
        minor_version = atoi(p);
5320
 
        return minor_version;
5321
 
}
5322
 
 
5323
 
/***********************************************************
5324
 
 Set the global name resolution order (used in smbclient).
5325
 
************************************************************/
5326
 
 
5327
 
void lp_set_name_resolve_order(const char *new_order)
5328
 
{
5329
 
        string_set(&Globals.szNameResolveOrder, new_order);
5330
 
}
5331
 
 
5332
 
const char *lp_printername(int snum)
5333
 
{
5334
 
        const char *ret = _lp_printername(snum);
5335
 
        if (ret == NULL || (ret != NULL && *ret == '\0'))
5336
 
                ret = lp_const_servicename(snum);
5337
 
 
5338
 
        return ret;
5339
 
}
5340
 
 
5341
 
 
5342
 
/***********************************************************
5343
 
 Allow daemons such as winbindd to fix their logfile name.
5344
 
************************************************************/
5345
 
 
5346
 
void lp_set_logfile(const char *name)
5347
 
{
5348
 
        string_set(&Globals.szLogFile, name);
5349
 
        pstrcpy(debugf, name);
5350
 
}
5351
 
 
5352
 
/*******************************************************************
5353
 
 Return the max print jobs per queue.
5354
 
********************************************************************/
5355
 
 
5356
 
int lp_maxprintjobs(int snum)
5357
 
{
5358
 
        int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
5359
 
        if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
5360
 
                maxjobs = PRINT_MAX_JOBID - 1;
5361
 
 
5362
 
        return maxjobs;
5363
 
}
5364
 
 
5365
 
const char *lp_printcapname(void)
5366
 
{
5367
 
        if ((Globals.szPrintcapname != NULL) &&
5368
 
            (Globals.szPrintcapname[0] != '\0'))
5369
 
                return Globals.szPrintcapname;
5370
 
 
5371
 
        if (sDefault.iPrinting == PRINT_CUPS) {
5372
 
#ifdef HAVE_CUPS
5373
 
                return "cups";
5374
 
#else
5375
 
                return "lpstat";
5376
 
#endif
5377
 
        }
5378
 
 
5379
 
        if (sDefault.iPrinting == PRINT_BSD)
5380
 
                return "/etc/printcap";
5381
 
 
5382
 
        return PRINTCAP_NAME;
5383
 
}
5384
 
 
5385
 
/*******************************************************************
5386
 
 Ensure we don't use sendfile if server smb signing is active.
5387
 
********************************************************************/
5388
 
 
5389
 
static uint32 spoolss_state;
5390
 
 
5391
 
BOOL lp_disable_spoolss( void )
5392
 
{
5393
 
        if ( spoolss_state == SVCCTL_STATE_UNKNOWN )
5394
 
                spoolss_state = _lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
5395
 
 
5396
 
        return spoolss_state == SVCCTL_STOPPED ? True : False;
5397
 
}
5398
 
 
5399
 
void lp_set_spoolss_state( uint32 state )
5400
 
{
5401
 
        SMB_ASSERT( (state == SVCCTL_STOPPED) || (state == SVCCTL_RUNNING) );
5402
 
 
5403
 
        spoolss_state = state;
5404
 
}
5405
 
 
5406
 
uint32 lp_get_spoolss_state( void )
5407
 
{
5408
 
        return lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
5409
 
}
5410
 
 
5411
 
/*******************************************************************
5412
 
 Ensure we don't use sendfile if server smb signing is active.
5413
 
********************************************************************/
5414
 
 
5415
 
BOOL lp_use_sendfile(int snum)
5416
 
{
5417
 
        /* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
5418
 
        if (Protocol < PROTOCOL_NT1) {
5419
 
                return False;
5420
 
        }
5421
 
        return (_lp_use_sendfile(snum) && (get_remote_arch() != RA_WIN95) && !srv_is_signing_active());
5422
 
}
5423
 
 
5424
 
/*******************************************************************
5425
 
 Turn off sendfile if we find the underlying OS doesn't support it.
5426
 
********************************************************************/
5427
 
 
5428
 
void set_use_sendfile(int snum, BOOL val)
5429
 
{
5430
 
        if (LP_SNUM_OK(snum))
5431
 
                ServicePtrs[snum]->bUseSendfile = val;
5432
 
        else
5433
 
                sDefault.bUseSendfile = val;
5434
 
}
5435
 
 
5436
 
/*******************************************************************
5437
 
 Turn off storing DOS attributes if this share doesn't support it.
5438
 
********************************************************************/
5439
 
 
5440
 
void set_store_dos_attributes(int snum, BOOL val)
5441
 
{
5442
 
        if (!LP_SNUM_OK(snum))
5443
 
                return;
5444
 
        ServicePtrs[(snum)]->bStoreDosAttributes = val;
5445
 
}
5446
 
 
5447
 
void lp_set_mangling_method(const char *new_method)
5448
 
{
5449
 
        string_set(&Globals.szManglingMethod, new_method);
5450
 
}
5451
 
 
5452
 
/*******************************************************************
5453
 
 Global state for POSIX pathname processing.
5454
 
********************************************************************/
5455
 
 
5456
 
static BOOL posix_pathnames;
5457
 
 
5458
 
BOOL lp_posix_pathnames(void)
5459
 
{
5460
 
        return posix_pathnames;
5461
 
}
5462
 
 
5463
 
/*******************************************************************
5464
 
 Change everything needed to ensure POSIX pathname processing (currently
5465
 
 not much).
5466
 
********************************************************************/
5467
 
 
5468
 
void lp_set_posix_pathnames(void)
5469
 
{
5470
 
        posix_pathnames = True;
5471
 
}
5472
 
 
5473
 
/*******************************************************************
5474
 
 Global state for POSIX lock processing - CIFS unix extensions.
5475
 
********************************************************************/
5476
 
 
5477
 
static enum brl_flavour posix_cifsx_locktype; /* By default 0 == WINDOWS_LOCK */
5478
 
 
5479
 
enum brl_flavour lp_posix_cifsu_locktype(void)
5480
 
{
5481
 
        return posix_cifsx_locktype;
5482
 
}
5483
 
 
5484
 
/*******************************************************************
5485
 
********************************************************************/
5486
 
 
5487
 
void lp_set_posix_cifsx_locktype(enum brl_flavour val)
5488
 
{
5489
 
        posix_cifsx_locktype = val;
5490
 
}