This source file includes following definitions.
- init_globals
- string_initial
- size_max
- lp_string
- FN_GLOBAL_STRING
- free_service
- add_a_service
- lp_add_home
- lp_add_service
- lp_add_ipc
- strwicmp
- map_parameter
- set_boolean
- getservicebyname
- copy_service
- service_ok
- add_to_file_list
- lp_file_list_changed
- handle_coding_system
- handle_character_set
- handle_valid_chars
- handle_include
- handle_copy
- init_copymap
- lp_local_ptr
- lp_do_parameter
- do_parameter
- equal_parameter
- do_section
- lp_is_default
- lp_next_parameter
- lp_snum_ok
- lp_add_auto_services
- lp_loaded
- lp_killunused
- lp_save_defaults
- lp_load
- lp_resetnumservices
- lp_numservices
- lp_servicenumber
- volume_label
- lp_set_name_resolve_order
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 #include "includes.h"
56
57
58
59
60
61
62
63
64
65
66
67
68
69 #ifndef KANJI
70 #define KANJI "sbcs"
71 #endif
72
73 BOOL in_client = False;
74 BOOL bLoaded = False;
75
76 extern int DEBUGLEVEL;
77 extern pstring user_socket_options;
78 extern pstring global_myname;
79 pstring global_scope = "";
80
81 #ifndef GLOBAL_NAME
82 #define GLOBAL_NAME "global"
83 #endif
84
85 #ifndef PRINTERS_NAME
86 #define PRINTERS_NAME "printers"
87 #endif
88
89 #ifndef HOMES_NAME
90 #define HOMES_NAME "homes"
91 #endif
92
93
94 #define pSERVICE(i) ServicePtrs[i]
95 #define iSERVICE(i) (*pSERVICE(i))
96 #define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
97 #define VALID(i) iSERVICE(i).valid
98
99 int keepalive = DEFAULT_KEEPALIVE;
100 static BOOL use_getwd_cache;
101
102 extern int extra_time_offset;
103
104
105
106
107 typedef struct
108 {
109 char *szPrintcapname;
110 char *szLockDir;
111 char *szRootdir;
112 char *szDefaultService;
113 char *szDfree;
114 char *szMsgCommand;
115 char *szHostsEquiv;
116 char *szServerString;
117 char *szAutoServices;
118 char *szPasswdProgram;
119 char *szPasswdChat;
120 char *szLogFile;
121 char *szConfigFile;
122 char *szSMBPasswdFile;
123 char *szPasswordServer;
124 char *szSocketOptions;
125 char *szValidChars;
126 char *szWorkGroup;
127 char *szDomainAdminGroup;
128 char *szDomainGuestGroup;
129 char *szDomainAdminUsers;
130 char *szDomainGuestUsers;
131 char *szDomainHostsallow;
132 char *szDomainHostsdeny;
133 char *szUsernameMap;
134 #ifdef USING_GROUPNAME_MAP
135 char *szGroupnameMap;
136 #endif
137 char *szCharacterSet;
138 char *szLogonScript;
139 char *szLogonPath;
140 char *szLogonDrive;
141 char *szLogonHome;
142 char *szSmbrun;
143 char *szWINSserver;
144 char *szCodingSystem;
145 char *szInterfaces;
146 char *szRemoteAnnounce;
147 char *szRemoteBrowseSync;
148 char *szSocketAddress;
149 char *szNISHomeMapName;
150 char *szAnnounceVersion;
151 char *szNetbiosAliases;
152 char *szDomainOtherSIDs;
153 char *szDomainGroups;
154 char *szDriverFile;
155 char *szNameResolveOrder;
156 char *szLdapServer;
157 char *szLdapSuffix;
158 char *szLdapFilter;
159 char *szLdapRoot;
160 char *szLdapRootPassword;
161 char *szPanicAction;
162 char *szAddUserScript;
163 char *szDelUserScript;
164 int max_log_size;
165 int mangled_stack;
166 int max_xmit;
167 int max_mux;
168 int max_open_files;
169 int max_packet;
170 int pwordlevel;
171 int unamelevel;
172 int deadtime;
173 int maxprotocol;
174 int security;
175 int maxdisksize;
176 int lpqcachetime;
177 int syslog;
178 int os_level;
179 int max_ttl;
180 int max_wins_ttl;
181 int min_wins_ttl;
182 int ReadSize;
183 int lm_announce;
184 int lm_interval;
185 int shmem_size;
186 int client_code_page;
187 int announce_as;
188 int machine_password_timeout;
189 int change_notify_timeout;
190 int stat_cache_size;
191 int map_to_guest;
192 int min_passwd_length;
193 int oplock_break_wait_time;
194 #ifdef WITH_LDAP
195 int ldap_port;
196 #endif
197 #ifdef WITH_SSL
198 int sslVersion;
199 char *sslHostsRequire;
200 char *sslHostsResign;
201 char *sslCaCertDir;
202 char *sslCaCertFile;
203 char *sslCert;
204 char *sslPrivKey;
205 char *sslClientCert;
206 char *sslClientPrivKey;
207 char *sslCiphers;
208 BOOL sslEnabled;
209 BOOL sslReqClientCert;
210 BOOL sslReqServerCert;
211 BOOL sslCompatibility;
212 #endif
213 BOOL bDNSproxy;
214 BOOL bWINSsupport;
215 BOOL bWINSproxy;
216 BOOL bLocalMaster;
217 BOOL bPreferredMaster;
218 BOOL bDomainMaster;
219 BOOL bDomainLogons;
220 BOOL bEncryptPasswords;
221 BOOL bUpdateEncrypt;
222 BOOL bStripDot;
223 BOOL bNullPasswords;
224 BOOL bLoadPrinters;
225 BOOL bUseRhosts;
226 BOOL bReadRaw;
227 BOOL bWriteRaw;
228 BOOL bReadPrediction;
229 BOOL bReadbmpx;
230 BOOL bSyslogOnly;
231 BOOL bBrowseList;
232 BOOL bUnixRealname;
233 BOOL bNISHomeMap;
234 BOOL bTimeServer;
235 BOOL bBindInterfacesOnly;
236 BOOL bUnixPasswdSync;
237 BOOL bPasswdChatDebug;
238 BOOL bOleLockingCompat;
239 BOOL bTimestampLogs;
240 BOOL bNTSmbSupport;
241 BOOL bNTPipeSupport;
242 BOOL bNTAclSupport;
243 BOOL bStatCache;
244 BOOL bKernelOplocks;
245 BOOL bAllowTrustedDomains;
246 BOOL bRestrictAnonymous;
247 } global;
248
249 static global Globals;
250
251
252
253
254
255
256 typedef struct
257 {
258 BOOL valid;
259 char *szService;
260 char *szPath;
261 char *szUsername;
262 char *szGuestaccount;
263 char *szInvalidUsers;
264 char *szValidUsers;
265 char *szAdminUsers;
266 char *szCopy;
267 char *szInclude;
268 char *szPreExec;
269 char *szPostExec;
270 char *szRootPreExec;
271 char *szRootPostExec;
272 char *szPrintcommand;
273 char *szLpqcommand;
274 char *szLprmcommand;
275 char *szLppausecommand;
276 char *szLpresumecommand;
277 char *szQueuepausecommand;
278 char *szQueueresumecommand;
279 char *szPrintername;
280 char *szPrinterDriver;
281 char *szPrinterDriverLocation;
282 char *szDontdescend;
283 char *szHostsallow;
284 char *szHostsdeny;
285 char *szMagicScript;
286 char *szMagicOutput;
287 char *szMangledMap;
288 char *szVetoFiles;
289 char *szHideFiles;
290 char *szVetoOplockFiles;
291 char *comment;
292 char *force_user;
293 char *force_group;
294 char *readlist;
295 char *writelist;
296 char *volume;
297 char *fstype;
298 int iMinPrintSpace;
299 int iCreate_mask;
300 int iCreate_force_mode;
301 int iDir_mask;
302 int iDir_force_mode;
303 int iMaxConnections;
304 int iDefaultCase;
305 int iPrinting;
306 int iOplockContentionLimit;
307 BOOL bAlternatePerm;
308 BOOL bRevalidate;
309 BOOL bCaseSensitive;
310 BOOL bCasePreserve;
311 BOOL bShortCasePreserve;
312 BOOL bCaseMangle;
313 BOOL status;
314 BOOL bHideDotFiles;
315 BOOL bBrowseable;
316 BOOL bAvailable;
317 BOOL bRead_only;
318 BOOL bNo_set_dir;
319 BOOL bGuest_only;
320 BOOL bGuest_ok;
321 BOOL bPrint_ok;
322 BOOL bPostscript;
323 BOOL bMap_system;
324 BOOL bMap_hidden;
325 BOOL bMap_archive;
326 BOOL bLocking;
327 BOOL bStrictLocking;
328 BOOL bShareModes;
329 BOOL bOpLocks;
330 BOOL bOnlyUser;
331 BOOL bMangledNames;
332 BOOL bWidelinks;
333 BOOL bSymlinks;
334 BOOL bSyncAlways;
335 BOOL bStrictSync;
336 char magic_char;
337 BOOL *copymap;
338 BOOL bDeleteReadonly;
339 BOOL bFakeOplocks;
340 BOOL bDeleteVetoFiles;
341 BOOL bDosFiletimes;
342 BOOL bDosFiletimeResolution;
343 BOOL bFakeDirCreateTimes;
344 BOOL bBlockingLocks;
345 BOOL bMangleLocks;
346 char dummy[3];
347 } service;
348
349
350
351 static service sDefault = {
352 True,
353 NULL,
354 NULL,
355 NULL,
356 NULL,
357 NULL,
358 NULL,
359 NULL,
360 NULL,
361 NULL,
362 NULL,
363 NULL,
364 NULL,
365 NULL,
366 NULL,
367 NULL,
368 NULL,
369 NULL,
370 NULL,
371 NULL,
372 NULL,
373 NULL,
374 NULL,
375 NULL,
376 NULL,
377 NULL,
378 NULL,
379 NULL,
380 NULL,
381 NULL,
382 NULL,
383 NULL,
384 NULL,
385 NULL,
386 NULL,
387 NULL,
388 NULL,
389 NULL,
390 NULL,
391 NULL,
392 0,
393 0744,
394 0000,
395 0755,
396 0000,
397 0,
398 CASE_LOWER,
399 DEFAULT_PRINTING,
400 2,
401 False,
402 False,
403 False,
404 True,
405 True,
406 False,
407 True,
408 True,
409 True,
410 True,
411 True,
412 True,
413 False,
414 False,
415 False,
416 False,
417 False,
418 False,
419 True,
420 True,
421 False,
422 True,
423 True,
424 False,
425 True,
426 True,
427 True,
428 False,
429 False,
430 '~',
431 NULL,
432 False,
433 False,
434 False,
435 False,
436 False,
437 False,
438 True,
439 True,
440 ""
441 };
442
443
444
445
446 static service **ServicePtrs = NULL;
447 static int iNumServices = 0;
448 static int iServiceIndex = 0;
449 static BOOL bInGlobalSection = True;
450 static BOOL bGlobalOnly = False;
451
452 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
453
454
455 static BOOL handle_valid_chars (const char *pszParmValue, char **ptr);
456 static BOOL handle_include (const char *pszParmValue, char **ptr);
457 static BOOL handle_copy (const char *pszParmValue, char **ptr);
458 static BOOL handle_character_set (const char *pszParmValue, char **ptr);
459 static BOOL handle_coding_system (const char *pszParmValue, char **ptr);
460 #if 0
461 static void set_default_server_announce_type (void);
462 #endif
463 static struct enum_list const enum_protocol[] =
464 { {PROTOCOL_NT1, "NT1"}, {PROTOCOL_LANMAN2, "LANMAN2"},
465 {PROTOCOL_LANMAN1, "LANMAN1"}, {PROTOCOL_CORE, "CORE"},
466 {PROTOCOL_COREPLUS, "COREPLUS"},
467 {PROTOCOL_COREPLUS, "CORE+"}, {-1, NULL}
468 };
469
470 static struct enum_list const enum_security[] = { {SEC_SHARE, "SHARE"}, {SEC_USER, "USER"},
471 {SEC_SERVER, "SERVER"}, {SEC_DOMAIN, "DOMAIN"},
472 {-1, NULL}
473 };
474
475 static struct enum_list const enum_printing[] = { {PRINT_SYSV, "sysv"}, {PRINT_AIX, "aix"},
476 {PRINT_HPUX, "hpux"}, {PRINT_BSD, "bsd"},
477 {PRINT_QNX, "qnx"}, {PRINT_PLP, "plp"},
478 {PRINT_LPRNG, "lprng"}, {PRINT_SOFTQ, "softq"},
479 {-1, NULL}
480 };
481
482
483 #define ANNOUNCE_AS_NT_SERVER 1
484 #define ANNOUNCE_AS_WIN95 2
485 #define ANNOUNCE_AS_WFW 3
486 #define ANNOUNCE_AS_NT_WORKSTATION 4
487
488
489 static struct enum_list const enum_announce_as[] =
490 {
491 {ANNOUNCE_AS_NT_SERVER, "NT"},
492 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
493 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
494 {ANNOUNCE_AS_WIN95, "win95"},
495 {ANNOUNCE_AS_WFW, "WfW"},
496 {-1, NULL}
497 };
498
499
500 static struct enum_list const enum_case[] =
501 { {CASE_LOWER, "lower"}, {CASE_UPPER, "upper"}, {-1, NULL} };
502
503 static struct enum_list const enum_lm_announce[] =
504 { {0, "False"}, {1, "True"}, {2, "Auto"}, {-1, NULL} };
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528 static struct enum_list const enum_map_to_guest[] =
529 {
530 {NEVER_MAP_TO_GUEST, "Never"},
531 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
532 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
533 {-1, NULL}
534 };
535
536
537 #ifdef WITH_SSL
538 static struct enum_list const enum_ssl_version[] = { {SMB_SSL_V2, "ssl2"}, {SMB_SSL_V3, "ssl3"},
539 {SMB_SSL_V23, "ssl2or3"}, {SMB_SSL_TLS1, "tls1"}, {-1, NULL}
540 };
541 #endif
542
543 #define PARM_SEPARATOR(label) {label, P_SEP, P_SEPARATOR, NULL, NULL, NULL, 0, {0}}
544
545 static struct parm_struct const parm_table[] = {
546 PARM_SEPARATOR ("Base Options"),
547 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL,
548 FLAG_BASIC | FLAG_SHARE | FLAG_PRINT, {0}},
549 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_SHARE | FLAG_PRINT,
550 {0}},
551 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, 0, {0}},
552 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC, {0}},
553 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, NULL, NULL, FLAG_BASIC, {0}},
554 {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, 0, {0}},
555 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, 0, {0}},
556 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC, {0}},
557 {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC, {0}},
558 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, 0, {0}},
559
560 PARM_SEPARATOR ("Security Options"),
561 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC, {0}},
562 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC,
563 {0}},
564 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC, {0}},
565 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, 0, {0}},
566 {"alternate permissions", P_BOOL, P_LOCAL, &sDefault.bAlternatePerm, NULL, NULL,
567 FLAG_GLOBAL | FLAG_DEPRECATED, {0}},
568 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, 0, {0}},
569 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0, {0}},
570 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, 0, {0}},
571 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, 0, {0}},
572 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, 0, {0}},
573 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, 0, {0}},
574 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, 0, {0}},
575 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0, {0}},
576 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0, {0}},
577 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, 0, {0}},
578 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, 0, {0}},
579 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, 0, {0}},
580 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, 0, {0}},
581 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, 0, {0}},
582 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, 0, {0}},
583 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, 0, {0}},
584 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, 0, {0}},
585 {"restrict anonymous", P_BOOL, P_GLOBAL, &Globals.bRestrictAnonymous, NULL, NULL, 0, {0}},
586 {"revalidate", P_BOOL, P_LOCAL, &sDefault.bRevalidate, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE,
587 {0}},
588 {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL, NULL, 0, {0}},
589 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE,
590 {0}},
591 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0, {0}},
592 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, 0, {0}},
593 {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL, NULL,
594 FLAG_BASIC | FLAG_SHARE | FLAG_PRINT | FLAG_GLOBAL, {0}},
595 {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL,
596 FLAG_GLOBAL | FLAG_SHARE, {0}},
597 {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE,
598 {0}},
599 {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE,
600 {0}},
601 {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE, {0}},
602 {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE,
603 {0}},
604 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE, {0}},
605 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE, {0}},
606 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, 0, {0}},
607 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_SHARE, {0}},
608 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0, {0}},
609 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0, {0}},
610 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, 0, {0}},
611 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE,
612 {0}},
613 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL, {0}},
614 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL,
615 FLAG_GLOBAL | FLAG_SHARE, {0}},
616 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE,
617 {0}},
618 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL, {0}},
619 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL,
620 FLAG_GLOBAL | FLAG_SHARE, {0}},
621 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE, {0}},
622 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, 0, {0}},
623 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL,
624 FLAG_BASIC | FLAG_SHARE | FLAG_PRINT, {0}},
625 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, 0, {0}},
626 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE, {0}},
627 {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL,
628 FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT, {0}},
629 {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, 0, {0}},
630 {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL,
631 FLAG_GLOBAL | FLAG_BASIC | FLAG_SHARE | FLAG_PRINT, {0}},
632 {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, 0, {0}},
633
634 #ifdef WITH_SSL
635 PARM_SEPARATOR ("Secure Socket Layer Options"),
636 {"ssl", P_BOOL, P_GLOBAL, &Globals.sslEnabled, NULL, NULL, 0, {0}},
637 {"ssl hosts", P_STRING, P_GLOBAL, &Globals.sslHostsRequire, NULL, NULL, 0, {0}},
638 {"ssl hosts resign", P_STRING, P_GLOBAL, &Globals.sslHostsResign, NULL, NULL, 0},
639 {"ssl CA certDir", P_STRING, P_GLOBAL, &Globals.sslCaCertDir, NULL, NULL, 0, {0}},
640 {"ssl CA certFile", P_STRING, P_GLOBAL, &Globals.sslCaCertFile, NULL, NULL, 0, {0}},
641 {"ssl server cert", P_STRING, P_GLOBAL, &Globals.sslCert, NULL, NULL, 0, {0}},
642 {"ssl server key", P_STRING, P_GLOBAL, &Globals.sslPrivKey, NULL, NULL, 0, {0}},
643 {"ssl client cert", P_STRING, P_GLOBAL, &Globals.sslClientCert, NULL, NULL, 0, {0}},
644 {"ssl client key", P_STRING, P_GLOBAL, &Globals.sslClientPrivKey, NULL, NULL, 0, {0}},
645 {"ssl require clientcert", P_BOOL, P_GLOBAL, &Globals.sslReqClientCert, NULL, NULL, 0, {0}},
646 {"ssl require servercert", P_BOOL, P_GLOBAL, &Globals.sslReqServerCert, NULL, NULL, 0, {0}},
647 {"ssl ciphers", P_STRING, P_GLOBAL, &Globals.sslCiphers, NULL, NULL, 0, {0}},
648 {"ssl version", P_ENUM, P_GLOBAL, &Globals.sslVersion, NULL, enum_ssl_version, 0, {0}},
649 {"ssl compatibility", P_BOOL, P_GLOBAL, &Globals.sslCompatibility, NULL, NULL, 0, {0}},
650 #endif
651
652 PARM_SEPARATOR ("Logging Options"),
653 {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, FLAG_BASIC, {0}},
654 {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL, NULL, 0, {0}},
655 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, 0, {0}},
656 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, 0, {0}},
657 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, 0, {0}},
658 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, 0, {0}},
659 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0, {0}},
660 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, 0, {0}},
661 {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT,
662 {0}},
663
664 PARM_SEPARATOR ("Protocol Options"),
665 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0, {0}},
666 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, 0, {0}},
667 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, 0, {0}},
668 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, 0, {0}},
669 {"nt smb support", P_BOOL, P_GLOBAL, &Globals.bNTSmbSupport, NULL, NULL, 0, {0}},
670 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, 0, {0}},
671 {"nt acl support", P_BOOL, P_GLOBAL, &Globals.bNTAclSupport, NULL, NULL, 0, {0}},
672 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, 0, {0}},
673 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, 0, {0}},
674 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, 0, {0}},
675 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, 0, {0}},
676 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, 0, {0}},
677 {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0, {0}},
678 {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL, NULL, 0, {0}},
679 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, 0, {0}},
680 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, 0, {0}},
681 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, 0, {0}},
682 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, 0, {0}},
683
684 PARM_SEPARATOR ("Tuning Options"),
685 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, 0,
686 {0}},
687 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, 0, {0}},
688 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, 0, {0}},
689 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, 0, {0}},
690 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, 0, {0}},
691 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE, {0}},
692 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, 0, {0}},
693 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, 0, {0}},
694 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT, {0}},
695 {"read prediction", P_BOOL, P_GLOBAL, &Globals.bReadPrediction, NULL, NULL, 0, {0}},
696 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, 0, {0}},
697 {"shared mem size", P_INTEGER, P_GLOBAL, &Globals.shmem_size, NULL, NULL, 0, {0}},
698 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, 0, {0}},
699 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, 0, {0}},
700 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE, {0}},
701 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE, {0}},
702
703 PARM_SEPARATOR ("Printing Options"),
704 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT, {0}},
705 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT, {0}},
706 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, 0, {0}},
707 {"printer driver file", P_STRING, P_GLOBAL, &Globals.szDriverFile, NULL, NULL, FLAG_PRINT, {0}},
708 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT, {0}},
709 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, 0, {0}},
710 {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT, {0}},
711 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing,
712 FLAG_PRINT | FLAG_GLOBAL, {0}},
713 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL,
714 FLAG_PRINT | FLAG_GLOBAL, {0}},
715 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL,
716 {0}},
717 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL,
718 FLAG_PRINT | FLAG_GLOBAL, {0}},
719 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL,
720 FLAG_PRINT | FLAG_GLOBAL, {0}},
721 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL,
722 FLAG_PRINT | FLAG_GLOBAL, {0}},
723 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL,
724 FLAG_PRINT | FLAG_GLOBAL, {0}},
725 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL,
726 FLAG_PRINT | FLAG_GLOBAL, {0}},
727
728 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT, {0}},
729 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, 0, {0}},
730 {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT, {0}},
731 {"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL,
732 FLAG_PRINT | FLAG_GLOBAL, {0}},
733
734
735 PARM_SEPARATOR ("Filename Handling"),
736 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, 0, {0}},
737 {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set, NULL, 0,
738 {0}},
739 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, 0, {0}},
740 {"coding system", P_STRING, P_GLOBAL, &Globals.szCodingSystem, handle_coding_system, NULL, 0,
741 {0}},
742 {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, NULL, NULL, 0, {0}},
743 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE, {0}},
744 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL,
745 FLAG_SHARE | FLAG_GLOBAL, {0}},
746 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, 0, {0}},
747 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL,
748 FLAG_SHARE | FLAG_GLOBAL, {0}},
749 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL,
750 FLAG_SHARE | FLAG_GLOBAL, {0}},
751 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
752 {0}},
753 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
754 {0}},
755 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL,
756 FLAG_SHARE | FLAG_GLOBAL, {0}},
757 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL,
758 FLAG_SHARE | FLAG_GLOBAL, {0}},
759 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
760 {0}},
761 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
762 {0}},
763 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL,
764 FLAG_SHARE | FLAG_GLOBAL, {0}},
765 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
766 {0}},
767 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
768 {0}},
769 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
770 {0}},
771 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL,
772 FLAG_SHARE | FLAG_GLOBAL, {0}},
773 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
774 {0}},
775 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, 0, {0}},
776
777 PARM_SEPARATOR ("Domain Options"),
778 {"domain groups", P_STRING, P_GLOBAL, &Globals.szDomainGroups, NULL, NULL, 0, {0}},
779 {"domain admin group", P_STRING, P_GLOBAL, &Globals.szDomainAdminGroup, NULL, NULL, 0, {0}},
780 {"domain guest group", P_STRING, P_GLOBAL, &Globals.szDomainGuestGroup, NULL, NULL, 0, {0}},
781 {"domain admin users", P_STRING, P_GLOBAL, &Globals.szDomainAdminUsers, NULL, NULL, 0, {0}},
782 {"domain guest users", P_STRING, P_GLOBAL, &Globals.szDomainGuestUsers, NULL, NULL, 0, {0}},
783 #ifdef USING_GROUPNAME_MAP
784 {"groupname map", P_STRING, P_GLOBAL, &Globals.szGroupnameMap, NULL, NULL, 0, {0}},
785 #endif
786 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL,
787 0, {0}},
788
789 PARM_SEPARATOR ("Logon Options"),
790 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, 0, {0}},
791 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, 0, {0}},
792 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, 0, {0}},
793 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, 0, {0}},
794 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, 0, {0}},
795 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, 0, {0}},
796 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, 0, {0}},
797
798 PARM_SEPARATOR ("Browse Options"),
799 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC, {0}},
800 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_lm_announce, 0, {0}},
801 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, 0, {0}},
802 {"preferred master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL, FLAG_BASIC, {0}},
803 {"prefered master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL, NULL, 0, {0}},
804 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC, {0}},
805 {"domain master", P_BOOL, P_GLOBAL, &Globals.bDomainMaster, NULL, NULL, FLAG_BASIC, {0}},
806 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, 0, {0}},
807 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL,
808 FLAG_BASIC | FLAG_SHARE | FLAG_PRINT, {0}},
809 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, 0, {0}},
810
811 PARM_SEPARATOR ("WINS Options"),
812 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, 0, {0}},
813 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, 0, {0}},
814 {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL, NULL, FLAG_BASIC, {0}},
815 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC, {0}},
816
817 PARM_SEPARATOR ("Locking Options"),
818 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL,
819 FLAG_SHARE | FLAG_GLOBAL, {0}},
820 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE, {0}},
821 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL, {0}},
822 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL, {0}},
823 {"mangle locks", P_BOOL, P_LOCAL, &sDefault.bMangleLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
824 {0}},
825 {"ole locking compatibility", P_BOOL, P_GLOBAL, &Globals.bOleLockingCompat, NULL, NULL,
826 FLAG_GLOBAL, {0}},
827 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL, {0}},
828 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL,
829 FLAG_GLOBAL, {0}},
830 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL,
831 FLAG_SHARE | FLAG_GLOBAL, {0}},
832 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL,
833 FLAG_SHARE | FLAG_GLOBAL, {0}},
834 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
835 {0}},
836
837 #ifdef WITH_LDAP
838 PARM_SEPARATOR ("Ldap Options"),
839 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0, {0}},
840 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0, {0}},
841 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, 0, {0}},
842 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, 0, {0}},
843 {"ldap root", P_STRING, P_GLOBAL, &Globals.szLdapRoot, NULL, NULL, 0, {0}},
844 {"ldap root passwd", P_STRING, P_GLOBAL, &Globals.szLdapRootPassword, NULL, NULL, 0, {0}},
845 #endif
846
847
848 PARM_SEPARATOR ("Miscellaneous Options"),
849 {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0, {0}},
850 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE, {0}},
851 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0, {0}},
852 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, 0, {0}},
853 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0, {0}},
854 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, 0, {0}},
855 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0, {0}},
856 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, 0, {0}},
857 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, 0, {0}},
858 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, 0, {0}},
859 {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars, NULL, 0, {0}},
860 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, 0, {0}},
861 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, 0, {0}},
862 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, 0, {0}},
863 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, 0, {0}},
864 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, 0, {0}},
865 {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL, NULL, 0, {0}},
866 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, 0, {0}},
867 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE, {0}},
868 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE, {0}},
869 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE, {0}},
870 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT, {0}},
871 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, 0, {0}},
872 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT, {0}},
873 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL,
874 FLAG_SHARE | FLAG_PRINT, {0}},
875 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL,
876 FLAG_SHARE | FLAG_PRINT, {0}},
877 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL,
878 FLAG_BASIC | FLAG_SHARE | FLAG_PRINT, {0}},
879 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE, {0}},
880 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE, {0}},
881 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE, {0}},
882 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
883 {0}},
884 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL,
885 {0}},
886 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE, {0}},
887 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE, {0}},
888 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE, {0}},
889 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL,
890 FLAG_SHARE | FLAG_GLOBAL, {0}},
891 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL,
892 FLAG_SHARE | FLAG_GLOBAL, {0}},
893 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL,
894 FLAG_SHARE | FLAG_GLOBAL, {0}},
895
896 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL,
897 FLAG_SHARE | FLAG_GLOBAL, {0}},
898 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0, {0}},
899
900 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0, {0}}
901 };
902
903
904
905
906
907
908 static void
909 init_globals (void)
910 {
911 static BOOL done_init = False;
912 fstring s;
913
914 if (!done_init)
915 {
916 int i;
917 memset ((void *) &Globals, '\0', sizeof (Globals));
918
919 for (i = 0; parm_table[i].label; i++)
920 if ((parm_table[i].type == P_STRING ||
921 parm_table[i].type == P_USTRING) && parm_table[i].ptr)
922 string_init (parm_table[i].ptr, "");
923
924 string_set (&sDefault.szGuestaccount, GUEST_ACCOUNT);
925 string_set (&sDefault.szPrinterDriver, "NULL");
926 string_set (&sDefault.fstype, FSTYPE_STRING);
927
928 done_init = True;
929 }
930
931
932 DEBUG (3, ("Initialising global parameters\n"));
933
934 string_set (&Globals.szWorkGroup, WORKGROUP);
935 string_set (&Globals.szPrintcapname, PRINTCAP_NAME);
936 string_set (&Globals.szDriverFile, DRIVERFILE);
937 string_set (&Globals.szRootdir, "/");
938 string_set (&Globals.szSocketAddress, "0.0.0.0");
939 string_set (&Globals.szServerString, "Samba " VERSION);
940 slprintf (s, sizeof (s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION);
941 string_set (&Globals.szAnnounceVersion, s);
942
943 pstrcpy (user_socket_options, DEFAULT_SOCKET_OPTIONS);
944
945 string_set (&Globals.szLogonDrive, "");
946
947 string_set (&Globals.szLogonHome, "\\\\%N\\%U");
948 string_set (&Globals.szLogonPath, "\\\\%N\\%U\\profile");
949
950 string_set (&Globals.szNameResolveOrder, "lmhosts host wins bcast");
951
952 Globals.bLoadPrinters = True;
953 Globals.bUseRhosts = False;
954 Globals.max_packet = 65535;
955 Globals.mangled_stack = 50;
956 Globals.max_xmit = 65535;
957 Globals.max_mux = 50;
958 Globals.lpqcachetime = 10;
959 Globals.pwordlevel = 0;
960 Globals.unamelevel = 0;
961 Globals.deadtime = 0;
962 Globals.max_log_size = 5000;
963 Globals.max_open_files = MAX_OPEN_FILES;
964 Globals.maxprotocol = PROTOCOL_NT1;
965 Globals.security = SEC_USER;
966 Globals.bEncryptPasswords = False;
967 Globals.bUpdateEncrypt = False;
968 Globals.bReadRaw = True;
969 Globals.bWriteRaw = True;
970 Globals.bReadPrediction = False;
971 Globals.bReadbmpx = False;
972 Globals.bNullPasswords = False;
973 Globals.bStripDot = False;
974 Globals.syslog = 1;
975 Globals.bSyslogOnly = False;
976 Globals.bTimestampLogs = True;
977 Globals.os_level = 0;
978 Globals.max_ttl = 60 * 60 * 24 * 3;
979 Globals.max_wins_ttl = 60 * 60 * 24 * 6;
980 Globals.min_wins_ttl = 60 * 60 * 6;
981 Globals.machine_password_timeout = 60 * 60 * 24 * 7;
982 Globals.change_notify_timeout = 60;
983 Globals.ReadSize = 16 * 1024;
984 Globals.lm_announce = 2;
985 Globals.lm_interval = 60;
986 Globals.shmem_size = SHMEM_SIZE;
987 Globals.stat_cache_size = 50;
988 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
989 Globals.bUnixRealname = False;
990 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
991 Globals.bNISHomeMap = False;
992 #ifdef WITH_NISPLUS_HOME
993 string_set (&Globals.szNISHomeMapName, "auto_home.org_dir");
994 #else
995 string_set (&Globals.szNISHomeMapName, "auto.home");
996 #endif
997 #endif
998 Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
999 Globals.bTimeServer = False;
1000 Globals.bBindInterfacesOnly = False;
1001 Globals.bUnixPasswdSync = False;
1002 Globals.bPasswdChatDebug = False;
1003 Globals.bOleLockingCompat = True;
1004 Globals.bNTSmbSupport = True;
1005 Globals.bNTPipeSupport = True;
1006 Globals.bNTAclSupport = True;
1007 Globals.bStatCache = True;
1008 Globals.bRestrictAnonymous = False;
1009 Globals.map_to_guest = 0;
1010 Globals.min_passwd_length = MINPASSWDLENGTH;
1011 Globals.oplock_break_wait_time = 10;
1012
1013 #ifdef WITH_LDAP
1014
1015 string_set (&Globals.szLdapServer, "localhost");
1016 Globals.ldap_port = 389;
1017 #endif
1018
1019 #ifdef WITH_SSL
1020 Globals.sslVersion = SMB_SSL_V23;
1021 string_set (&Globals.sslHostsRequire, "");
1022 string_set (&Globals.sslHostsResign, "");
1023 string_set (&Globals.sslCaCertDir, "");
1024 string_set (&Globals.sslCaCertFile, "");
1025 string_set (&Globals.sslCert, "");
1026 string_set (&Globals.sslPrivKey, "");
1027 string_set (&Globals.sslClientCert, "");
1028 string_set (&Globals.sslClientPrivKey, "");
1029 string_set (&Globals.sslCiphers, "");
1030 Globals.sslEnabled = False;
1031 Globals.sslReqClientCert = False;
1032 Globals.sslReqServerCert = False;
1033 Globals.sslCompatibility = False;
1034 #endif
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048 Globals.bPreferredMaster = False;
1049 Globals.bLocalMaster = True;
1050 Globals.bDomainMaster = False;
1051 Globals.bDomainLogons = False;
1052 Globals.bBrowseList = True;
1053 Globals.bWINSsupport = False;
1054 Globals.bWINSproxy = False;
1055
1056 Globals.bDNSproxy = True;
1057
1058
1059
1060
1061
1062 Globals.bKernelOplocks = True;
1063
1064 Globals.bAllowTrustedDomains = True;
1065
1066
1067
1068
1069
1070
1071 interpret_coding_system (KANJI);
1072 }
1073
1074 #if 0
1075
1076
1077
1078 static void
1079 string_initial (char **s, char *v)
1080 {
1081 if (!*s || !**s)
1082 string_init (s, v);
1083 }
1084
1085 #else
1086 #define init_locals()
1087 #endif
1088
1089 static size_t
1090 size_max (size_t a, size_t b)
1091 {
1092 return (a > b) ? a : b;
1093 }
1094
1095
1096
1097
1098
1099
1100 static char *
1101 lp_string (const char *s)
1102 {
1103 static char *bufs[10];
1104 static int buflen[10];
1105 static int next = -1;
1106 char *ret;
1107 int i;
1108 int len = s ? strlen (s) : 0;
1109
1110 if (next == -1)
1111 {
1112
1113 for (i = 0; i < 10; i++)
1114 {
1115 bufs[i] = NULL;
1116 buflen[i] = 0;
1117 }
1118 next = 0;
1119 }
1120
1121 len = size_max (len + 100, sizeof (pstring));
1122
1123
1124 if (buflen[next] != len)
1125 {
1126 buflen[next] = len;
1127 if (bufs[next])
1128 free (bufs[next]);
1129 bufs[next] = (char *) malloc (len);
1130 if (!bufs[next])
1131 {
1132 DEBUG (0, ("out of memory in lp_string()"));
1133 exit (1);
1134 }
1135 }
1136
1137 ret = &bufs[next][0];
1138 next = (next + 1) % 10;
1139
1140 if (!s)
1141 *ret = 0;
1142 else
1143 StrCpy (ret, s);
1144
1145 trim_string (ret, "\"", "\"");
1146
1147 standard_sub_basic (ret);
1148 return (ret);
1149 }
1150
1151
1152
1153
1154
1155
1156
1157 #define FN_GLOBAL_STRING(fn_name,ptr) \
1158 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1159 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1160 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1161 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1162 char fn_name(void) {return(*(char *)(ptr));}
1163 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1164 int fn_name(void) {return(*(int *)(ptr));}
1165
1166 #define FN_LOCAL_STRING(fn_name,val) \
1167 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
1168 #define FN_LOCAL_BOOL(fn_name,val) \
1169 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1170 #define FN_LOCAL_CHAR(fn_name,val) \
1171 char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1172 #define FN_LOCAL_INTEGER(fn_name,val) \
1173 int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
1174
1175 FN_GLOBAL_STRING (lp_logfile, &Globals.szLogFile)
1176 FN_GLOBAL_STRING (lp_configfile, &Globals.szConfigFile)
1177 FN_GLOBAL_STRING (lp_serverstring, &Globals.szServerString)
1178 FN_GLOBAL_STRING (lp_printcapname, &Globals.szPrintcapname)
1179 FN_GLOBAL_STRING (lp_lockdir, &Globals.szLockDir)
1180 FN_GLOBAL_STRING (lp_rootdir, &Globals.szRootdir)
1181 FN_GLOBAL_STRING (lp_defaultservice, &Globals.szDefaultService)
1182 FN_GLOBAL_STRING (lp_msg_command, &Globals.szMsgCommand)
1183 FN_GLOBAL_STRING (lp_hosts_equiv, &Globals.szHostsEquiv)
1184 FN_GLOBAL_STRING (lp_auto_services, &Globals.szAutoServices)
1185 FN_GLOBAL_STRING (lp_passwordserver, &Globals.szPasswordServer)
1186 FN_GLOBAL_STRING (lp_name_resolve_order, &Globals.szNameResolveOrder)
1187 FN_GLOBAL_STRING (lp_workgroup, &Globals.szWorkGroup)
1188 FN_GLOBAL_STRING (lp_username_map, &Globals.szUsernameMap)
1189 #ifdef USING_GROUPNAME_MAP
1190 FN_GLOBAL_STRING (lp_groupname_map, &Globals.szGroupnameMap)
1191 #endif
1192 FN_GLOBAL_STRING (lp_remote_announce, &Globals.szRemoteAnnounce)
1193 FN_GLOBAL_STRING (lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1194 FN_GLOBAL_STRING (lp_wins_server, &Globals.szWINSserver)
1195 FN_GLOBAL_STRING (lp_interfaces, &Globals.szInterfaces)
1196 FN_GLOBAL_STRING (lp_socket_address, &Globals.szSocketAddress)
1197 FN_GLOBAL_STRING (lp_nis_home_map_name, &Globals.szNISHomeMapName)
1198 #if 0
1199 static FN_GLOBAL_STRING (lp_announce_version, &Globals.szAnnounceVersion)
1200 #endif
1201 FN_GLOBAL_STRING (lp_netbios_aliases, &Globals.szNetbiosAliases)
1202 FN_GLOBAL_STRING (lp_driverfile, &Globals.szDriverFile)
1203 FN_GLOBAL_STRING (lp_panic_action, &Globals.szPanicAction)
1204 FN_GLOBAL_STRING (lp_domain_groups, &Globals.szDomainGroups)
1205 FN_GLOBAL_STRING (lp_domain_admin_group, &Globals.szDomainAdminGroup)
1206 FN_GLOBAL_STRING (lp_domain_guest_group, &Globals.szDomainGuestGroup)
1207 FN_GLOBAL_STRING (lp_domain_admin_users, &Globals.szDomainAdminUsers)
1208 FN_GLOBAL_STRING (lp_domain_guest_users, &Globals.szDomainGuestUsers)
1209 #ifdef WITH_LDAP
1210 FN_GLOBAL_STRING (lp_ldap_server, &Globals.szLdapServer);
1211 FN_GLOBAL_STRING (lp_ldap_suffix, &Globals.szLdapSuffix);
1212 FN_GLOBAL_STRING (lp_ldap_filter, &Globals.szLdapFilter);
1213 FN_GLOBAL_STRING (lp_ldap_root, &Globals.szLdapRoot);
1214 FN_GLOBAL_STRING (lp_ldap_rootpasswd, &Globals.szLdapRootPassword);
1215 #endif
1216
1217 #ifdef WITH_SSL
1218 FN_GLOBAL_INTEGER (lp_ssl_version, &Globals.sslVersion);
1219 FN_GLOBAL_STRING (lp_ssl_hosts, &Globals.sslHostsRequire);
1220 FN_GLOBAL_STRING (lp_ssl_hosts_resign, &Globals.sslHostsResign);
1221 FN_GLOBAL_STRING (lp_ssl_cacertdir, &Globals.sslCaCertDir);
1222 FN_GLOBAL_STRING (lp_ssl_cacertfile, &Globals.sslCaCertFile);
1223 FN_GLOBAL_STRING (lp_ssl_cert, &Globals.sslCert);
1224 FN_GLOBAL_STRING (lp_ssl_privkey, &Globals.sslPrivKey);
1225 FN_GLOBAL_STRING (lp_ssl_client_cert, &Globals.sslClientCert);
1226 FN_GLOBAL_STRING (lp_ssl_client_privkey, &Globals.sslClientPrivKey);
1227 FN_GLOBAL_STRING (lp_ssl_ciphers, &Globals.sslCiphers);
1228 FN_GLOBAL_BOOL (lp_ssl_enabled, &Globals.sslEnabled);
1229 FN_GLOBAL_BOOL (lp_ssl_reqClientCert, &Globals.sslReqClientCert);
1230 FN_GLOBAL_BOOL (lp_ssl_reqServerCert, &Globals.sslReqServerCert);
1231 FN_GLOBAL_BOOL (lp_ssl_compatibility, &Globals.sslCompatibility);
1232 #endif
1233
1234 FN_GLOBAL_BOOL (lp_dns_proxy, &Globals.bDNSproxy)
1235 FN_GLOBAL_BOOL (lp_wins_support, &Globals.bWINSsupport)
1236 FN_GLOBAL_BOOL (lp_we_are_a_wins_server, &Globals.bWINSsupport)
1237 FN_GLOBAL_BOOL (lp_wins_proxy, &Globals.bWINSproxy)
1238 FN_GLOBAL_BOOL (lp_local_master, &Globals.bLocalMaster)
1239 FN_GLOBAL_BOOL (lp_domain_master, &Globals.bDomainMaster)
1240 FN_GLOBAL_BOOL (lp_domain_logons, &Globals.bDomainLogons)
1241 FN_GLOBAL_BOOL (lp_preferred_master, &Globals.bPreferredMaster)
1242 FN_GLOBAL_BOOL (lp_use_rhosts, &Globals.bUseRhosts)
1243 FN_GLOBAL_BOOL (lp_readprediction, &Globals.bReadPrediction)
1244 FN_GLOBAL_BOOL (lp_readbmpx, &Globals.bReadbmpx)
1245 FN_GLOBAL_BOOL (lp_readraw, &Globals.bReadRaw)
1246 FN_GLOBAL_BOOL (lp_writeraw, &Globals.bWriteRaw)
1247 FN_GLOBAL_BOOL (lp_null_passwords, &Globals.bNullPasswords)
1248 FN_GLOBAL_BOOL (lp_strip_dot, &Globals.bStripDot)
1249 FN_GLOBAL_BOOL (lp_encrypted_passwords, &Globals.bEncryptPasswords)
1250 FN_GLOBAL_BOOL (lp_update_encrypted, &Globals.bUpdateEncrypt)
1251 FN_GLOBAL_BOOL (lp_syslog_only, &Globals.bSyslogOnly)
1252 FN_GLOBAL_BOOL (lp_timestamp_logs, &Globals.bTimestampLogs)
1253 FN_GLOBAL_BOOL (lp_browse_list, &Globals.bBrowseList)
1254 FN_GLOBAL_BOOL (lp_unix_realname, &Globals.bUnixRealname)
1255 FN_GLOBAL_BOOL (lp_nis_home_map, &Globals.bNISHomeMap)
1256 #if 0
1257 static FN_GLOBAL_BOOL (lp_time_server, &Globals.bTimeServer)
1258 #endif
1259 FN_GLOBAL_BOOL (lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1260 FN_GLOBAL_BOOL (lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1261 FN_GLOBAL_BOOL (lp_ole_locking_compat, &Globals.bOleLockingCompat)
1262 FN_GLOBAL_BOOL (lp_nt_smb_support, &Globals.bNTSmbSupport)
1263 FN_GLOBAL_BOOL (lp_nt_pipe_support, &Globals.bNTPipeSupport)
1264 FN_GLOBAL_BOOL (lp_nt_acl_support, &Globals.bNTAclSupport)
1265 FN_GLOBAL_BOOL (lp_stat_cache, &Globals.bStatCache)
1266 FN_GLOBAL_BOOL (lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1267 FN_GLOBAL_BOOL (lp_restrict_anonymous, &Globals.bRestrictAnonymous)
1268 FN_GLOBAL_INTEGER (lp_os_level, &Globals.os_level)
1269 FN_GLOBAL_INTEGER (lp_max_ttl, &Globals.max_ttl)
1270 FN_GLOBAL_INTEGER (lp_max_wins_ttl, &Globals.max_wins_ttl)
1271 FN_GLOBAL_INTEGER (lp_min_wins_ttl, &Globals.min_wins_ttl)
1272 FN_GLOBAL_INTEGER (lp_maxxmit, &Globals.max_xmit)
1273 FN_GLOBAL_INTEGER (lp_maxmux, &Globals.max_mux)
1274 FN_GLOBAL_INTEGER (lp_passwordlevel, &Globals.pwordlevel)
1275 FN_GLOBAL_INTEGER (lp_usernamelevel, &Globals.unamelevel)
1276 FN_GLOBAL_INTEGER (lp_readsize, &Globals.ReadSize)
1277 FN_GLOBAL_INTEGER (lp_deadtime, &Globals.deadtime)
1278 FN_GLOBAL_INTEGER (lp_maxprotocol, &Globals.maxprotocol)
1279 FN_GLOBAL_INTEGER (lp_security, &Globals.security)
1280 FN_GLOBAL_INTEGER (lp_maxdisksize, &Globals.maxdisksize)
1281 FN_GLOBAL_INTEGER (lp_client_code_page, &Globals.client_code_page)
1282 #if 0
1283 static FN_GLOBAL_INTEGER (lp_announce_as, &Globals.announce_as)
1284 #endif
1285 FN_GLOBAL_INTEGER (lp_lm_announce, &Globals.lm_announce)
1286 FN_GLOBAL_INTEGER (lp_lm_interval, &Globals.lm_interval)
1287 FN_GLOBAL_INTEGER (lp_machine_password_timeout, &Globals.machine_password_timeout)
1288 FN_GLOBAL_INTEGER (lp_change_notify_timeout, &Globals.change_notify_timeout)
1289 FN_GLOBAL_INTEGER (lp_stat_cache_size, &Globals.stat_cache_size)
1290 FN_GLOBAL_INTEGER (lp_map_to_guest, &Globals.map_to_guest)
1291 FN_GLOBAL_INTEGER (lp_min_passwd_length, &Globals.min_passwd_length)
1292 FN_GLOBAL_INTEGER (lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1293 #ifdef WITH_LDAP
1294 FN_GLOBAL_INTEGER (lp_ldap_port, &Globals.ldap_port)
1295 #endif
1296 FN_LOCAL_STRING (lp_preexec, szPreExec)
1297 FN_LOCAL_STRING (lp_postexec, szPostExec)
1298 FN_LOCAL_STRING (lp_rootpreexec, szRootPreExec)
1299 FN_LOCAL_STRING (lp_rootpostexec, szRootPostExec)
1300 FN_LOCAL_STRING (lp_servicename, szService)
1301 FN_LOCAL_STRING (lp_pathname, szPath)
1302 FN_LOCAL_STRING (lp_dontdescend, szDontdescend)
1303 FN_LOCAL_STRING (lp_username, szUsername)
1304 FN_LOCAL_STRING (lp_guestaccount, szGuestaccount)
1305 FN_LOCAL_STRING (lp_invalid_users, szInvalidUsers)
1306 FN_LOCAL_STRING (lp_valid_users, szValidUsers)
1307 FN_LOCAL_STRING (lp_admin_users, szAdminUsers)
1308 #if 0
1309 FN_LOCAL_STRING (lp_printcommand, szPrintcommand)
1310 FN_LOCAL_STRING (lp_lpqcommand, szLpqcommand)
1311 FN_LOCAL_STRING (lp_lprmcommand, szLprmcommand)
1312 FN_LOCAL_STRING (lp_lppausecommand, szLppausecommand)
1313 FN_LOCAL_STRING (lp_lpresumecommand, szLpresumecommand)
1314 FN_LOCAL_STRING (lp_queuepausecommand, szQueuepausecommand)
1315 FN_LOCAL_STRING (lp_queueresumecommand, szQueueresumecommand)
1316 FN_LOCAL_STRING (lp_printername, szPrintername)
1317 FN_LOCAL_STRING (lp_printerdriver, szPrinterDriver)
1318 #endif
1319 FN_LOCAL_STRING (lp_hostsallow, szHostsallow)
1320 FN_LOCAL_STRING (lp_hostsdeny, szHostsdeny)
1321 FN_LOCAL_STRING (lp_magicscript, szMagicScript)
1322 FN_LOCAL_STRING (lp_magicoutput, szMagicOutput)
1323 FN_LOCAL_STRING (lp_comment, comment)
1324 FN_LOCAL_STRING (lp_force_user, force_user)
1325 FN_LOCAL_STRING (lp_force_group, force_group)
1326 FN_LOCAL_STRING (lp_readlist, readlist)
1327 FN_LOCAL_STRING (lp_writelist, writelist)
1328 FN_LOCAL_STRING (lp_fstype, fstype)
1329 #if 0
1330 static FN_LOCAL_STRING (lp_volume, volume)
1331 #endif
1332 FN_LOCAL_STRING (lp_mangled_map, szMangledMap)
1333 FN_LOCAL_STRING (lp_veto_files, szVetoFiles)
1334 FN_LOCAL_STRING (lp_hide_files, szHideFiles)
1335 FN_LOCAL_STRING (lp_veto_oplocks, szVetoOplockFiles)
1336 FN_LOCAL_BOOL (lp_revalidate, bRevalidate)
1337 FN_LOCAL_BOOL (lp_casesensitive, bCaseSensitive)
1338 FN_LOCAL_BOOL (lp_preservecase, bCasePreserve)
1339 FN_LOCAL_BOOL (lp_shortpreservecase, bShortCasePreserve)
1340 FN_LOCAL_BOOL (lp_casemangle, bCaseMangle)
1341 FN_LOCAL_BOOL (lp_status, status)
1342 FN_LOCAL_BOOL (lp_hide_dot_files, bHideDotFiles)
1343 FN_LOCAL_BOOL (lp_browseable, bBrowseable)
1344 FN_LOCAL_BOOL (lp_readonly, bRead_only)
1345 FN_LOCAL_BOOL (lp_no_set_dir, bNo_set_dir)
1346 FN_LOCAL_BOOL (lp_guest_ok, bGuest_ok)
1347 FN_LOCAL_BOOL (lp_guest_only, bGuest_only)
1348 FN_LOCAL_BOOL (lp_print_ok, bPrint_ok)
1349 FN_LOCAL_BOOL (lp_postscript, bPostscript)
1350 FN_LOCAL_BOOL (lp_map_hidden, bMap_hidden)
1351 FN_LOCAL_BOOL (lp_map_archive, bMap_archive)
1352 FN_LOCAL_BOOL (lp_locking, bLocking)
1353 FN_LOCAL_BOOL (lp_strict_locking, bStrictLocking)
1354 FN_LOCAL_BOOL (lp_share_modes, bShareModes)
1355 FN_LOCAL_BOOL (lp_oplocks, bOpLocks)
1356 FN_LOCAL_BOOL (lp_onlyuser, bOnlyUser)
1357 FN_LOCAL_BOOL (lp_manglednames, bMangledNames)
1358 FN_LOCAL_BOOL (lp_widelinks, bWidelinks)
1359 FN_LOCAL_BOOL (lp_symlinks, bSymlinks)
1360 FN_LOCAL_BOOL (lp_syncalways, bSyncAlways)
1361 FN_LOCAL_BOOL (lp_strict_sync, bStrictSync)
1362 FN_LOCAL_BOOL (lp_map_system, bMap_system)
1363 FN_LOCAL_BOOL (lp_delete_readonly, bDeleteReadonly)
1364 FN_LOCAL_BOOL (lp_fake_oplocks, bFakeOplocks)
1365 FN_LOCAL_BOOL (lp_recursive_veto_delete, bDeleteVetoFiles)
1366 FN_LOCAL_BOOL (lp_dos_filetimes, bDosFiletimes)
1367 FN_LOCAL_BOOL (lp_dos_filetime_resolution, bDosFiletimeResolution)
1368 FN_LOCAL_BOOL (lp_fake_dir_create_times, bFakeDirCreateTimes)
1369 FN_LOCAL_BOOL (lp_blocking_locks, bBlockingLocks)
1370 FN_LOCAL_BOOL (lp_mangle_locks, bMangleLocks)
1371 FN_LOCAL_INTEGER (lp_create_mode, iCreate_mask)
1372 FN_LOCAL_INTEGER (lp_force_create_mode, iCreate_force_mode)
1373 FN_LOCAL_INTEGER (lp_dir_mode, iDir_mask)
1374 FN_LOCAL_INTEGER (lp_force_dir_mode, iDir_force_mode)
1375 FN_LOCAL_INTEGER (lp_max_connections, iMaxConnections)
1376 FN_LOCAL_INTEGER (lp_defaultcase, iDefaultCase)
1377 FN_LOCAL_INTEGER (lp_minprintspace, iMinPrintSpace)
1378 FN_LOCAL_INTEGER (lp_printing, iPrinting)
1379 FN_LOCAL_INTEGER (lp_oplock_contention_limit, iOplockContentionLimit)
1380 FN_LOCAL_CHAR (lp_magicchar, magic_char)
1381
1382 static int strwicmp (const char *psz1, const char *psz2);
1383 static int map_parameter (const char *pszParmName);
1384 static BOOL set_boolean (BOOL * pb, const char *pszParmValue);
1385 static int getservicebyname (const char *pszServiceName, service * pserviceDest);
1386 static void copy_service (service * pserviceDest,
1387 service * pserviceSource, BOOL * pcopymapDest);
1388 static BOOL service_ok (int iService);
1389 static BOOL do_parameter (const char *pszParmName, const char *pszParmValue);
1390 static BOOL do_section (const char *pszSectionName);
1391 static void init_copymap (service * pservice);
1392
1393
1394
1395
1396
1397 static void init_service (service * pservice)
1398 {
1399 memset ((char *) pservice, '\0', sizeof (service));
1400 copy_service (pservice, &sDefault, NULL);
1401 }
1402
1403
1404
1405
1406
1407 static void
1408 free_service (service * pservice)
1409 {
1410 int i;
1411 if (!pservice)
1412 return;
1413
1414 if (pservice->szService)
1415 DEBUG (5, ("free_service: Freeing service %s\n", pservice->szService));
1416
1417 string_free (&pservice->szService);
1418 if (pservice->copymap)
1419 {
1420 free (pservice->copymap);
1421 pservice->copymap = NULL;
1422 }
1423
1424 for (i = 0; parm_table[i].label; i++)
1425 if ((parm_table[i].type == P_STRING ||
1426 parm_table[i].type == P_USTRING) && parm_table[i].class == P_LOCAL)
1427 string_free ((char **) (((char *) pservice) + PTR_DIFF (parm_table[i].ptr, &sDefault)));
1428 }
1429
1430
1431
1432
1433
1434 static int
1435 add_a_service (service * pservice, const char *name)
1436 {
1437 int i;
1438 service tservice;
1439 int num_to_alloc = iNumServices + 1;
1440
1441 tservice = *pservice;
1442
1443
1444 if (name)
1445 {
1446 i = getservicebyname (name, NULL);
1447 if (i >= 0)
1448 return (i);
1449 }
1450
1451
1452 for (i = 0; i < iNumServices; i++)
1453 if (!pSERVICE (i)->valid)
1454 break;
1455
1456
1457 if (i == iNumServices)
1458 {
1459 ServicePtrs = (service **) Realloc (ServicePtrs, sizeof (service *) * num_to_alloc);
1460 if (ServicePtrs)
1461 pSERVICE (iNumServices) = (service *) malloc (sizeof (service));
1462
1463 if (!ServicePtrs || !pSERVICE (iNumServices))
1464 return (-1);
1465
1466 iNumServices++;
1467 }
1468 else
1469 free_service (pSERVICE (i));
1470
1471 pSERVICE (i)->valid = True;
1472
1473 init_service (pSERVICE (i));
1474 copy_service (pSERVICE (i), &tservice, NULL);
1475 if (name)
1476 string_set (&iSERVICE (i).szService, name);
1477
1478 return (i);
1479 }
1480
1481
1482
1483
1484
1485 BOOL
1486 lp_add_home (const char *pszHomename, int iDefaultService, const char *pszHomedir)
1487 {
1488 int i = add_a_service (pSERVICE (iDefaultService), pszHomename);
1489
1490 if (i < 0)
1491 return (False);
1492
1493 if (!(*(iSERVICE (i).szPath)) || strequal (iSERVICE (i).szPath, lp_pathname (-1)))
1494 string_set (&iSERVICE (i).szPath, pszHomedir);
1495 if (!(*(iSERVICE (i).comment)))
1496 {
1497 pstring comment;
1498 slprintf (comment, sizeof (comment) - 1, "Home directory of %s", pszHomename);
1499 string_set (&iSERVICE (i).comment, comment);
1500 }
1501 iSERVICE (i).bAvailable = sDefault.bAvailable;
1502 iSERVICE (i).bBrowseable = sDefault.bBrowseable;
1503
1504 DEBUG (3, ("adding home directory %s at %s\n", pszHomename, pszHomedir));
1505
1506 return (True);
1507 }
1508
1509
1510
1511
1512 int
1513 lp_add_service (char *pszService, int iDefaultService)
1514 {
1515 return (add_a_service (pSERVICE (iDefaultService), pszService));
1516 }
1517
1518 #if 0
1519
1520
1521
1522 static BOOL
1523 lp_add_ipc (void)
1524 {
1525 pstring comment;
1526 int i = add_a_service (&sDefault, "IPC$");
1527
1528 if (i < 0)
1529 return (False);
1530
1531 slprintf (comment, sizeof (comment) - 1, "IPC Service (%s)", Globals.szServerString);
1532
1533 string_set (&iSERVICE (i).szPath, tmpdir ());
1534 string_set (&iSERVICE (i).szUsername, "");
1535 string_set (&iSERVICE (i).comment, comment);
1536 string_set (&iSERVICE (i).fstype, "IPC");
1537 iSERVICE (i).status = False;
1538 iSERVICE (i).iMaxConnections = 0;
1539 iSERVICE (i).bAvailable = True;
1540 iSERVICE (i).bRead_only = True;
1541 iSERVICE (i).bGuest_only = False;
1542 iSERVICE (i).bGuest_ok = True;
1543 iSERVICE (i).bPrint_ok = False;
1544 iSERVICE (i).bBrowseable = sDefault.bBrowseable;
1545
1546 DEBUG (3, ("adding IPC service\n"));
1547
1548 return (True);
1549 }
1550 #endif
1551
1552
1553
1554
1555 static int
1556 strwicmp (const char *psz1, const char *psz2)
1557 {
1558
1559
1560 if (psz1 == psz2)
1561 return (0);
1562 else if (psz1 == NULL)
1563 return (-1);
1564 else if (psz2 == NULL)
1565 return (1);
1566
1567
1568 while (1)
1569 {
1570 while (isspace ((unsigned char) *psz1))
1571 psz1++;
1572 while (isspace ((unsigned char) *psz2))
1573 psz2++;
1574 if (toupper ((unsigned char) *psz1) != toupper ((unsigned char) *psz2) || *psz1 == '\0'
1575 || *psz2 == '\0')
1576 break;
1577 psz1++;
1578 psz2++;
1579 }
1580 return (*psz1 - *psz2);
1581 }
1582
1583
1584
1585
1586
1587 static int
1588 map_parameter (const char *pszParmName)
1589 {
1590 int iIndex;
1591
1592 if (*pszParmName == '-')
1593 return (-1);
1594
1595 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
1596 if (strwicmp (parm_table[iIndex].label, pszParmName) == 0)
1597 return (iIndex);
1598
1599 DEBUG (0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
1600 return (-1);
1601 }
1602
1603
1604
1605
1606
1607
1608
1609 static BOOL
1610 set_boolean (BOOL * pb, const char *pszParmValue)
1611 {
1612 BOOL bRetval;
1613
1614 bRetval = True;
1615 if (strwicmp (pszParmValue, "yes") == 0 ||
1616 strwicmp (pszParmValue, "true") == 0 || strwicmp (pszParmValue, "1") == 0)
1617 *pb = True;
1618 else if (strwicmp (pszParmValue, "no") == 0 ||
1619 strwicmp (pszParmValue, "False") == 0 || strwicmp (pszParmValue, "0") == 0)
1620 *pb = False;
1621 else
1622 {
1623 DEBUG (0, ("ERROR: Badly formed boolean in configuration file: \"%s\".\n", pszParmValue));
1624 bRetval = False;
1625 }
1626 return (bRetval);
1627 }
1628
1629
1630
1631
1632 static int
1633 getservicebyname (const char *pszServiceName, service * pserviceDest)
1634 {
1635 int iService;
1636
1637 for (iService = iNumServices - 1; iService >= 0; iService--)
1638 if (VALID (iService) && strwicmp (iSERVICE (iService).szService, pszServiceName) == 0)
1639 {
1640 if (pserviceDest != NULL)
1641 copy_service (pserviceDest, pSERVICE (iService), NULL);
1642 break;
1643 }
1644
1645 return (iService);
1646 }
1647
1648
1649
1650
1651
1652
1653
1654
1655 static void
1656 copy_service (service * pserviceDest, service * pserviceSource, BOOL * pcopymapDest)
1657 {
1658 int i;
1659 BOOL bcopyall = (pcopymapDest == NULL);
1660
1661 for (i = 0; parm_table[i].label; i++)
1662 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL && (bcopyall || pcopymapDest[i]))
1663 {
1664 void *def_ptr = parm_table[i].ptr;
1665 void *src_ptr = ((char *) pserviceSource) + PTR_DIFF (def_ptr, &sDefault);
1666 void *dest_ptr = ((char *) pserviceDest) + PTR_DIFF (def_ptr, &sDefault);
1667
1668 switch (parm_table[i].type)
1669 {
1670 case P_BOOL:
1671 case P_BOOLREV:
1672 *(BOOL *) dest_ptr = *(BOOL *) src_ptr;
1673 break;
1674
1675 case P_INTEGER:
1676 case P_ENUM:
1677 case P_OCTAL:
1678 *(int *) dest_ptr = *(int *) src_ptr;
1679 break;
1680
1681 case P_CHAR:
1682 *(char *) dest_ptr = *(char *) src_ptr;
1683 break;
1684
1685 case P_STRING:
1686 string_set (dest_ptr, *(char **) src_ptr);
1687 break;
1688
1689 case P_USTRING:
1690 string_set (dest_ptr, *(char **) src_ptr);
1691 strupper (*(char **) dest_ptr);
1692 break;
1693 default:
1694 break;
1695 }
1696 }
1697
1698 if (bcopyall)
1699 {
1700 init_copymap (pserviceDest);
1701 if (pserviceSource->copymap)
1702 memcpy ((void *) pserviceDest->copymap,
1703 (void *) pserviceSource->copymap, sizeof (BOOL) * NUMPARAMETERS);
1704 }
1705 }
1706
1707
1708
1709
1710
1711 static BOOL
1712 service_ok (int iService)
1713 {
1714 BOOL bRetval;
1715
1716 bRetval = True;
1717 if (iSERVICE (iService).szService[0] == '\0')
1718 {
1719 DEBUG (0, ("The following message indicates an internal error:\n"));
1720 DEBUG (0, ("No service name in service entry.\n"));
1721 bRetval = False;
1722 }
1723
1724
1725
1726 if (strwicmp (iSERVICE (iService).szService, PRINTERS_NAME) == 0)
1727 if (!iSERVICE (iService).bPrint_ok)
1728 {
1729 DEBUG (0, ("WARNING: [%s] service MUST be printable!\n",
1730 iSERVICE (iService).szService));
1731 iSERVICE (iService).bPrint_ok = True;
1732 }
1733
1734 if (iSERVICE (iService).szPath[0] == '\0' &&
1735 strwicmp (iSERVICE (iService).szService, HOMES_NAME) != 0)
1736 {
1737 DEBUG (0, ("No path in service %s - using %s\n", iSERVICE (iService).szService, tmpdir ()));
1738 string_set (&iSERVICE (iService).szPath, tmpdir ());
1739 }
1740
1741
1742 if (!iSERVICE (iService).bAvailable)
1743 DEBUG (1, ("NOTE: Service %s is flagged unavailable.\n", iSERVICE (iService).szService));
1744
1745 return (bRetval);
1746 }
1747
1748 #if 0
1749 static struct file_lists
1750 {
1751 struct file_lists *next;
1752 char *name;
1753 time_t modtime;
1754 } *file_lists = NULL;
1755
1756
1757
1758
1759
1760 static void
1761 add_to_file_list (const char *fname)
1762 {
1763 struct file_lists *f = file_lists;
1764
1765 while (f)
1766 {
1767 if (f->name && !strcmp (f->name, fname))
1768 break;
1769 f = f->next;
1770 }
1771
1772 if (!f)
1773 {
1774 f = (struct file_lists *) malloc (sizeof (file_lists[0]));
1775 if (!f)
1776 return;
1777 f->next = file_lists;
1778 f->name = strdup (fname);
1779 if (!f->name)
1780 {
1781 free (f);
1782 return;
1783 }
1784 file_lists = f;
1785 }
1786
1787 {
1788 pstring n2;
1789 pstrcpy (n2, fname);
1790 standard_sub_basic (n2);
1791 f->modtime = file_modtime (n2);
1792 }
1793
1794 }
1795
1796
1797
1798
1799
1800 BOOL
1801 lp_file_list_changed (void)
1802 {
1803 struct file_lists *f = file_lists;
1804 DEBUG (6, ("lp_file_list_changed()\n"));
1805
1806 while (f)
1807 {
1808 pstring n2;
1809 time_t mod_time;
1810
1811 pstrcpy (n2, f->name);
1812 standard_sub_basic (n2);
1813
1814 DEBUGADD (6, ("file %s -> %s last mod_time: %s\n", f->name, n2, ctime (&f->modtime)));
1815
1816 mod_time = file_modtime (n2);
1817
1818 if (f->modtime != mod_time)
1819 {
1820 DEBUGADD (6, ("file %s modified: %s\n", n2, ctime (&mod_time)));
1821 f->modtime = mod_time;
1822 return (True);
1823 }
1824 f = f->next;
1825 }
1826 return (False);
1827 }
1828 #else
1829 #define add_to_file_list(x)
1830 #endif
1831
1832
1833
1834
1835 static BOOL
1836 handle_coding_system (const char *pszParmValue, char **ptr)
1837 {
1838 string_set (ptr, pszParmValue);
1839 interpret_coding_system (pszParmValue);
1840 return (True);
1841 }
1842
1843
1844
1845
1846 static BOOL
1847 handle_character_set (const char *pszParmValue, char **ptr)
1848 {
1849 string_set (ptr, pszParmValue);
1850 interpret_character_set (pszParmValue);
1851 return (True);
1852 }
1853
1854
1855
1856
1857
1858 static BOOL
1859 handle_valid_chars (const char *pszParmValue, char **ptr)
1860 {
1861 string_set (ptr, pszParmValue);
1862
1863
1864
1865
1866
1867 codepage_initialise (lp_client_code_page ());
1868
1869 add_char_string (pszParmValue);
1870 return (True);
1871 }
1872
1873
1874
1875
1876
1877 static BOOL
1878 handle_include (const char *pszParmValue, char **ptr)
1879 {
1880 pstring fname;
1881 pstrcpy (fname, pszParmValue);
1882
1883 add_to_file_list (fname);
1884
1885 standard_sub_basic (fname);
1886
1887 string_set (ptr, fname);
1888
1889 if (file_exist (fname, NULL))
1890 return (pm_process (fname, do_section, do_parameter));
1891
1892 DEBUG (2, ("Cannot find include file %s\n", fname));
1893
1894 return (False);
1895 }
1896
1897
1898
1899
1900
1901 static BOOL
1902 handle_copy (const char *pszParmValue, char **ptr)
1903 {
1904 BOOL bRetval;
1905 int iTemp;
1906 service serviceTemp;
1907
1908 string_set (ptr, pszParmValue);
1909
1910 init_service (&serviceTemp);
1911
1912 bRetval = False;
1913
1914 DEBUG (3, ("Copying service from service %s\n", pszParmValue));
1915
1916 if ((iTemp = getservicebyname (pszParmValue, &serviceTemp)) >= 0)
1917 {
1918 if (iTemp == iServiceIndex)
1919 {
1920 DEBUG (0, ("Cannot copy service %s - unable to copy self!\n", pszParmValue));
1921 }
1922 else
1923 {
1924 copy_service (pSERVICE (iServiceIndex), &serviceTemp, iSERVICE (iServiceIndex).copymap);
1925 bRetval = True;
1926 }
1927 }
1928 else
1929 {
1930 DEBUG (0, ("Unable to copy service - source not found: %s\n", pszParmValue));
1931 bRetval = False;
1932 }
1933
1934 free_service (&serviceTemp);
1935 return (bRetval);
1936 }
1937
1938
1939
1940
1941
1942 static void
1943 init_copymap (service * pservice)
1944 {
1945 size_t i;
1946 if (pservice->copymap)
1947 free (pservice->copymap);
1948 pservice->copymap = (BOOL *) malloc (sizeof (BOOL) * NUMPARAMETERS);
1949 if (!pservice->copymap)
1950 DEBUG (0, ("Couldn't allocate copymap!! (size %d)\n", (int) NUMPARAMETERS));
1951 else
1952 for (i = 0; i < NUMPARAMETERS; i++)
1953 pservice->copymap[i] = True;
1954 }
1955
1956 #if 0
1957
1958
1959
1960
1961 void *
1962 lp_local_ptr (int snum, void *ptr)
1963 {
1964 return (void *) (((char *) pSERVICE (snum)) + PTR_DIFF (ptr, &sDefault));
1965 }
1966 #endif
1967
1968
1969
1970
1971
1972 BOOL
1973 lp_do_parameter (int snum, const char *pszParmName, const char *pszParmValue)
1974 {
1975 int parmnum, i;
1976 void *parm_ptr = NULL;
1977 void *def_ptr = NULL;
1978
1979 parmnum = map_parameter (pszParmName);
1980
1981 if (parmnum < 0)
1982 {
1983 DEBUG (0, ("Ignoring unknown parameter \"%s\"\n", pszParmName));
1984 return (True);
1985 }
1986
1987 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
1988 {
1989 DEBUG (1, ("WARNING: The \"%s\"option is deprecated\n", pszParmName));
1990 }
1991
1992 def_ptr = parm_table[parmnum].ptr;
1993
1994
1995 if (snum < 0)
1996 {
1997 parm_ptr = def_ptr;
1998 }
1999 else
2000 {
2001 if (parm_table[parmnum].class == P_GLOBAL)
2002 {
2003 DEBUG (0, ("Global parameter %s found in service section!\n", pszParmName));
2004 return (True);
2005 }
2006 parm_ptr = ((char *) pSERVICE (snum)) + PTR_DIFF (def_ptr, &sDefault);
2007 }
2008
2009 if (snum >= 0)
2010 {
2011 if (!iSERVICE (snum).copymap)
2012 init_copymap (pSERVICE (snum));
2013
2014
2015
2016 for (i = 0; parm_table[i].label; i++)
2017 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2018 iSERVICE (snum).copymap[i] = False;
2019 }
2020
2021
2022 if (parm_table[parmnum].special)
2023 {
2024 parm_table[parmnum].special (pszParmValue, (char **) parm_ptr);
2025 return (True);
2026 }
2027
2028
2029 switch (parm_table[parmnum].type)
2030 {
2031 case P_BOOL:
2032 set_boolean (parm_ptr, pszParmValue);
2033 break;
2034
2035 case P_BOOLREV:
2036 set_boolean (parm_ptr, pszParmValue);
2037 *(BOOL *) parm_ptr = !*(BOOL *) parm_ptr;
2038 break;
2039
2040 case P_INTEGER:
2041 *(int *) parm_ptr = atoi (pszParmValue);
2042 break;
2043
2044 case P_CHAR:
2045 *(char *) parm_ptr = *pszParmValue;
2046 break;
2047
2048 case P_OCTAL:
2049 sscanf (pszParmValue, "%o", (int *) parm_ptr);
2050 break;
2051
2052 case P_STRING:
2053 string_set (parm_ptr, pszParmValue);
2054 break;
2055
2056 case P_USTRING:
2057 string_set (parm_ptr, pszParmValue);
2058 strupper (*(char **) parm_ptr);
2059 break;
2060
2061 case P_GSTRING:
2062 pstrcpy ((char *) parm_ptr, pszParmValue);
2063 break;
2064
2065 case P_UGSTRING:
2066 pstrcpy ((char *) parm_ptr, pszParmValue);
2067 strupper ((char *) parm_ptr);
2068 break;
2069
2070 case P_ENUM:
2071 for (i = 0; parm_table[parmnum].enum_list[i].name; i++)
2072 {
2073 if (strequal (pszParmValue, parm_table[parmnum].enum_list[i].name))
2074 {
2075 *(int *) parm_ptr = parm_table[parmnum].enum_list[i].value;
2076 break;
2077 }
2078 }
2079 break;
2080 case P_SEP:
2081 break;
2082 }
2083
2084 return (True);
2085 }
2086
2087
2088
2089
2090 static BOOL
2091 do_parameter (const char *pszParmName, const char *pszParmValue)
2092 {
2093 if (!bInGlobalSection && bGlobalOnly)
2094 return (True);
2095
2096 DEBUGADD (3, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2097
2098 return (lp_do_parameter (bInGlobalSection ? -2 : iServiceIndex, pszParmName, pszParmValue));
2099 }
2100
2101 #if 0
2102
2103
2104
2105 static BOOL
2106 equal_parameter (parm_type type, void *ptr1, void *ptr2)
2107 {
2108 switch (type)
2109 {
2110 case P_BOOL:
2111 case P_BOOLREV:
2112 return (*((BOOL *) ptr1) == *((BOOL *) ptr2));
2113
2114 case P_INTEGER:
2115 case P_ENUM:
2116 case P_OCTAL:
2117 return (*((int *) ptr1) == *((int *) ptr2));
2118
2119 case P_CHAR:
2120 return (*((char *) ptr1) == *((char *) ptr2));
2121
2122 case P_GSTRING:
2123 case P_UGSTRING:
2124 {
2125 char *p1 = (char *) ptr1, *p2 = (char *) ptr2;
2126 if (p1 && !*p1)
2127 p1 = NULL;
2128 if (p2 && !*p2)
2129 p2 = NULL;
2130 return (p1 == p2 || strequal (p1, p2));
2131 }
2132 case P_STRING:
2133 case P_USTRING:
2134 {
2135 char *p1 = *(char **) ptr1, *p2 = *(char **) ptr2;
2136 if (p1 && !*p1)
2137 p1 = NULL;
2138 if (p2 && !*p2)
2139 p2 = NULL;
2140 return (p1 == p2 || strequal (p1, p2));
2141 }
2142 case P_SEP:
2143 break;
2144 }
2145 return (False);
2146 }
2147 #endif
2148
2149
2150
2151
2152
2153
2154 static BOOL
2155 do_section (const char *pszSectionName)
2156 {
2157 BOOL bRetval;
2158 BOOL isglobal = ((strwicmp (pszSectionName, GLOBAL_NAME) == 0) ||
2159 (strwicmp (pszSectionName, GLOBAL_NAME2) == 0));
2160 bRetval = False;
2161
2162
2163 if (bInGlobalSection && !isglobal)
2164 {
2165 init_locals ();
2166 }
2167
2168
2169 bInGlobalSection = isglobal;
2170
2171
2172 if (bInGlobalSection)
2173 {
2174 DEBUG (3, ("Processing section \"[%s]\"\n", pszSectionName));
2175 return (True);
2176 }
2177
2178 if (!bInGlobalSection && bGlobalOnly)
2179 return (True);
2180
2181
2182 bRetval = True;
2183
2184 if (iServiceIndex >= 0)
2185 bRetval = service_ok (iServiceIndex);
2186
2187
2188 if (bRetval)
2189 {
2190
2191
2192 DEBUG (2, ("Processing section \"[%s]\"\n", pszSectionName));
2193
2194 if ((iServiceIndex = add_a_service (&sDefault, pszSectionName)) < 0)
2195 {
2196 DEBUG (0, ("Failed to add a new service\n"));
2197 return (False);
2198 }
2199 }
2200
2201 return (bRetval);
2202 }
2203
2204 #if 0
2205
2206
2207
2208 BOOL
2209 lp_is_default (int snum, struct parm_struct * parm)
2210 {
2211 int pdiff = PTR_DIFF (parm->ptr, &sDefault);
2212
2213 return equal_parameter (parm->type,
2214 ((char *) pSERVICE (snum)) + pdiff, ((char *) &sDefault) + pdiff);
2215 }
2216 #endif
2217 #if 0
2218
2219
2220
2221
2222
2223 struct parm_struct *
2224 lp_next_parameter (int snum, int *i, int allparameters)
2225 {
2226 if (snum == -1)
2227 {
2228
2229 for (; parm_table[*i].label; (*i)++)
2230 {
2231 if (parm_table[*i].class == P_SEPARATOR)
2232 return &parm_table[(*i)++];
2233
2234 if (!parm_table[*i].ptr || (*parm_table[*i].label == '-'))
2235 continue;
2236
2237 if ((*i) > 0 && (parm_table[*i].ptr == parm_table[(*i) - 1].ptr))
2238 continue;
2239
2240 return &parm_table[(*i)++];
2241 }
2242 }
2243 else
2244 {
2245 service *pService = pSERVICE (snum);
2246
2247 for (; parm_table[*i].label; (*i)++)
2248 {
2249 if (parm_table[*i].class == P_SEPARATOR)
2250 return &parm_table[(*i)++];
2251
2252 if (parm_table[*i].class == P_LOCAL &&
2253 parm_table[*i].ptr &&
2254 (*parm_table[*i].label != '-') &&
2255 ((*i) == 0 || (parm_table[*i].ptr != parm_table[(*i) - 1].ptr)))
2256 {
2257 int pdiff = PTR_DIFF (parm_table[*i].ptr, &sDefault);
2258
2259 if (allparameters ||
2260 !equal_parameter (parm_table[*i].type,
2261 ((char *) pService) + pdiff, ((char *) &sDefault) + pdiff))
2262 {
2263 return &parm_table[(*i)++];
2264 }
2265 }
2266 }
2267 }
2268
2269 return NULL;
2270 }
2271 #endif
2272 #if 0
2273
2274
2275
2276 BOOL
2277 lp_snum_ok (int iService)
2278 {
2279 return (LP_SNUM_OK (iService) && iSERVICE (iService).bAvailable);
2280 }
2281 #endif
2282
2283
2284
2285
2286 static void
2287 lp_add_auto_services (char *str)
2288 {
2289 char *s;
2290 char *p;
2291 int homes;
2292
2293 if (!str)
2294 return;
2295
2296 s = strdup (str);
2297 if (!s)
2298 return;
2299
2300 homes = lp_servicenumber (HOMES_NAME);
2301
2302 for (p = strtok (s, LIST_SEP); p; p = strtok (NULL, LIST_SEP))
2303 {
2304 const char *home = get_home_dir (p);
2305
2306 if (lp_servicenumber (p) >= 0)
2307 continue;
2308
2309 if (home && homes >= 0)
2310 {
2311 lp_add_home (p, homes, home);
2312 }
2313 }
2314 free (s);
2315 }
2316
2317
2318
2319
2320
2321 BOOL
2322 lp_loaded (void)
2323 {
2324 return (bLoaded);
2325 }
2326
2327 #if 0
2328
2329
2330
2331 void
2332 lp_killunused (BOOL (*snumused) (int))
2333 {
2334 int i;
2335 for (i = 0; i < iNumServices; i++)
2336 if (VALID (i) && (!snumused || !snumused (i)))
2337 {
2338 iSERVICE (i).valid = False;
2339 free_service (pSERVICE (i));
2340 }
2341 }
2342 #endif
2343 #if 0
2344
2345
2346
2347
2348
2349 static void
2350 lp_save_defaults (void)
2351 {
2352 static BOOL defaults_saved = False;
2353 int i;
2354
2355 for (i = 0; parm_table[i].label; i++)
2356 {
2357 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
2358 continue;
2359 switch (parm_table[i].type)
2360 {
2361 case P_STRING:
2362 case P_USTRING:
2363 parm_table[i].def.svalue = strdup (*(char **) parm_table[i].ptr);
2364 break;
2365 case P_GSTRING:
2366 case P_UGSTRING:
2367 parm_table[i].def.svalue = strdup ((char *) parm_table[i].ptr);
2368 break;
2369 case P_BOOL:
2370 case P_BOOLREV:
2371 parm_table[i].def.bvalue = *(BOOL *) parm_table[i].ptr;
2372 break;
2373 case P_CHAR:
2374 parm_table[i].def.cvalue = *(char *) parm_table[i].ptr;
2375 break;
2376 case P_INTEGER:
2377 case P_OCTAL:
2378 case P_ENUM:
2379 parm_table[i].def.ivalue = *(int *) parm_table[i].ptr;
2380 break;
2381 case P_SEP:
2382 break;
2383 }
2384 }
2385 defaults_saved = True;
2386 }
2387 #endif
2388
2389
2390
2391
2392
2393 BOOL
2394 lp_load (const char *pszFname, BOOL global_only, BOOL save_defaults, BOOL add_ipc)
2395 {
2396 pstring n2;
2397 BOOL bRetval;
2398
2399 add_to_file_list (pszFname);
2400
2401 bRetval = False;
2402
2403 bInGlobalSection = True;
2404 bGlobalOnly = global_only;
2405
2406 init_globals ();
2407 #if 0
2408 if (save_defaults)
2409 {
2410 init_locals ();
2411 lp_save_defaults ();
2412 }
2413 #else
2414 (void) &save_defaults;
2415 #endif
2416 pstrcpy (n2, pszFname);
2417 standard_sub_basic (n2);
2418
2419
2420 iServiceIndex = -1;
2421 bRetval = pm_process (n2, do_section, do_parameter);
2422
2423
2424 DEBUG (3, ("pm_process() returned %s\n", BOOLSTR (bRetval)));
2425 if (bRetval)
2426 if (iServiceIndex >= 0)
2427 bRetval = service_ok (iServiceIndex);
2428
2429 lp_add_auto_services (lp_auto_services ());
2430 #if 0
2431 if (add_ipc)
2432 lp_add_ipc ();
2433 set_default_server_announce_type ();
2434 #else
2435 (void) &add_ipc;
2436 #endif
2437
2438 bLoaded = True;
2439
2440
2441
2442
2443 if (in_client && Globals.bWINSsupport)
2444 {
2445
2446 string_set (&Globals.szWINSserver, "127.0.0.1");
2447
2448 }
2449
2450 return (bRetval);
2451 }
2452
2453 #if 0
2454
2455
2456
2457 void
2458 lp_resetnumservices (void)
2459 {
2460 iNumServices = 0;
2461 }
2462
2463
2464
2465
2466
2467 int
2468 lp_numservices (void)
2469 {
2470 return (iNumServices);
2471 }
2472 #endif
2473
2474
2475
2476
2477
2478
2479
2480 int
2481 lp_servicenumber (const char *pszServiceName)
2482 {
2483 int iService;
2484
2485 for (iService = iNumServices - 1; iService >= 0; iService--)
2486 if (VALID (iService) && strequal (lp_servicename (iService), pszServiceName))
2487 break;
2488
2489 if (iService < 0)
2490 DEBUG (7, ("lp_servicenumber: couldn't find %s\n", pszServiceName));
2491
2492 return (iService);
2493 }
2494
2495 #if 0
2496
2497
2498
2499 char *
2500 volume_label (int snum)
2501 {
2502 char *ret = lp_volume (snum);
2503 if (!*ret)
2504 return (lp_servicename (snum));
2505 return (ret);
2506 }
2507
2508
2509
2510
2511
2512 void
2513 lp_set_name_resolve_order (char *new_order)
2514 {
2515 Globals.szNameResolveOrder = new_order;
2516 }
2517 #endif